VBA-makro, kako spremeniti vnos iz Midva sva. -> Mi2 sva.

Pomoč pri izdelavi makrov
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

VBA-makro, kako spremeniti vnos iz Midva sva. -> Mi2 sva.

Odgovor Napisal/-a missy »

Ponovno se obračam po pomoč in sicer naslednje naloge ne morem nikakor rešiti! Problem pa je naslednji

vnesli naj bi npr: Midva sva pisati trigonometrijo!
to bi se moralo spremeniti v Mi2 sva šla pisati 3gonome3jo!

Ugotoviti znam samo na katerem mestu se nahaja npr "dva", nikakor pa mi ne uspe zamenjava!

Startala sem z malo lažjo nalogo in sicer da poskusim zamenjavo samo ene besede se pravi npr dva v 2 pa mi nito to ne uspe!

Tako da sem po celem dnevu že malo obupala! Prosila bi vas za pomoč!!



Sub spremeni()

Dim beseda As String
Dim tabela As Variant
Dim tabela1 As Variant
Dim i As Integer
Dim nova As String

tabela = Array("ena", "dva", "tri", "štiri", "pet", "šest", "sedem", "osem", "devet", "nič")
tabela1 = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")

beseda = InputBox("Vnesite besede za pretvorbo!")

For i = 0 To 9
nova = InStr(beseda, CStr(tabela(i)))
MsgBox nova
Next


End Sub


Hvala.
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

Sub spremeni()

Dim beseda As String
Dim tabela As Variant
Dim tabela1 As Variant
Dim i As Integer
Dim nova As String

tabela = Array("ena", "dva", "tri", "štiri", "pet", "šest", "sedem", "osem", "devet", "nič")
tabela1 = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")

beseda = InputBox("Vnesite besede za pretvorbo!")

For i = 0 To 9
nova = InStr(beseda, CStr(tabela(i)))
If nova <> 0 Then
tabela(i) = tabela1(i)
MsgBox tabela1(i)
End If
Next

End Sub


No tole mi je še uspelo končo pogruntati!!

Sedaj mi dela če napišem dva izpiše mi pa pol 2!!
Še vedno pa nisem rešila problema kako naj mi izpiše Mi2!!


Morda kak predlog!

Lp, missy
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Pozdravljeni,

Lepo, da se trudite in tudi bolje je tako, kot da vam kar jaz napišem končno rešitev. zatorej trije napotki:
  1. Programsko kodo pišite z zamiki, kajti sicer je dokaj neberljiva (spodaj poglejte kako bi moral izgledati vaša koda)
  2. Ukaz InStr vam bo samo povedal, kje v nizu se nahaja nek iskan niz
  3. Zamenjavo pa bo izvedel ukaz Replace, npr

    Koda: Izberi vse

    replace("midva vadiva trigonometrijo", "dva", "2")
    Poglejte si torej ukaz Replace, ki je ključ do rešitve... :)
  4. Ko boste imeli že delujočo rešitev, pa se poskusite znebiti še spremenljivke tabela1, saj je ne potrebujete :wink:
Takole pa bi morala izgledati vaša koda:

Koda: Izberi vse

Sub spremeni()
  Dim beseda As String
  Dim tabela As Variant
  Dim tabela1 As Variant
  Dim i As Integer
  Dim nova As String

  tabela = Array("ena", "dva", "tri", "štiri", "pet", "šest", "sedem", "osem", "devet", "nič")
  tabela1 = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")

  beseda = InputBox("Vnesite besede za pretvorbo!")

  For i = 0 To 9
    nova = InStr(beseda, CStr(tabela(i)))
    If nova <> 0 Then
      tabela(i) = tabela1(i)
      MsgBox tabela1(i)
    End If
  Next
End Sub
lp,
Matjaž Prtenjak
Administrator
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

Pozdravljeni,

hvala za vaše nasvete, žal nisem vidla, da mi je kodo tko spacalo, ker sem kar prilepila iz vba-bom bolj pozorna!! No tole mi je uspelo narediti in upam, da sem na dobri poti! Hja ostaja mi še vaš predlog, da ne potrebujem tabele1, bom poslusila še to in vam sporočim kako mi bo uspelo!

Moram se vam zahvalit za vso pomoč in nasvete, ker mi to zelo pomaga in mi daje moč da nadaljujem-HVALA!

Koda: Izberi vse

Sub spremeni()

Dim beseda As String
Dim tabela As Variant
Dim tabela1 As Variant
Dim i As Integer
Dim nova As String

