¿Qué fórmula aplico para convertir números a letras en excel?

Me gustaría saber que fórmula aplico para convertir números a letras en excel.

Ejemplo si en una celda coloco el valor 12'000.000 como hago para que en otra celda cualquiera me aparezca doce millones de pesos M/C

2 respuestas

Respuesta
6

Te anexo una función.

Function CONVERTIRNUM(Numero As Double, Optional CentimosEnLetra As Boolean) As String
Dim Moneda As String
Dim Monedas As String
Dim Centimo As String
Dim Centimos As String
Dim Preposicion As String
Dim NumCentimos As Double
Dim Letra As String
Const Maximo = 1999999999999.99
'************************************************************
' Parámetros
'************************************************************
Moneda = "Peso"         'Nombre de Moneda (Singular)
Monedas = "Pesos"       'Nombre de Moneda (Plural)
Centimo = "Centavo"     'Nombre de Céntimos (Singular)
Centimos = "Centavos"   'Nombre de Céntimos (Plural)
Preposicion = "Con"     'Preposición entre Moneda y Céntimos
'************************************************************
'Validar que el Numero está dentro de los límites
If (Numero >= 0) And (Numero <= Maximo) Then
    Letra = NUMERORECURSIVO((Fix(Numero)))              'Convertir el Numero en letras
    'Si Numero = 1 agregar leyenda Moneda (Singular)
    If (Numero = 1) Then
        Letra = Letra & " " '& Moneda
    'De lo contrario agregar leyenda Monedas (Plural)
    Else
        Letra = Letra & " " '& Monedas
    End If
    'NumCentimos = Round((Numero - Fix(Numero)) * 100)   'Obtener los centimos del Numero
    NumCentimos = Round((Numero - Fix(Numero)) * 10)   'Obtener los centimos del Numero
    'Si NumCentimos es mayor a cero inicar la conversión
    If NumCentimos >= 0 Then
        'Si el parámetro CentimosEnLetra es VERDADERO obtener letras para los céntimos
        If CentimosEnLetra Then
            Letra = Letra & " " & Preposicion & " " & NUMERORECURSIVO(Fix(NumCentimos)) 'Convertir los céntimos en letra
            'Si NumCentimos = 1 agregar leyenda Centimos (Singular)
            If (NumCentimos = 1) Then
                Letra = Letra & " " '& Centimo
            'De lo contrario agregar leyenda Centimos (Plural)
            Else
                Letra = Letra & " " '& Centimos
            End If
         'De lo contrario mostrar los céntimos como número
         Else
            If NumCentimos < 10 Then
                'Letra = Letra & " 0" & NumCentimos & "/100"
            Else
                'Letra = Letra & " " & NumCentimos & "/100"
            End If
         End If
    End If
    If Right(Letra, 9) = "Millones " Then
        Letra = Letra & "de "
    End If
    'Regresar el resultado final de la conversión
    CONVERTIRNUM = Letra & " pesos M/C"
Else
    'Si el Numero no está dentro de los límites, entivar un mensaje de error
    CONVERTIRNUM = "ERROR: El número excede los límites."
