VBA in Excel biedt eindeloze mogelijkheden voor maatwerk en automatisering. Een van de verzoeken die Excel-gebruikers soms hebben, is de mogelijkheid om getallen om te zetten naar hun woordelijke representatie. Dit is vooral nuttig in boekhoudtoepassingen, contractgeneratoren, en bij het maken van cheques of facturen. Vandaag gaan we precies dat doen en leren hoe je getallen tot tien miljoen kunt omzetten naar woorden in het Nederlands!
Waarom is dit nuttig?
Het kunnen converteren van getallen naar woorden kan nuttig zijn in diverse scenario’s:
- Financiële rapporten: Het opstellen van officiële financiële documenten.
- Onderwijs: Het maken van onderwijsmaterialen of quizzen die studenten vragen getallen in woorden te schrijven.
- Formele communicatie: Denk aan het opstellen van contracten of officiële documenten.
De Functie: GetalInWoorden
Om aan de slag te gaan, introduceren we eerst een hoofdfunctie genaamd ‘GetalInWoorden’ die verantwoordelijk is voor het identificeren en verwerken van miljoenen, duizenden en de resterende getallen.
De bijbehorende hulpfunctie, ‘GetalNaarHonderden’, hanteert de logica voor getallen tot 999. Hiermee voorkomen we herhaling van code en maken we ons script efficiënter.
Function GetalInWoorden(getal As Long) As String
Dim Eenheden As Variant
Dim Tientallen As Variant
Dim Duizendtallen As String
Dim Miljoentallen As String
' Speciale case nul
If getal = 0 Then
GetalInWoorden = "nul"
Exit Function
End If
' Array met eenheden
Eenheden = Array("", "een", "twee", "drie", "vier", "vijf", "zes", "zeven", "acht", "negen")
' Array met tientallen
Tientallen = Array("", "", "twintig", "dertig", "veertig", "vijftig", "zestig", "zeventig", "tachtig", "negentig")
' Controleer miljoentallen
If getal >= 1000000 Then
Dim m As Long
m = getal \ 1000000
If m = 1 Then
Miljoentallen = "een miljoen "
Else
Miljoentallen = GetalNaarHonderden(m) & " miljoen "
End If
getal = getal Mod 1000000
End If
' Controleer duizendtallen
If getal >= 1000 Then
Dim t As Long
t = getal \ 1000
If t = 1 Then
Duizendtallen = "duizend "
Else
Duizendtallen = GetalNaarHonderden(t) & "duizend "
End If
getal = getal Mod 1000
End If
' Combineer en trim overtollige spaties
GetalInWoorden = Trim(Miljoentallen & Duizendtallen & GetalNaarHonderden(getal))
End Function
Function GetalNaarHonderden(num As Long) As String
Dim Eenheden As Variant
Dim Tientallen As Variant
Dim res As String
Eenheden = Array("", "een", "twee", "drie", "vier", "vijf", "zes", "zeven", "acht", "negen")
Tientallen = Array("", "", "twintig", "dertig", "veertig", "vijftig", "zestig", "zeventig", "tachtig", "negentig")
If num = 0 Then
GetalNaarHonderden = ""
Exit Function
End If
' Honderdtallen: bij 1 -> "honderd" (niet "eenhonderd")
If num >= 100 Then
Dim h As Long
h = num \ 100
If h = 1 Then
res = "honderd"
Else
res = Eenheden(h) & "honderd"
End If
num = num Mod 100
End If
If num = 0 Then
GetalNaarHonderden = res
Exit Function
End If
' Speciale gevallen: 10 en 11-19
If num = 10 Then
res = res & "tien"
ElseIf num > 10 And num < 20 Then
Select Case num
Case 11: res = res & "elf"
Case 12: res = res & "twaalf"
Case 13: res = res & "dertien"
Case 14: res = res & "veertien"
Case 15: res = res & "vijftien"
Case 16: res = res & "zestien"
Case 17: res = res & "zeventien"
Case 18: res = res & "achttien"
Case 19: res = res & "negentien"
End Select
ElseIf num >= 20 Then
Dim u As Long
u = num Mod 10
If u <> 0 Then
' bv. 21 -> een + en + twintig -> "eenentwintig"
res = res & Eenheden(u) & "en"
End If
res = res & Tientallen(num \ 10)
Else
' 1-9
res = res & Eenheden(num)
End If
GetalNaarHonderden = res
End Function
Werkt echt top!
Hij pakt alleen de 10.000 niet, dan komt er #WAARDE! te staan, dat is met alle getallen die 10.000 er in hebben, 910.000 bijvoorbeeld ook.
en bij de 100.000 zegt hij eenhonderdduizend.
Heb je een oplossing voor beide situaties?
Hoi Angel,
Bedankt voor je reactie. Ik heb de functies aangepast. Hij zou nu goed moeten werken!
Mvg,
Martin
Hey Martin!
Wij werken erg veel met het zeggen van een valuta, wat ik ook nog uitvond was dat de zeggen van 100.000 werd éénhonderdduizend, ik heb hem zelf aangepast werkend naar mijn eigen wijze en het werkt echt top! (als je graag mijn code wilt zien kan ik hem naar je sturen)
Mvg,
Angel