tabela = Array("ena", "dva", "tri", "štiri", "pet", "šest", "sedem", "osem", "devet", "nič")
tabela1 = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")

beseda = InputBox("Vnesite besede za pretvorbo!")

For i = 0 To 9
    nova = InStr(beseda, CStr(tabela(i)))
        If nova <> 0 Then
            nova = Replace(beseda, tabela(i), tabela1(i))
            beseda = nova
        End If
Next
MsgBox beseda
End Sub
Lp, Missy.
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

Nekako mi je uspelo rešiti to brez tabele1, sam problem nastane ko pridem do nič ko izpiše 10 namesto 0, kar je seveda logično, če i povečujem za ena!

Koda: Izberi vse

For i = 0 To 9
    nova = InStr(beseda, CStr(tabela(i)))
        If nova <> 0 Then
            nova = Replace(beseda, tabela(i), i + 1)
            beseda = nova
        End If
Next
MsgBox beseda
To moram še rešiti čeprav se mi še ne sanja! Kak namig bi bil dobrodošel!

Lp, Missy.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Kdo pa je rekel, da mora biti 0 na koncu??? :)
lp,
Matjaž Prtenjak
Administrator
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

Ja če vpiseš nic ti mora napisati 0 ne pa 10!

Aha že razumem!

Lp.
Zadnjič spremenil missy, dne Če Maj 18, 2006 9:09 pm, skupaj popravljeno 1 krat.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

To že; toda zakaj ste vi 0 postavili na konec :wink:
lp,
Matjaž Prtenjak
Administrator
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

Istočasno! Ja sem šele potem, ko sem že napisala razumela kaj mi hočete povedati!

Na to nism niti pomislila!!

Lp
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

Ponovno pozdravljeni!

Mam vprašanje, ki je povezano s to nalogo, ki sva jo s skupnimi močmi rešila!

In sicer poskušam spremeniti nalogo tako, da bi delovala obratno, vendar imam problem, ker če je sama števila mi je ne sme spremeniti!!!

primer: S5 je 5ek 13. -> Spet je petek 13.

Koda: Izberi vse

Sub zamenjajbrezstevil()

Dim novo As String
Dim besedilo As String
Dim tabela As Variant

tabela = Array("nič", "ena", "dva", "tri", "štiri", "pet", "šest", "sedem", "osem", "devet")
tabela1 = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")

besedilo = InputBox("Vnesi stavek za pretvorbo!")

For i = 0 To 9
    nasel = InStr(besedilo, CStr(tabela1(i)))
        If nasel <> 0 Then
            novo = Replace(besedilo, CStr(tabela1(i)), tabela(i))
        End If
  
Next
MsgBox novo


End Sub
Lahko mi tudi samo namignete kako naj se tega problema lotim!

Hvala, missy.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Pozdravljeni,

1.
:):) Ker imate napako v kodi, vam podani primer (S5 je 5ek 13) reši povsem pravilno. Razlo je v tem, da najprej zamenja enico in to zapiše v spremenljivko nova in ko zamenja trojko spet vzame originalni niz. Torej da se vsaj pribljižava končni rešitvi, najprej popraviva vašo kodo tako, da bo pravilno delal napačno :):) Reči želim, da vaša koda sploh ne zamenja vseh številk, temveč le največjo vse ostale spremembe so izgubljene. Torej pravilna koda, ki dela napačno :) je takšnale:

Koda: Izberi vse

Sub zamenjajbrezstevil()
  Dim besedilo As String
  Dim tabela As Variant

  tabela = Array("nič", "ena", "dva", "tri", "štiri", "pet", "šest", "sedem", "osem", "devet")
  tabela1 = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
  
  besedilo = InputBox("Vnesi stavek za pretvorbo!")
  
  For i = 0 To 9
      nasel = InStr(besedilo, CStr(tabela1(i)))
      If nasel <> 0 Then
          besedilo = Replace(besedilo, CStr(tabela1(i)), tabela(i))
      End If
  Next
  MsgBox besedilo
End Sub
2.
Ok, sedaj pa k vašemu problemu, ki pa ni tako trivialen, kot se vam zdi na prvi pogled. Poglejte vi preprosto rečete: "V nizu mi zamenjaj vse 0 z nič"... To ni prava pot do rešitve, saj ne veste ali se kakšna ničla ne nahaja v številki, ki pa je ne smete pretvoriti.

Algoritem, ki bo rešil vaš problem je sledeč:
  1. Niz razbij na posamezne besede.
  2. Vzami prvo besedo
  3. Če je beseda številka potem jo kar dopiši v končni rezultat
  4. Sicer besedo pretvori in jo zapiši v končni rezultat
  5. Če si prišel do konca niza, potem nehaj, sicer vzami nsalednjo besedo in pojdi na korak 3.
Tako ta algoritem reši vaš problem. Potrebno ga je samo še pretvoriti v VBA kodo... Boste poskusili?
lp,
Matjaž Prtenjak
Administrator
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

Pozdravljeni,

hvala za tako hiter odgovor!

Tko nekako sem tudi jaz razmišljala, vendar ne vem s kakšno funkcijo naj razbijem ta niz na posamezne dele!!

Tako, da bi mi zelo prav prišlo ime funkcije v vba, seveda če spoloh obstaja!!

Lp, missy.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Pozdravljeni,

če uporabljate najnovejšo pisarno (Office 97) potem imate na voljo funkcijo Split, ki vam aredi to kar želite. Če pa imate starejšo različico pa lahko uporabite funkcijo, ki vam jo prilagam spodaj:

Koda: Izberi vse

'Avtor: Matjaž Prtenjak
'Junij 2002
Function mSplit(text As String, meja As String) As Variant
    Dim rezultat() As Variant
    Dim stevec As Integer
    Dim pozicija As Integer
    Dim dolzina As String
    Dim tmp As String
    
    tmp = text
    stevec = 0
    pozicija = 0
    dolzina = Len(meja)
    Do
        ReDim Preserve rezultat(stevec)
        pozicija = InStr(tmp, meja)
        rezultat(stevec) = Left$(tmp, pozicija - 1)
        stevec = stevec + 1
        tmp = Mid$(tmp, pozicija + dolzina)
    Loop While InStr(pozicija, tmp, meja) > 0
    
    ReDim Preserve rezultat(stevec)
    rezultat(stevec) = tmp
    mSplit = rezultat()
End Function
Uporaba funkcije je preprosta, prvi paremeter je niz, ki ga želite razbiti, drugi parameter pa je ločilo, ki loči posamezne dele, v vašem primeru je to presledek. Primeri uporabe:

Koda: Izberi vse

' razbije na posamezne besede
rezultat = msplit(MojNizZnakov, " ")

' če bi imeli npr. podatke ločene zpodpičjem
rezultat = msplit(MojNizZnakov, ";")
lp,
Matjaž Prtenjak
Administrator
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

Pozdravljeni,

najprej hvala za ime funkcije, ki sem jo rabila! Tko poskušala sem rešiti, vendar imam še vedno en problem, ker ne vem kako naj zapišem število k končnemu razultatu! Kar sem poskusila mi ni delovalo!

Moja koda je sledeča:

Koda: Izberi vse

Sub zamenjajbrezstevil()

Dim nasel As Variant
Dim besedilo As String
Dim tabela As Variant

tabela = Array("nič", "ena", "dva", "tri", "štiri", "pet", "šest", "sedem", "osem", "devet")
tabela1 = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")

besedilo = InputBox("Vnesi stavek za pretvorbo!")
For i = 0 To 9
nasel = Split(besedilo, " ")
        If IsNumeric(nasel) Then
            besedilo = besedilo & __________
        Else
            besedilo = Replace(besedilo, CStr(tabela1(i)), CStr(tabela(i)))
        End If
Next
MsgBox besedilo


End Sub

Tam kjer sem naredila črto, ne vem kaj naj pripišem, ker če napišem kar "& nasel " ne dela! Če bi se v spr našel zapisala prva beseda niza pol bi to še šlo, tko pa ker vrne neničelno enodimenzionalno tabelo s številko podniza! Tukaj se mi je nekako ustavilo in bi rabila pomoč, da se rešim!!

Hvala pa lep dan, missy.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Pozdravljeni,

Za rešitev bo potrebno program drugače zastaviti. vaša funkcija zna sedaj v nekem nizu zamenjati vse cifre z besedami - to bo torej podfunkcija. Glavna funkcija pa bo stavek razbila na besede in za vsako besedo poklicala funkcijo za pretvorbo. Prilagam vam algoritem v psevdokodi:

Koda: Izberi vse

razbij stavek na besede
NovStavek = ""
za vsako besedo
  če je beseda cifra
    NovStavek = NovStavek + beseda  ' tu nič ne pretvarjamo
  sicer
    NovStavke = NovStavek + Pretvori(beseda) ' tu kličemo funkcijo za pretvorbo
ponavljaj
Izpisi NovStavek
No poskusite s tem algoritmom. Kot boste videli v nadaljevanju a vas bodo zjebavala še ločila v stavkih :)
lp,
Matjaž Prtenjak
Administrator
Odgovori