End If
End Function
Function NUMERORECURSIVO(Numero As Long) As String
Dim Unidades, Decenas, Centenas
Dim Resultado As String
'**************************************************
' Nombre de los números
'**************************************************
Unidades = Array("", "Un", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve", "Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciséis", "Diecisiete", "Dieciocho", "Diecinueve", "Veinte", "Veintiuno", "Veintidos", "Veintitres", "Veinticuatro", "Veinticinco", "Veintiseis", "Veintisiete", "Veintiocho", "Veintinueve")
Decenas = Array("", "Diez", "Veinte", "Treinta", "Cuarenta", "Cincuenta", "Sesenta", "Setenta", "Ochenta", "Noventa", "Cien")
Centenas = Array("", "Ciento", "Doscientos", "Trescientos", "Cuatrocientos", "Quinientos", "Seiscientos", "Setecientos", "Ochocientos", "Novecientos")
'**************************************************
Select Case Numero
    Case 0
        Resultado = "Cero"
    Case 1 To 29
        Resultado = Unidades(Numero)
    Case 30 To 100
        Resultado = Decenas(Numero \ 10) + IIf(Numero Mod 10 <> 0, " y " + NUMERORECURSIVO(Numero Mod 10), "")
    Case 101 To 999
        Resultado = Centenas(Numero \ 100) + IIf(Numero Mod 100 <> 0, " " + NUMERORECURSIVO(Numero Mod 100), "")
    Case 1000 To 1999
        Resultado = "Mil" + IIf(Numero Mod 1000 <> 0, " " + NUMERORECURSIVO(Numero Mod 1000), "")
    Case 2000 To 999999
        Resultado = NUMERORECURSIVO(Numero \ 1000) + " Mil" + IIf(Numero Mod 1000 <> 0, " " + NUMERORECURSIVO(Numero Mod 1000), "")
    Case 1000000 To 1999999
        Resultado = "Un Millón" + IIf(Numero Mod 1000000 <> 0, " " + NUMERORECURSIVO(Numero Mod 1000000), "")
    Case 2000000 To 1999999999
        Resultado = NUMERORECURSIVO(Numero \ 1000000) + " Millones" + IIf(Numero Mod 1000000 <> 0, " " + NUMERORECURSIVO(Numero Mod 1000000), "")
End Select
NUMERORECURSIVO = Resultado
End Function

Sigue las Instrucciones para una Función

  1. Abre tu libro de excel
  2. Para abrir VBa y poder pegar la función, Presiona Alt + F11
  3. En el menú elige Insertar / Módulo
  4. En el panel del lado derecho copia la función
  5. En cualquier celda utiliza la función, como cualquier otra función de excel

Por ejemplo, si en la celda B3, tienes 12,000,000. En la celda C3, escribe la siguiente fórmula:

=CONVERTIRNUM(B3)

Imagen:


Saludos. Dante Amor

¡Gracias! 

Te felicito... eres un duro..

Agrego una versión para @juan hernandez.

Function CONVERTIRNUM(Numero As Double, Optional CentimosEnLetra As Boolean) As String
  Dim Moneda As String
  Dim Monedas As String
  Dim Centimo As String
  Dim Centimos As String
  Dim Preposicion As String
  Dim NumCentimos As Long
  Dim Letra As String
  Const Maximo = 1999999999999.99
  '************************************************************
  ' Parámetros
  '************************************************************
  Moneda = "Peso"         'Nombre de Moneda (Singular)
  Monedas = "Pesos"       'Nombre de Moneda (Plural)
  Centimo = "Centavo"     'Nombre de Céntimos (Singular)
  Centimos = "Centavos"   'Nombre de Céntimos (Plural)
  Preposicion = "Con"     'Preposición entre Moneda y Céntimos
  '************************************************************
  'Validar que el Numero está dentro de los límites
  If (Numero >= 0) And (Numero <= Maximo) Then
    Letra = NUMERORECURSIVO((Fix(Numero)))              'Convertir el Numero en letras
    'Si Numero = 1 agregar leyenda Moneda (Singular)
    If (Numero = 1) Then
        Letra = Letra & " " '& Moneda
    'De lo contrario agregar leyenda Monedas (Plural)
    Else
        Letra = Letra & " " '& Monedas
    End If
    NumCentimos = (Numero - Fix(Numero)) * 100  'Obtener los centimos del Numero
    If NumCentimos >= 0 Then
      'Si el parámetro CentimosEnLetra es VERDADERO obtener letras para los céntimos
      If CentimosEnLetra Then
          Letra = Letra & " " & Preposicion & " " & NUMERORECURSIVO(Fix(NumCentimos)) 'Convertir los céntimos en letra
          'Si NumCentimos = 1 agregar leyenda Centimos (Singular)
          If (NumCentimos = 1) Then
              Letra = Letra & " " '& Centimo
          'De lo contrario agregar leyenda Centimos (Plural)
          Else
              Letra = Letra & " " '& Centimos
          End If
       'De lo contrario mostrar los céntimos como número
       Else
          Letra = Letra & " pesos con " & Format(NumCentimos, "00") & "/100 M.N."
       End If
    End If
    If Right(Letra, 9) = "Millones " Then
        Letra = Letra & "de "
    End If
    'Regresar el resultado final de la conversión
    CONVERTIRNUM = Letra
  Else
    'Si el Numero no está dentro de los límites, entivar un mensaje de error
    CONVERTIRNUM = "ERROR: El número excede los límites."
  End If
End Function
Function NUMERORECURSIVO(Numero As Long) As String
  Dim Unidades, Decenas, Centenas
  Dim Resultado As String
  '**************************************************
  ' Nombre de los números
  '**************************************************
  Unidades = Array("", "Un", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve", "Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciséis", "Diecisiete", "Dieciocho", "Diecinueve", "Veinte", "Veintiuno", "Veintidos", "Veintitres", "Veinticuatro", "Veinticinco", "Veintiseis", "Veintisiete", "Veintiocho", "Veintinueve")
  Decenas = Array("", "Diez", "Veinte", "Treinta", "Cuarenta", "Cincuenta", "Sesenta", "Setenta", "Ochenta", "Noventa", "Cien")
  Centenas = Array("", "Ciento", "Doscientos", "Trescientos", "Cuatrocientos", "Quinientos", "Seiscientos", "Setecientos", "Ochocientos", "Novecientos")
  '**************************************************
  Select Case Numero
    Case 0
        Resultado = "Cero"
    Case 1 To 29
        Resultado = Unidades(Numero)
    Case 30 To 100
        Resultado = Decenas(Numero \ 10) + IIf(Numero Mod 10 <> 0, " y " + NUMERORECURSIVO(Numero Mod 10), "")
    Case 101 To 999
        Resultado = Centenas(Numero \ 100) + IIf(Numero Mod 100 <> 0, " " + NUMERORECURSIVO(Numero Mod 100), "")
    Case 1000 To 1999
        Resultado = "Mil" + IIf(Numero Mod 1000 <> 0, " " + NUMERORECURSIVO(Numero Mod 1000), "")
    Case 2000 To 999999
        Resultado = NUMERORECURSIVO(Numero \ 1000) + " Mil" + IIf(Numero Mod 1000 <> 0, " " + NUMERORECURSIVO(Numero Mod 1000), "")
    Case 1000000 To 1999999
        Resultado = "Un Millón" + IIf(Numero Mod 1000000 <> 0, " " + NUMERORECURSIVO(Numero Mod 1000000), "")
    Case 2000000 To 1999999999
        Resultado = NUMERORECURSIVO(Numero \ 1000000) + " Millones" + IIf(Numero Mod 1000000 <> 0, " " + NUMERORECURSIVO(Numero Mod 1000000), "")
  End Select
  NUMERORECURSIVO = Resultado
End Function
Respuesta

Maestro Dante las funciones están muy limitadas, por ejemplo.

¿

? CONVERTIRNUM(11112556893.20) genera "Desbordamiento" y tiene otras fallas

Es nuestro caso por la devaluación es necesario convertir cifras mayores.

El valor correcto para convertir este número es:
Once mil ciento doce millones quinientos cincuenta y seis mil ochocientos noventa y tres pesos con veinte centavos

Le dejo como complemento esta función

Public Function Convertir(Valor As String) As String
Dim Decimales As String
Dim Resultado As String
Dim Negativo As String
Dim Cent As String
    If IsNull(Valor) Then
        Exit Function
    Else
        If Not IsNumeric(Valor) Then
            Exit Function
        End If
    End If
    If Valor >= 1E+18 Then
        MsgBox "La cantidad introducida excede el límite." & vbCrLf & "La cantidad máxima permitida es de un trillón.", vbInformation
    End If
    If Valor < 0 Then
        Negativo = "menos"
    End If
    'Separamos la parte entera de la decimal.
    Decimales = mid(Format(Valor, "##0.00"), InStr(1, Format(Valor, "##0.00"), ",", vbTextCompare) + 1)
    Valor = mid(Format(Valor, "##0.00"), 1, InStr(1, Format(Valor, "##0.00"), ",", vbTextCompare) - 1)
    If Valor < 0 Then
        Valor = -Valor
    End If
    If Valor < 1000000 Then
        Resultado = MenorMilio(Valor)
    End If
    If Valor >= 1000000 And Valor < 1000000000000# Then
        Resultado = MenorMilio(Int(Valor / 1000000)) & " "
        Resultado = Resultado & IIf(Int(Valor / 1000000) = 1, "millón", "millones")
        Resultado = Resultado & " " & MenorMilio(Valor - (Int(Valor / 1000000) * 1000000))
    End If
    If Valor >= 1000000000000# And Valor < 1E+18 Then
        Resultado = MenorMilio(Int(Valor / 1000000000000#)) & " "
        Resultado = Resultado & IIf(Int(Valor / 1000000000000#) = 1, "billón", "billones")
        If Valor - (Int(Valor / 1000000000000#) * 1000000000000#) >= 1000000 Then
            Resultado = Resultado & " " & MenorMilio(Int((Valor - (Int(Valor / 1000000000000#) * 1000000000000#)) / 1000000)) & " "
            Resultado = Resultado & IIf(Int((Valor - (Int(Valor / 1000000000000#) * 1000000000000#)) / 1000000) = 1, "milio", "milions")
            Resultado = Resultado & " " & MenorMilio((CDec(Valor) - (Int(Valor / 1000000000000#) * 1000000000000#)) - (Int((Valor - (Int(Valor / 1000000000000#) * 1000000000000#)) / 1000000) * 1000000))
        End If
        Resultado = Resultado & " " & MenorMilio(CDec(Valor) - (Int(Valor / 1000000000000#) * 1000000000000#))
    End If
    'Tratamiento de decimales
    If Decimales <> "" Then
        Decimales = MenorCent(Decimales)
    End If
    Resultado = Resultado & Switch(Round(Valor, 0) = 0, "", Valor < 2, " Euro", Valor >= 2, " pesos")
    'Con esta condición controlo si es un céntimo o más de uno
    Cent = IIf(Decimales <> "un", " centavos", " centavo")
    If Round(Valor, 0) = 0 Then
        Resultado = IIf(Decimales <> "", Decimales & Cent, "")
    Else
        Resultado = Resultado & IIf(Decimales <> "", " con " & Decimales & Cent, "")
    End If
    Resultado = IIf(Negativo <> "", Negativo & " ", "") & Resultado
    'Retorno el resultado en letras
    Convertir = Resultado
End Function
Public Function Menor21(Valor As String) As String
         If Valor = 0 Then Menor21 = ""
         If Valor = 1 Then Menor21 = "un"
         If Valor = 2 Then Menor21 = "dos"
         If Valor = 3 Then Menor21 = "tres"
         If Valor = 4 Then Menor21 = "cuatro"
         If Valor = 5 Then Menor21 = "cinco"
         If Valor = 6 Then Menor21 = "seis"
         If Valor = 7 Then Menor21 = "siete"
         If Valor = 8 Then Menor21 = "ocho"
         If Valor = 9 Then Menor21 = "nueve"
         If Valor = 10 Then Menor21 = "diez"
         If Valor = 11 Then Menor21 = "once"
         If Valor = 12 Then Menor21 = "doce"
         If Valor = 13 Then Menor21 = "trece"
         If Valor = 14 Then Menor21 = "catorce"
         If Valor = 15 Then Menor21 = "quince"
         If Valor = 16 Then Menor21 = "dieciseis"
         If Valor = 17 Then Menor21 = "diecisiete"
         If Valor = 18 Then Menor21 = "dieciocho"
         If Valor = 19 Then Menor21 = "diecinueve"
         If Valor = 20 Then Menor21 = "veinte"
End Function
Public Function MenorCent(Valor As String) As String
    If Val(Valor) <= 20 Then MenorCent = Menor21(Valor)
    If Val(Valor) > 20 And Val(Valor) < 30 Then MenorCent = "veinti" & Menor21(Valor - 20)
    If Val(Valor) = 30 Then MenorCent = "treinta"
    If Val(Valor) > 30 And Val(Valor) < 40 Then MenorCent = "treinta y " & Menor21(Valor - 30)
    If Val(Valor) = 40 Then MenorCent = "cuarenta"
    If Val(Valor) > 40 And Val(Valor) < 50 Then MenorCent = "cuarenta y " & Menor21(Valor - 40)
    If Val(Valor) = 50 Then MenorCent = "cincuenta"
    If Val(Valor) > 50 And Val(Valor) < 60 Then MenorCent = "cincuenta y " & Menor21(Valor - 50)
    If Val(Valor) = 60 Then MenorCent = "sesenta"
    If Val(Valor) > 60 And Val(Valor) < 70 Then MenorCent = "sesenta y " & Menor21(Valor - 60)
    If Val(Valor) = 70 Then MenorCent = "setenta"
    If Val(Valor) > 70 And Val(Valor) < 80 Then MenorCent = "setenta y " & Menor21(Valor - 70)
    If Val(Valor) = 80 Then MenorCent = "ochenta"
    If Val(Valor) > 80 And Val(Valor) < 90 Then MenorCent = "ochenta y " & Menor21(Valor - 80)
    If Val(Valor) = 90 Then MenorCent = "noventa"
    If Val(Valor) > 90 And Val(Valor) < 100 Then MenorCent = "noventa y " & Menor21(Valor - 90)
End Function
Public Function MenorMil(Valor As String) As String
    Dim Numero As String  'Compruebo si el numero es 9, le cambio el formato a "nove" para las centenas
    If Valor < 100 Then MenorMil = MenorCent(Valor)
    If Valor = 100 Then MenorMil = "cien"
    If Valor > 100 And Valor < 200 Then MenorMil = "ciento " & MenorCent(Valor Mod 100)
    If Valor >= 200 Then
        Numero = Menor21(Valor \ 100)
        Select Case Numero
            Case "cinco"
                Numero = "quiniento"
                MenorMil = Numero & IIf(Valor > 199, "s", "") & " " & MenorCent(Valor Mod 100)
            Case "siete"
                Numero = "sete"
                MenorMil = Numero & "ciento" & IIf(Valor > 199, "s", "") & " " & MenorCent(Valor Mod 100)
            Case "nueve"
                Numero = "nove"
                MenorMil = Numero & "ciento" & IIf(Valor > 199, "s", "") & " " & MenorCent(Valor Mod 100)
            Case Else
                MenorMil = Numero & "ciento" & IIf(Valor > 199, "s", "") & " " & MenorCent(Valor Mod 100)
        End Select
    End If
End Function
Public Function MenorMilio(Valor As String) As String
    If Valor < 1000 Then
        MenorMilio = MenorMil(Valor)
    End If
    If Valor = 1000 Then
        MenorMilio = "mil"
    End If
    If Valor > 1000 And Valor < 1000000 Then
        MenorMilio = IIf(Valor \ 1000 = 1, "mil ", MenorMil(Valor \ 1000) & " mil ") & MenorMil(Valor Mod 1000)
    End If
End Function

Ejemplo de llamada

¿

? Convertir(11112556893.20)
Once mil ciento doce millones quinientos cincuenta y seis mil ochocientos noventa y tres pesos con veinte centavos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas