Function Słownie(Liczba As Variant, Optional CzyWaluta) As Variant
'***********************************************************
' Makro do przeliczania liczby na słownie
' (c) 2001 by Bartłomiej Sosenko
'***********************************************************
Dim LiczbaP, Wynik, Slowo, SlowoP, Slowo2, i, Przyrostki
Dim Przyrostek, Przedrostek, Grosze, Jednostki, dziesiatki, setki, gr
If IsMissing(CzyWaluta) Then CzyWaluta = True
If Liczba < 0 Then
Liczba = -Liczba
Przedrostek = "minus "
End If
Grosze = ""
If InStr(1, Liczba, ",", 1) > 0 Then
Grosze = Right(Liczba, Len(Liczba) - InStr(1, Liczba, ",", 1))
If Len(Grosze) = 1 Then Grosze = Grosze & "0"
If Len(Grosze) > 2 Then Grosze = Left(Grosze, 2)
Liczba = Left(Liczba, InStr(1, Liczba, ",", 1) - 1)
End If
Jednostki = Array("", "jeden", "dwa", "trzy", "cztery", _
"pięć", "sześć", "siedem", "osiem", "dziewięć", _
"dziesięć", "jedenaście", "dwanaście", "trzynaście", _
"czternaście", "piętnaście", "szesnaście", "siedemnaście", _
"osiemnaście", "dziewiętnaście")
dziesiatki = Array("", "dziesięć", "dwadzieścia", "trzydzieści", "czterdzieści", _
"pięćdziesiąt", "sześćdziesiąt", "siedemdziesiąt", _
"osiemdziesiąt", "dziewięćdziesiąt")
setki = Array("", "sto", "dwieście", "trzysta", "czterysta", "pięćset", "sześćset", _
"siedemset", "osiemset", "dziewięćset")
Slowo = ""
For gr = 1 To 2
If Len(Liczba) - (Len(Liczba) \ 3) * 3 = 2 Then Liczba = "0" & Liczba
If Len(Liczba) - (Len(Liczba) \ 3) * 3 = 1 Then Liczba = "00" & Liczba
For i = 1 To (Len(Liczba) + 2) \ 3
SlowoP = ""
If i > 1 Then
LiczbaP = Mid(Liczba, Len(Liczba) - (i * 3) + 1, 3)
Else
LiczbaP = Liczba
End If
If Right(LiczbaP, 2) < 20 Then
SlowoP = Jednostki(Right(LiczbaP, 2)) & " " & SlowoP
Else
Slowo2 = dziesiatki(Left(Right(LiczbaP, 2), 1))
Slowo2 = Slowo2 & " " & Jednostki(Right(LiczbaP, 1))
SlowoP = Slowo2 & " " & SlowoP
End If
If LiczbaP > 99 Then
SlowoP = setki(Left(Right(LiczbaP, 3), 1)) & " " & SlowoP
End If
Select Case i
Case 1:
If CzyWaluta Then
If (gr = 2) Then
Przyrostki = Array("grosz", "grosze", "groszy")
Else
Przyrostki = Array("złoty ", "złote ", "złotych ")
End If
Else
If (gr = 2) Then
Przyrostki = Array("setna", "setne", "setnych")
Else
Przyrostki = Array("", "", "")
End If
End If
Case 2: Przyrostki = Array("tysiąc ", "tysiące ", "tysięcy ")
Case 3: Przyrostki = Array("milion ", "miliony ", "milionów ")
Case 4: Przyrostki = Array("miliard ", "miliardy ", "miliardów ")
Case 5: Przyrostki = Array("bilion ", "biliony ", "bilionów ")
End Select
If ((LiczbaP 0) And i > 1) Or (gr > 0) Then
If LiczbaP 0 Then
If LiczbaP = 1 Then
Przyrostek = Przyrostki(0)
Else
If ((Right(LiczbaP, 1) > 1) And (Right(LiczbaP, 1) < 5)) Or _
((Right(LiczbaP, 2) > 21) And (Right(LiczbaP, 1) > 1) And _
(Right(LiczbaP, 1) < 5)) Then Przyrostek = Przyrostki(1)
If ((Right(LiczbaP, 2) > 4) And (Right(LiczbaP, 2) < 22)) Or _
((Right(LiczbaP, 2) > 21) And (Right(LiczbaP, 1) > 4) And _
(Right(LiczbaP, 1) < 22)) Or (Right(LiczbaP, 1) = 0) Or _
(Right(LiczbaP, 1) = 1) Then Przyrostek = Przyrostki(2)
End If
If gr = 1 Then
Slowo = SlowoP & Przyrostek & Slowo
Else
Slowo = Slowo & SlowoP & Przyrostek
End If
End If
End If
Next i
If Grosze = "" Then
Exit For
Else
If Liczba > 0 Then If gr = 1 Then Slowo = Slowo & "i "
Liczba = Grosze
End If
Next gr
If Liczba = 0 Then Slowo = "zero" & Slowo
Słownie = IIf(IsEmpty(Przedrostek), Slowo, Przedrostek & Slowo)
End Function