martes, 2 de agosto de 2011

CONVERTIR NÚMEROS A LETRAS CON DECIMALES en VBA para Excel y hasta miles de billones.

Esta función convierte a letras tus números con decimales y hasta miles de billones.
La función es "num2let". 
Copia lo siguiente en VBA:

Function num2let(value)
  If Int(value) = 1 Then
  num2let = "uno" & " con " & Int(Round(((value - Int(value)) * 100))) & "/100"
  Else
   num2let = Num2Text(value) & " con " & Int(Round(((value - Int(value)) * 100))) & "/100"
End If
End Function


Public Function Num2Text(ByVal value As Double) As String
fraccion = value - Int(value)
value = Int(value)
    Select Case value
        Case 0: Num2Text = "cero"
        Case 1: Num2Text = "un"
        Case 2: Num2Text = "dos"
        Case 3: Num2Text = "tres"
        Case 4: Num2Text = "cuatro"
        Case 5: Num2Text = "cinco"
        Case 6: Num2Text = "seis"
        Case 7: Num2Text = "siete"
        Case 8: Num2Text = "ocho"
        Case 9: Num2Text = "nueve"
        Case 10: Num2Text = "diez"
        Case 11: Num2Text = "once"
        Case 12: Num2Text = "doce"
        Case 13: Num2Text = "trece"
        Case 14: Num2Text = "catorce"
        Case 15: Num2Text = "quince"
        Case Is < 20: Num2Text = "dieci" & Num2Text(value - 10)
        Case 20: Num2Text = "veinte"
        Case Is < 30: Num2Text = "veinti" & Num2Text(value - 20)
        Case 30: Num2Text = "treinta"
        Case 40: Num2Text = "cuarenta"
        Case 50: Num2Text = "cincuenta"
        Case 60: Num2Text = "sesenta"
        Case 70: Num2Text = "setenta"
        Case 80: Num2Text = "ochenta"
        Case 90: Num2Text = "noventa"
        Case Is < 100: Num2Text = Num2Text(Int(value \ 10) * 10) & " y " & Num2Text(value Mod 10)
        Case 100: Num2Text = "cien"
        Case Is < 200: Num2Text = "ciento " & Num2Text(value - 100)
        Case 200, 300, 400, 600, 800: Num2Text = Num2Text(Int(value \ 100)) & "cientos"
        Case 500: Num2Text = "quinientos"
        Case 700: Num2Text = "setecientos"
        Case 900: Num2Text = "novecientos"
        Case Is < 1000: Num2Text = Num2Text(Int(value \ 100) * 100) & " " & Num2Text(value Mod 100)
        Case 1000: Num2Text = "mil"
        Case Is < 2000: Num2Text = "mil " & Num2Text(value Mod 1000)
        Case Is < 1000000: Num2Text = Num2Text(Int(value \ 1000)) & " mil"
            If value Mod 1000 Then Num2Text = Num2Text & " " & Num2Text(value Mod 1000)
        Case 1000000: Num2Text = "un millón"
        Case Is < 2000000: Num2Text = "un millón " & Num2Text(value Mod 1000000)
        Case Is < 1000000000000#: Num2Text = Num2Text(Int(value / 1000000)) & " millones"
            If (value - Int(value / 1000000) * 1000000) Then Num2Text = Num2Text & " " & Num2Text(value - Int(value / 1000000) * 1000000)
        Case 1000000000000#: Num2Text = "un billón"
        Case Is < 2000000000000#: Num2Text = "un billón " & Num2Text(value - Int(value / 1000000000000#) * 1000000000000#)
        Case Else: Num2Text = Num2Text(Int(value / 1000000000000#)) & " billones"
            If (value - Int(value / 1000000000000#) * 1000000000000#) Then Num2Text = Num2Text & " " & Num2Text(value - Int(value / 1000000000000#) * 1000000000000#)
    End Select
  End Function

Si necesitan que los centavos los ponga en letra, es fácil de cambiar. Mandanos tu consulta y la responderemos a la brevedad posible.
Espero les sirva.
Si quieres usar esta función siempre que abras el Excel sin necesidad de abrir el archivo donde la creaste, debes subirla a los Complementos de Excel. Para ver como hacer esto, haz click aquí.

27 comentarios:

  1. Gracias!!!
    Funciona perfecto.

    ResponderEliminar
  2. Cuando escribes 1,000,000.00 escribe: "un millón pesos", cuando debería escribir: "un millón de pesos"

    ResponderEliminar
  3. ?? Me parece te estás equivocando de macro. Esta no pone la palabra pesos!
    Si deseas que diga pesos deberías agregar al final de los renglones que están abajo... & " pesos"
    num2let = "uno" & " con " & Int(Round(((value - Int(value)) * 100))) & "/100"
    num2let = Num2Text(value) & " con " & Int(Round(((value - Int(value)) * 100))) & "/100"

    Y si necesitas que cuando sea exacto un millón ponga "de pesos" simplemente un nuevo condicional para cuando "value" sea igual a 1.000.000.
    Saludos.

    ResponderEliminar
    Respuestas
    1. me sirve de mucho tu formula propio!!! pero como puedo convertir los decimales en letras... please!!! urgennn... te lo agradecere

      Eliminar
  4. Lo conveniente es que la palabra pesos aparezca adelante... por ejemplo : pesos un millón con 00/100.
    Para eso solo agrega adelante de los dos renglones antes mecionados "pesos " &
    Muy buena función!

    ResponderEliminar
  5. este codigo se ve bien completo, pero como le hago para que me de por ejemplo: (ciento veinti dos pesos 00/100 m.n.) ojala que alguien sepa. saludos.

    ResponderEliminar
  6. Hola a tod@s.

    Ante todo mis respetos y mi agradecimiento por el trabajo que hacéis, pues nos ayuda a los que somos simples aficionados pero que queremos seguir aprendiendo.

    He introducido el código en una hoja de Excel y me funciona perfectamente, y una vez visto esto, tengo la duda si se podría hacer al reves, o sea, de texto a números. Agradecería que si alguien lo tiene, me dijera como hacerlo o me lo enviase, pues para ciertos trabajos en donde los datos me los pasan en números, me sería de muchísima utilidad.

    Veréis, no se si lo que solicito es algo imposible o es algo que se pueda solucionar de manera fácil con alguna de las fórmulas que Excel ya posee, o incluso Word u otro programa que tenga VBA, pero lo desconozco y agradecería alguna ayuda.

    Saludos y mis mejores deseos a tod@s.

    ResponderEliminar
  7. Por favor necesito que los centavos los ponga en letra
    Muchas gracias

    ResponderEliminar
  8. Buenas Tardes, como puedo colocar el codigo para convertir de numeros en letras trabajando en vba, desde un formulario.

    ResponderEliminar
  9. Excelente aporte, gracias por compartir tu conocimiento. Que debo hacer para que me aparezca lo siguiente: PESOS ANTES DEL IMPUESTO AL VALOR AGREGADO IVA .
    De antemano mil gracias por vustra valiosa ayuda

    ResponderEliminar
  10. para formato con parentisis y en dolares ejemplo: (treinta y cinco dolares 24/100 USD)
    modificar:
    num2let = "(" & "uno" & " dolares " & Int(Round(((value - Int(value)) * 100))) & "/100 USD" & ")"
    Else
    num2let = "(" & Num2Text(value) & " dolares " & Int(Round(((value - Int(value)) * 100))) & "/100 USD" & ")"

    ResponderEliminar
  11. como cambio la palabra pesos a lempiras? ya que estamos en Honduras y aqui la moneda oficial es lempiras

    ResponderEliminar
  12. Necesito convertir numeros enteros y decimales a texto. Ejemplo.

    1,245.34 Mil doscientos cuarenta y cinco quetzales con treinta y cuatro centavos.

    1,245.00 Mil doscientos cuarenta y cinco quetzales exactos

    ResponderEliminar
  13. HOLA TAMBIEN DEJO UNAS










    Function NUM2LET(VALUE)
    If Int(VALUE) = 1 Then
    NUM2LET = "UNO" & " CON " & Int(Round(((VALUE - Int(VALUE)) * 100))) & "/100"
    Else
    NUM2LET = ENLETRAS(VALUE) & " CON " & Int(Round(((VALUE - Int(VALUE)) * 100))) & "/100"
    End If
    End Function


    Public Function ENLETRAS(ByVal VALUE As Double) As String
    FRACCION = VALUE - Int(VALUE)
    VALUE = Int(VALUE)
    Select Case VALUE
    Case 0: ENLETRAS = "CERO"
    Case 1: ENLETRAS = "UN"
    Case 2: ENLETRAS = "DOS"
    Case 3: ENLETRAS = "TRES"
    Case 4: ENLETRAS = "CUATRO"
    Case 5: ENLETRAS = "CINCO"
    Case 6: ENLETRAS = "SEIS"
    Case 7: ENLETRAS = "SIETE"
    Case 8: ENLETRAS = "OCHO"
    Case 9: ENLETRAS = "NUEVE"
    Case 10: ENLETRAS = "DIEZ"
    Case 11: ENLETRAS = "ONCE"
    Case 12: ENLETRAS = "DOCE"
    Case 13: ENLETRAS = "TRECE"
    Case 14: ENLETRAS = "CATORCE"
    Case 15: ENLETRAS = "QUINCE"
    Case Is < 20: ENLETRAS = "DIECI" & ENLETRAS(VALUE - 10)
    Case 20: ENLETRAS = "VEINTE"
    Case Is < 30: ENLETRAS = "VEINTI" & ENLETRAS(VALUE - 20)
    Case 30: ENLETRAS = "TREINTA"
    Case 40: ENLETRAS = "CUARENTA"
    Case 50: ENLETRAS = "CINCUENTA"
    Case 60: ENLETRAS = "SESENTA"
    Case 70: ENLETRAS = "SETENTA"
    Case 80: ENLETRAS = "OCHENTA"
    Case 90: ENLETRAS = "NOVENTA"
    Case Is < 100: ENLETRAS = ENLETRAS(Int(VALUE \ 10) * 10) & " Y " & ENLETRAS(VALUE Mod 10)
    Case 100: ENLETRAS = "CIEN"
    Case Is < 200: ENLETRAS = "CIENTO " & ENLETRAS(VALUE - 100)
    Case 200, 300, 400, 600, 800: ENLETRAS = ENLETRAS(Int(VALUE \ 100)) & "CIENTOS"
    Case 500: ENLETRAS = "QUINIENTOS"
    Case 700: ENLETRAS = "SETECIENTOS"
    Case 900: ENLETRAS = "NOVECIENTOS"
    Case Is < 1000: ENLETRAS = ENLETRAS(Int(VALUE \ 100) * 100) & " " & ENLETRAS(VALUE Mod 100)
    Case 1000: ENLETRAS = "MIL"
    Case Is < 2000: ENLETRAS = "MIL " & ENLETRAS(VALUE Mod 1000)
    Case Is < 1000000: ENLETRAS = ENLETRAS(Int(VALUE \ 1000)) & " MIL"
    If VALUE Mod 1000 Then ENLETRAS = ENLETRAS & " " & ENLETRAS(VALUE Mod 1000)
    Case 1000000: ENLETRAS = "UN MILLÓN"
    Case Is < 2000000: ENLETRAS = "UN MILLÓN " & ENLETRAS(VALUE Mod 1000000)
    Case Is < 1000000000000#: ENLETRAS = ENLETRAS(Int(VALUE / 1000000)) & " MILLONES"
    If (VALUE - Int(VALUE / 1000000) * 1000000) Then ENLETRAS = ENLETRAS & " " & ENLETRAS(VALUE - Int(VALUE / 1000000) * 1000000)
    Case 1000000000000#: ENLETRAS = "UN BILLÓN"
    Case Is < 2000000000000#: ENLETRAS = "UN BILLÓN " & ENLETRAS(VALUE - Int(VALUE / 1000000000000#) * 1000000000000#)
    Case Else: ENLETRAS = ENLETRAS(Int(VALUE / 1000000000000#)) & " BILLONES"
    If (VALUE - Int(VALUE / 1000000000000#) * 1000000000000#) Then ENLETRAS = ENLETRAS & " " & ENLETRAS(VALUE - Int(VALUE / 1000000000000#) * 1000000000000#)
    End Select
    End Function

    ResponderEliminar
  14. '''1ª parte

    PUBLIC FUNCTION ENLETRAS(NUMERO AS STRING) AS STRING
    DIM B, PASO AS INTEGER
    DIM EXPRESION, ENTERO, DECI, FLAG AS STRING

    FLAG = "N"
    FOR PASO = 1 TO LEN(NUMERO)
    IF MID(NUMERO, PASO, 1) = "." THEN
    FLAG = "S"
    ELSE
    IF FLAG = "N" THEN
    ENTERO = ENTERO + MID(NUMERO, PASO, 1) 'EXTAE LA PARTE ENTERA DEL NUMERO
    ELSE
    DECI = DECI + MID(NUMERO, PASO, 1) 'EXTRAE LA PARTE DECIMAL DEL NUMERO
    END IF
    END IF
    NEXT PASO

    IF LEN(DECI) = 1 THEN
    DECI = DECI & "0"
    END IF

    ResponderEliminar
  15. '''2ª Parte
    FLAG = "N"
    IF VAL(NUMERO) >= -999999999 AND VAL(NUMERO) <= 999999999 THEN 'SI EL NUMERO ESTA DENTRO DE 0 A 999.999.999
    FOR PASO = LEN(ENTERO) TO 1 STEP -1
    B = LEN(ENTERO) - (PASO - 1)
    SELECT CASE PASO
    CASE 3, 6, 9
    SELECT CASE MID(ENTERO, B, 1)
    CASE "1"
    IF MID(ENTERO, B + 1, 1) = "0" AND MID(ENTERO, B + 2, 1) = "0" THEN
    EXPRESION = EXPRESION & "CIEN "
    ELSE
    EXPRESION = EXPRESION & "CIENTO "
    END IF
    CASE "2"
    EXPRESION = EXPRESION & "DOSCIENTOS "
    CASE "3"
    EXPRESION = EXPRESION & "TRESCIENTOS "
    CASE "4"
    EXPRESION = EXPRESION & "CUATROCIENTOS "
    CASE "5"
    EXPRESION = EXPRESION & "QUINIENTOS "
    CASE "6"
    EXPRESION = EXPRESION & "SEISCIENTOS "
    CASE "7"
    EXPRESION = EXPRESION & "SETECIENTOS "
    CASE "8"
    EXPRESION = EXPRESION & "OCHOCIENTOS "
    CASE "9"
    EXPRESION = EXPRESION & "NOVECIENTOS "
    END SELECT

    CASE 2, 5, 8
    SELECT CASE MID(ENTERO, B, 1)
    CASE "1"
    IF MID(ENTERO, B + 1, 1) = "0" THEN
    FLAG = "S"
    EXPRESION = EXPRESION & "DIEZ "
    END IF
    IF MID(ENTERO, B + 1, 1) = "1" THEN
    FLAG = "S"
    EXPRESION = EXPRESION & "ONCE "
    END IF
    IF MID(ENTERO, B + 1, 1) = "2" THEN
    FLAG = "S"
    EXPRESION = EXPRESION & "DOCE "
    END IF
    IF MID(ENTERO, B + 1, 1) = "3" THEN
    FLAG = "S"
    EXPRESION = EXPRESION & "TRECE "
    END IF
    IF MID(ENTERO, B + 1, 1) = "4" THEN
    FLAG = "S"
    EXPRESION = EXPRESION & "CATORCE "
    END IF

    ResponderEliminar
  16. '''3ª Parte
    IF MID(ENTERO, B + 1, 1) = "5" THEN
    FLAG = "S"
    EXPRESION = EXPRESION & "QUINCE "
    END IF
    IF MID(ENTERO, B + 1, 1) > "5" THEN
    FLAG = "N"
    EXPRESION = EXPRESION & "DIECI"
    END IF

    CASE "2"
    IF MID(ENTERO, B + 1, 1) = "0" THEN
    EXPRESION = EXPRESION & "VEINTE "
    FLAG = "S"
    ELSE
    EXPRESION = EXPRESION & "VEINTI"
    FLAG = "N"
    END IF

    CASE "3"
    IF MID(ENTERO, B + 1, 1) = "0" THEN
    EXPRESION = EXPRESION & "TREINTA "
    FLAG = "S"
    ELSE
    EXPRESION = EXPRESION & "TREINTA Y "
    FLAG = "N"
    END IF

    CASE "4"
    IF MID(ENTERO, B + 1, 1) = "0" THEN
    EXPRESION = EXPRESION & "CUARENTA "
    FLAG = "S"
    ELSE
    EXPRESION = EXPRESION & "CUARENTA Y "
    FLAG = "N"
    END IF

    CASE "5"
    IF MID(ENTERO, B + 1, 1) = "0" THEN
    EXPRESION = EXPRESION & "CINCUENTA "
    FLAG = "S"
    ELSE
    EXPRESION = EXPRESION & "CINCUENTA Y "
    FLAG = "N"
    END IF

    ResponderEliminar
  17. '''4ª Parte
    CASE "6"
    IF MID(ENTERO, B + 1, 1) = "0" THEN
    EXPRESION = EXPRESION & "SESENTA "
    FLAG = "S"
    ELSE
    EXPRESION = EXPRESION & "SESENTA Y "
    FLAG = "N"
    END IF

    CASE "7"
    IF MID(ENTERO, B + 1, 1) = "0" THEN
    EXPRESION = EXPRESION & "SETENTA "
    FLAG = "S"
    ELSE
    EXPRESION = EXPRESION & "SETENTA Y "
    FLAG = "N"
    END IF

    CASE "8"
    IF MID(ENTERO, B + 1, 1) = "0" THEN
    EXPRESION = EXPRESION & "OCHENTA "
    FLAG = "S"
    ELSE
    EXPRESION = EXPRESION & "OCHENTA Y "
    FLAG = "N"
    END IF

    CASE "9"
    IF MID(ENTERO, B + 1, 1) = "0" THEN
    EXPRESION = EXPRESION & "NOVENTA "
    FLAG = "S"
    ELSE
    EXPRESION = EXPRESION & "NOVENTA Y "
    FLAG = "N"
    END IF
    END SELECT

    ResponderEliminar
  18. '''5ª Parte
    CASE 1, 4, 7
    SELECT CASE MID(ENTERO, B, 1)
    CASE "1"
    IF FLAG = "N" THEN
    IF PASO = 1 THEN
    EXPRESION = EXPRESION & "UNO "
    ELSE
    EXPRESION = EXPRESION & "UN "
    END IF
    END IF
    CASE "2"
    IF FLAG = "N" THEN
    EXPRESION = EXPRESION & "DOS "
    END IF
    CASE "3"
    IF FLAG = "N" THEN
    EXPRESION = EXPRESION & "TRES "
    END IF
    CASE "4"
    IF FLAG = "N" THEN
    EXPRESION = EXPRESION & "CUATRO "
    END IF
    CASE "5"
    IF FLAG = "N" THEN
    EXPRESION = EXPRESION & "CINCO "
    END IF
    CASE "6"
    IF FLAG = "N" THEN
    EXPRESION = EXPRESION & "SEIS "
    END IF
    CASE "7"
    IF FLAG = "N" THEN
    EXPRESION = EXPRESION & "SIETE "
    END IF
    CASE "8"
    IF FLAG = "N" THEN
    EXPRESION = EXPRESION & "OCHO "
    END IF
    CASE "9"
    IF FLAG = "N" THEN
    EXPRESION = EXPRESION & "NUEVE "
    END IF
    END SELECT
    END SELECT
    IF PASO = 4 THEN
    IF MID(ENTERO, 6, 1) <> "0" OR MID(ENTERO, 5, 1) <> "0" OR MID(ENTERO, 4, 1) <> "0" OR _
    (MID(ENTERO, 6, 1) = "0" AND MID(ENTERO, 5, 1) = "0" AND MID(ENTERO, 4, 1) = "0" AND _
    LEN(ENTERO) <= 6) THEN
    EXPRESION = EXPRESION & "MIL "
    END IF
    END IF
    IF PASO = 7 THEN
    IF LEN(ENTERO) = 7 AND MID(ENTERO, 1, 1) = "1" THEN
    EXPRESION = EXPRESION & "MILLÓN "
    ELSE
    EXPRESION = EXPRESION & "MILLONES "
    END IF
    END IF
    NEXT PASO

    IF DECI <> "" THEN
    IF MID(ENTERO, 1, 1) = "-" THEN 'SI EL NUMERO ES NEGATIVO
    ENLETRAS = "MENOS " & EXPRESION & "CON " & DECI ' & "/100"
    ELSE
    ENLETRAS = EXPRESION & "CON " & DECI ' & "/100"
    END IF
    ELSE
    IF MID(ENTERO, 1, 1) = "-" THEN 'SI EL NUMERO ES NEGATIVO
    ENLETRAS = "MENOS " & EXPRESION
    ELSE
    ENLETRAS = EXPRESION
    END IF
    END IF
    ELSE 'SI EL NUMERO A CONVERTIR ESTA FUERA DEL RANGO SUPERIOR E INFERIOR
    ENLETRAS = ""
    END IF
    END FUNCTION

    ResponderEliminar
  19. ATENCIÓN...!!! LAS 5 PARTES FORMAN PARTE DE SOLO UNA FUNCIÓN QUE CONVIERTE NÚMEROS A LETRAS... GRACIAS

    ResponderEliminar
    Respuestas
    1. pOR FAVOR PUEDES PONER UN EJEMPLO DE COMO USAR TU FUNCION EN EXCEL?.. YA LO INSTALE COMO COMPLEMENTO PERO NO SE COMO PONERLA EN EJECUCION EN LA HOJA DE EXCEL
      GRACIAS

      Eliminar
  20. MUCHAS GRACIAS lo use con la moneda del Perú y todo salio perfecto solo es cuestión de usar la formula y concatenarla al gusto de cada uno
    saludos

    ResponderEliminar
  21. Estimado para tener los Centimos en letras ????

    ResponderEliminar
  22. Agradecido por el codigo, me pegaste la media salva para un proyecto de trabajo

    ResponderEliminar
  23. Saludos me podría ayudar con lo siguiente necesito cambiar números del 0 al 10 de tres decimales a texto por ejemplo: 3,456= tres coma cuatrocientos cincuenta y seis milésimas; otro seria 10,010= diez coma 10 milésimas. Muchas Gracias.

    ResponderEliminar