Option Explicit
Option Base 0

Function traduce(número As Currency) As String
    Dim v_ceros As Integer
    Dim v_parte As Integer
    Dim v_millones_en_cero As Boolean
    
    ' Si hay miles de millones, pero no millones, tenemos que poner "millones" a fuerza.
    v_millones_en_cero = False
    
    If número = 0 Then traduce = "cero "
    
    While número > 0
        v_parte = número - Int(número / 1000) * 1000
        
        ' Si lleva 6 ceros (millones) y la parte que va a pasar va en cero, activa la señal.
        If v_ceros = 6 And v_parte = 0 Then
            v_millones_en_cero = True
        End If
        
        ' Si va en miles de millones, los millones iban en cero y tiene valor mayor a cero.
        If v_ceros = 9 And v_millones_en_cero And v_parte > 0 Then
            traduce = traduce_p(v_parte, v_ceros) & "millones " & traduce
        ' Si no pasa lo de arriba, no pone los "millones".
        Else
            traduce = traduce_p(v_parte, v_ceros) & traduce
        End If
        
        ' Le quita los tres lugares de la derecha al número.
        número = Int(número / 1000)
        
        ' Agrega 3 al número de ceros que ha quitado.
        v_ceros = v_ceros + 3
        
    Wend
End Function

Function traduce_p(parte As Integer, ceros As Integer) As String
    Dim t_decenas
    Dim t_cientos
    
    Dim i_decenas As Integer
    Dim i_cientos As Integer
    
    t_decenas = Array("", "un ", "dos ", "tres ", "cuatro ", "cinco ", "seis ", _
        "siete ", "ocho ", "nueve ", "diez ", "once ", "doce ", "trece ", "catorce ", _
        "quince ", "dieciséis ", "diecisiete ", "dieciocho ", "diecinueve ", _
        "veinte ", "veintiún ", "veintidós ", "veintitrés ", "veinticuatro ", _
        "veinticinco ", "veintiséis ", "veintisiete ", "veintiocho ", "veintinueve ", _
        "treinta ", "treinta y un ", "treinta y dos ", "treinta y tres ", "treinta y cuatro ", _
        "treinta y cinco ", "treinta y seis ", "treinta y siete ", "treinta y ocho ", _
        "treinta y nueve ", "cuarenta ", "cuarenta y un ", "cuarenta y dos ", "cuarenta y tres ", _
        "cuarenta y cuatro ", "cuarenta y cinco ", "cuarenta y seis ", "cuarenta y siete ", _
        "cuarenta y ocho ", "cuarenta y nueve ", "cincuenta ", "cincuenta y un ", _
        "cincuenta y dos ", "cincuenta y tres ", "cincuenta y cuatro ", "cincuenta y cinco ", _
        "cincuenta y seis ", "cincuenta y siete ", "cincuenta y ocho ", "cincuenta y nueve ", _
        "sesenta ", "sesenta y un ", "sesenta y dos ", "sesenta y tres ", "sesenta y cuatro ", _
        "sesenta y cinco ", "sesenta y seis ", "sesenta y siete ", "sesenta y ocho ", _
        "sesenta y nueve ", "setenta ", "setenta y un ", "setenta y dos ", "setenta y tres ", _
        "setenta y cuatro ", "setenta y cinco ", "setenta y seis ", "setenta y siete ", _
        "setenta y ocho ", "setenta y nueve ", "ochenta ", "ochenta y un ", "ochenta y dos ", _
        "ochenta y tres ", "ochenta y cuatro ", "ochenta y cinco ", "ochenta y seis ", _
        "ochenta y siete ", "ochenta y ocho ", "ochenta y nueve ", "noventa ", "noventa y un ", _
        "noventa y dos ", "noventa y tres ", "noventa y cuatro ", "noventa y cinco ", _
        "noventa y seis ", "noventa y siete ", "noventa y ocho ", "noventa y nueve ")
        
    t_cientos = Array("", "ciento ", "doscientos ", "trescientos ", "cuatrocientos ", _
        "quinientos ", "seiscientos ", "setecientos ", "ochocientos ", "novecientos ")
    
    ' si el número es cien, es una excepción: todos los demás se leen ciento.
    If parte = 100 Then
        traduce_p = "cien "
    Else
        i_cientos = Int(parte / 100)         ' dividiendo el número entre cien quedan las centenas
        i_decenas = parte - i_cientos * 100  ' con esto nos quedan dos dígitos nada más
        ' aquí busca por índice cientos y decenas, y los pega
        traduce_p = t_cientos(i_cientos) & t_decenas(i_decenas)
    End If
    If parte > 0 Then
        If ceros = 3 Or ceros = 9 Then          ' si hemos quitado 3 o 9 ceros, son miles.
                traduce_p = traduce_p & "mil "
        ElseIf ceros = 6 Then                   ' si hemos quitado 6 ceros, tenemos millones.
            If parte = 1 Then                   ' si es un millón exacto, dice millón.
                traduce_p = traduce_p & "millón "
            Else                                ' si es más de un millón, dice millones.
                traduce_p = traduce_p & "millones "
            End If
        ElseIf ceros = 12 Then                  ' si ha quitado doce ceros, estamos en billones.
            If parte = 1 Then                   ' si es un billón exacto, dice billón.
                traduce_p = traduce_p & "billón "
            Else                                ' si es más de un billón, dice billones.
                traduce_p = traduce_p & "billones "
            End If
        End If
    End If
End Function


