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

Odgovor Napisal/-a missy »

Pozdravljeni,

spodaj sem prilepila kodo, vendar ne morem pogruntati zakaj mi ne dela!

Tko, da bi prosila, če mi pogledate kje imam napako!

Koda: Izberi vse

Function moderno(ByVal beseda As String) As String

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

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

Sub zamenjajbrezstevil()

Dim besedilo As String
Dim beseda As Variant
Dim novstavek As String

besedilo = InputBox("Vnesi stavek za pretvorbo!")
novstavek = ""
For i = 0 To 9
beseda = Split(besedilo, " ")
        If IsNumeric(beseda) Then
            novstavek = novstavek + beseda
        Else
            novstavek = novstavek + moderno(CStr(beseda))
        End If
Next
MsgBox novstavek

End Sub
Pa še to me zanima kako vem kdaj rabim prenos po referenci in kdaj po vrednosti!? Sem si prebrala v vaši knjigi in se mi ni zdelo tako težko, vendar pa sem ugotovila, da mi to ne gre od rok!

V tem primeru sem v funkciji napisala prenos po vrednosti ker me je na to vba opozorill, drugače pa ne vem če bi!

Hvala za vaše potrplenje z menoj ter za vso pomoč!

Želim vam še naprej lep dan!

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

Odgovor Napisal/-a admin »

Pozdravljeni,

:) Moderno :), kaj pa naj bi pomenilo to ime.. Poglejte, vsaka funkcija opravlja neko delo in funkcija, ki sešteje dve števili, naj bi se imenovala seštej. Kako mislite, da bi izgledalo programiranje, če bi se funkcija, ki naprimer zažene program imenovala hladilnik? Se vam zdi smešno? No vaša funkcija, ki pretvori cifro v besedo se imenuje moderno :)... Torej!

OK, najprej sem torej preimenoval to funkcijo, da ima bolj smiselno ime in to je.... preprosto...PrevtoriCifreVBesede. Po imenu je bilo potrebno popraviti tudi samo funkcijo. Kako in zakaj si poglejte sami, če pa ne razumete pa vprašajte.

Sedaj pa h glavni funkciji. Tukaj pa ste preporsto "zaglibili" v algoritmu. Algoritem pravi: Razbij stavek na besede in potem za vsako besedo preveri ali jo lahko pretvoriš v številko. Če jo lahko pretvoriš v številko potem je ne pretvori besedilo.... Torej takole:

Koda: Izberi vse

Function PrevtoriCifreVBesede(ByVal beseda As String) As String
  tabela = Array("nic", "ena", "dva", "tri", "štiri", "pet", "šest", "sedem", "osem", "devet")
  tabela1 = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
  
  For i = 0 To 9
      nasel = InStr(beseda, CStr(tabela1(i)))
      If nasel <> 0 Then
          beseda = Replace(beseda, CStr(tabela1(i)), CStr(tabela(i)))
      End If
  Next
  
  PrevtoriCifreVBesede = beseda
End Function

Sub zamenjajbrezstevil()
  Dim besedilo As String
  Dim besede As Variant
  Dim novstavek As String
  
  besedilo = InputBox("Vnesi stavek za pretvorbo!")
  novstavek = ""
  besede = Split(besedilo, " ")
  
  For Each beseda In besede
    If IsNumeric(beseda) Then
        novstavek = novstavek + " " + beseda
    Else
        novstavek = novstavek + " " + PrevtoriCifreVBesede(CStr(beseda))
    End If
  Next
  
  MsgBox novstavek
End Sub
Ha, kar pa se tiče prenašanaj po referenci ali po vrednosti pa je v vašem konkretnem primeru povsem vseeno :wink: .

Poglejte, funkcija lahko sprejme nek parameter (ali več parametrov). Vsebino tega parametra lahko spremeni in če kličočo funkcijo ta sprememba zanima potem morate uporabiti klic po referenci, ciser pa po vrednosti. Primer podajam spodaj:

Koda: Izberi vse

Sub ToleSeNeBoVideloVen(ByVal vsebina As String)
  Debug.Print "OB VSTOPU V FUNKCIJO ToleSeNeBoVideloVen: vsebina = " & vsebina
  vsebina = "Neka vrednost, ki jo priredim v funkciji ToleSeNeBoVideloVen"
  Debug.Print "OB IZSTOPU IZ FUNKCIJE ToleSeNeBoVideloVen: vsebina = " & vsebina
End Sub

Sub TolePaSeBoVideloVen(ByRef vsebina As String)
  Debug.Print "OB VSTOPU V FUNKCIJO TolePaSeBoVideloVen: vsebina = " & vsebina
  vsebina = "Neka vrednost, ki jo priredim v funkciji TolePaSeBoVideloVen"
  Debug.Print "OB IZSTOPU IZ FUNKCIJE TolePaSeBoVideloVen: vsebina = " & vsebina
End Sub

Sub GlavnaFunkcija()
  Dim NizZnakov As String
  
  NizZnakov = "Glavna funkcija"
  Debug.Print "PRED KLICEM funkcije ToleSeNeBoVideloVen: NizZnakov = " & NizZnakov
  ToleSeNeBoVideloVen NizZnakov
  Debug.Print "PO KLICU funkcije ToleSeNeBoVideloVen: NizZnakov = " & NizZnakov
  
  Debug.Print "PRED KLICEM funkcije TolePaSeBoVideloVen: NizZnakov = " & NizZnakov
  TolePaSeBoVideloVen NizZnakov
  Debug.Print "PO KLICU funkcije TolePaSeBoVideloVen: NizZnakov = " & NizZnakov
End Sub
Ko boste makro pognali boste v 'Debug' oknu dobili sledeč rezultat:

Koda: Izberi vse

PRED KLICEM funkcije ToleSeNeBoVideloVen: NizZnakov = Glavna funkcija
OB VSTOPU V FUNKCIJO ToleSeNeBoVideloVen: vsebina = Glavna funkcija
OB IZSTOPU IZ FUNKCIJE ToleSeNeBoVideloVen: vsebina = Neka vrednost, ki jo priredim v funkciji ToleSeNeBoVideloVen
PO KLICU funkcije ToleSeNeBoVideloVen: NizZnakov = Glavna funkcija
PRED KLICEM funkcije TolePaSeBoVideloVen: NizZnakov = Glavna funkcija
OB VSTOPU V FUNKCIJO TolePaSeBoVideloVen: vsebina = Glavna funkcija
OB IZSTOPU IZ FUNKCIJE TolePaSeBoVideloVen: vsebina = Neka vrednost, ki jo priredim v funkciji TolePaSeBoVideloVen
PO KLICU funkcije TolePaSeBoVideloVen: NizZnakov = Neka vrednost, ki jo priredim v funkciji TolePaSeBoVideloVen
Iz njega lahko vidite, da je klic po referenci spremenil vrednost spremenljivke 'NizZnakov', ki je deklarirana v glavni funkciji! Pri klicu po vrednosti pa nam to ni uspelo!
lp,
Matjaž Prtenjak
Administrator
Odgovori