Macro para pasar de números a letras - VBA Excel

9 ago 2019

Macro para pasar de números a letras - VBA Excel



Hace algunos ayeres me encontré en la web una función en VBA Excel que nos ayuda a pasar a los números a letra, en su momento a mi me fue muy útil, espero que a ustedes también les sirva.

Dicha función se llama: NumLetras, y solo se tiene que seleccionar la celda que contiene el valor que queremos convertir.


Macro para pasar de numeros a letras
Para que la función funcione hay que seguir los siguientes pasos:
1. Abrir el editor Visual Basic para Aplicaciones (VBA).
2. Insertar un módulo.
3. Pegar el siguiente código:


Function NumLetras(Valor As Currency, Optional MonedaSingular As String = "", Optional MonedaPlural As String = "MN") As String
Dim Cantidad As Currency, Centavos As Currency, Digito As Byte, PrimerDigito As Byte, SegundoDigito As Byte, TercerDigito As Byte, Bloque As String, NumeroBloques As Byte, BloqueCero
Dim Unidades As Variant, Decenas As Variant, Centenas As Variant, I As Variant
Dim ValorEntero As Long
Dim ValorOriginal As Double
    Valor = Round(Valor, 2)
    Cantidad = Int(Valor)
    ValorEntero = Cantidad
    Centavos = (Valor - Cantidad) * 100
    Unidades = Array("UN", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE", "DIEZ", "ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIECISEIS", "DIECISIETE", "DIECIOCHO", "DIECINUEVE", "VEINTE", "VEINTIUN", "VEINTIDOS", "VEINTITRES", "VEINTICUATRO", "VEINTICINCO", "VEINTISEIS", "VEINTISIETE", "VEINTIOCHO", "VEINTINUEVE")
    Decenas = Array("DIEZ", "VEINTE", "TREINTA", "CUARENTA", "CINCUENTA", "SESENTA", "SETENTA", "OCHENTA", "NOVENTA")
    Centenas = Array("CIENTO", "DOSCIENTOS", "TRESCIENTOS", "CUATROCIENTOS", "QUINIENTOS", "SEISCIENTOS", "SETECIENTOS", "OCHOCIENTOS", "NOVECIENTOS")
    NumeroBloques = 1
 
    Do
        PrimerDigito = 0
        SegundoDigito = 0
        TercerDigito = 0
        Bloque = ""
        BloqueCero = 0
        For I = 1 To 3
            Digito = Cantidad Mod 10
            If Digito <> 0 Then
                Select Case I
                Case 1
                    Bloque = " " & Unidades(Digito - 1)
                    PrimerDigito = Digito
                Case 2
                    If Digito <= 2 Then
                        Bloque = " " & Unidades((Digito * 10) + PrimerDigito - 1)
                    Else
                        Bloque = " " & Decenas(Digito - 1) & IIf(PrimerDigito <> 0, " Y", Null) & Bloque
                    End If
                    SegundoDigito = Digito
                Case 3
                    Bloque = " " & IIf(Digito = 1 And PrimerDigito = 0 And SegundoDigito = 0, "CIEN", Centenas(Digito - 1)) & Bloque
                    TercerDigito = Digito
                End Select
            Else
                BloqueCero = BloqueCero + 1
            End If
            Cantidad = Int(Cantidad / 10)
            If Cantidad = 0 Then
                Exit For
            End If
        Next I
        Select Case NumeroBloques
            Case 1
                NumLetras = Bloque
            Case 2
                NumLetras = Bloque & IIf(BloqueCero = 3, Null, " MIL") & NumLetras
            Case 3
                NumLetras = Bloque & IIf(PrimerDigito = 1 And SegundoDigito = 0 And TercerDigito = 0, " MILLON", " MILLONES") & NumLetras
        End Select
        NumeroBloques = NumeroBloques + 1
    Loop Until Cantidad = 0
 
 
    If Valor >= 1000000000 Then
        Dim millardos As Currency
        Dim millarodsInt As Integer
        Dim letras_Millardos As String
        millarodsInt = Int(Valor / 1000000000)
        millardos = millarodsInt
     
        letras_Millardos = Replace(Trim(NumLetras(millardos)), "00/100", IIf(millarodsInt = 1, "MIL MILLONES", "MIL MILLONES"))
        NumLetras = letras_Millardos & NumLetras
    End If
 
    NumLetras = Trim(NumLetras) & " " & Format(Str(Centavos), "00") & "/100 " & IIf(ValorEntero = 1, MonedaSingular, MonedaPlural)
End Function









25 comentarios :

  1. Gracias, gracias. Me sirvió el código 100%

    ResponderBorrar
    Respuestas
    1. Me da mucho gusto que te haya funcionado. Gracias por visita

      Borrar
  2. Lo usé en access y funcionó perfectamente.

    ResponderBorrar
  3. Muchas gracias, programa muy eficiente!!!

    ResponderBorrar
    Respuestas
    1. Me da mucho gusto que te haya servido, regresa pronto al blog

      Borrar
  4. hola me funciona de maravilla pero cuando cuando tengo cantidades de DOS MILLARDOS no los convierte en letra cual seria la solucion

    ResponderBorrar
  5. QUE CAMBIO PODRIA HACER PARA QUE FUNCIONE CON NUMEROS
    NEGATIVOS?

    ResponderBorrar
    Respuestas
    1. te recomiendo concatenar el signo o la palabra que quieres que salga

      Borrar
  6. Hola, si quisiera que al final salga la palabra SOLES, como debo hacer? ya que el resultado me arroja MN al final

    ResponderBorrar
  7. Disculpa como puede hacer para que entes de los centavos venga la palabra PESOS

    ResponderBorrar
    Respuestas
    1. tienes que cambiar esto:
      NumLetras = Trim(NumLetras) & " " & Format(Str(Centavos), "00") & "/100 " & IIf(ValorEntero = 1, MonedaSingular, MonedaPlural)

      por esto:

      NumLetras = Trim(NumLetras) & " " & Format(Str(Centavos), "Pesos 00") & "/100 " & IIf(ValorEntero = 1, MonedaSingular, MonedaPlural)

      Borrar
  8. Buenos dias
    Al utilizar la macro el numero es este 6749,62 y me lee seis mil setecientos cuarenta y nueve 62/100.
    Habría forma de cambiar el 62/100 por "con sesenta y dos"

    muchas gracias

    ResponderBorrar