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
.
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!