Vertaal getallen naar tekst

  • Onderwerp starter Onderwerp starter snb
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

snb

Verenigingslid
Lid geworden
12 jun 2008
Berichten
20.289
In de laatste nieuwsbrief plaatste Octafish een artikel onder de titel Cursus Access voor beginners H14.

Daarin beschrijft hij een methode om een getal te 'vertalen' in tekst.

Omdat de beschreven methode vanwege het gebruik van VBA een bredere toepassing kan hebben dan in Access alleen, leek het me aardig hieraan in dit VBA subforum aandacht te besteden.
Ik kon het niet nalaten Octafish' methode te bestudereen met in het achterhoofd de vraag: 'kan dat niet simpeler '?

Het resultaat daarvan plaats ik hieronder.
Omdat Octafish alles in een funktie heeft gegoten doe ik dat ook in dit geval.


Hoe is de methode opgebouwd ?

- De tekstopbouw van getallen is erg regelmatig, daarvoor maken we een algoritme
- De tekstopbouw van getallen kent een aantal uitzonderingen, die zetten we in een array
- De tekstopbouw van getallen is voor iedere groep van 3 opeenvolgende getallen (honderden, honderdduizenden, honderdmiljoenen, etc. identiek; daarom maken van ider getal vóór het te analyseren een getal met 3,6,9,12, etc. tekens met behulp van de format methode. 2, wordt "002", 12 wordt "012", 1203 wordt "001203", etc.
- Eerst kijkt de methode of een uitzondering van toepassing is, die wordt dan gebruikt; als er geen uitzondering is wordt het reguliere algoritme gebruikt.

Code:
Sub snb()
  MsgBox vertaal(328)
End Sub

Code:
Function vertaal(y)
  sq = Array(, "", "een", "twee", "drie", "vier", "vijf", "zes", "zeven", "acht", "negen", "tien", "elf", "twaalf", "dertien", "veertien", "twintig", "dertig", "veertig", "tachtig")

  x = Format(y, String(3 * ((Len(y) - 1) \ 3 + 1), "0"))
    
  For j = Len(x) \ 3 To 1 Step -1
    y = Mid(x, Len(x) - (j * 3) + 1, 3)
    c00 = ""
        
    If Left(y, 1) <> "0" Then c00 = sq(mats(Left(y, 1))) & "honderd"

    If Right(y, 2) <> "00" Then
      If IsError(mats(Right(y, 2))) Then
        c00 = c00 & sq(mats(Right(y, 1)))
               
        If Mid(y, 2, 1) <> "0" Then
          If IsError(mats(Mid(y, 2, 1) & "0")) Or Mid(y, 2, 1) = "1" Then
            c00 = c00 & IIf(Mid(y, 2, 1) = "1", "tien", IIf(Right(y, 1) = "0", "", "en") & sq(mats(Left(Right(y, 2), 1))) & "tig")
          Else
            c00 = c00 & "en" & sq(mats(Mid(y, 2, 1) & "0"))
          End If
        End If
      Else
        c00 = c00 & sq(mats(Right(y, 2)))
      End If
    End If
    c01 = c01 & c00 & Choose(j, "", "duizend ", "miljoen ", "miljard ")
  Next
    
  vertaal = Replace(Replace(Replace(c01, "eendu", "du"), "eenho", "ho"), "eee", "eeë")
End Function

Code:
Function mats(y)
    mats = Application.Match(y, Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "20", "30", "40", "80"), 0)
End Function
 
Laatst bewerkt:
Ziet er een stuk korter uit, maar jammer genoeg krijg ik 'm zowel in Excel als in Access niet aan de praat. Access (2003, dat wel) kent Match namelijk niet. Excel dan weer wel, maar die retourneert niet zoveel. Misschiend dat een werkend voorbeeldje (Word, Excel, PowerPoint misschien?) meer zegt.
 
Jouw functie maakt van: 3456,32
Dit: miljoen drieduizend vierhonderdzesenvijftig
Lijkt mij niet helemaal juist nog ;)
 
De huidige versie werkt ook met decimalen (max 2).
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan