¿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
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
- Abre tu libro de excel
- Para abrir VBa y poder pegar la función, Presiona Alt + F11
- En el menú elige Insertar / Módulo
- En el panel del lado derecho copia la función
- 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
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
- Compartir 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
- Compartir respuesta
Ahí tienes un área de oportunidad. Puedes corregir el código y poner aquí tu respuesta. - Dante Amor
Hola Dante me sirvió mucho esta respuesta pero me gustaría saber que hacer si quiero que valor en letras salga todo en letra mayúscula.Gracias - Maria Fernanda
Cambia esta línea en la macro: CONVERTIRNUM = Letra & " pesos M/C" por esta: CONVERTIRNUM = Ucase(Letra) - Dante Amor
gracias, función muy bien! - Maria Fernanda
¿Hola Dante soy de Argentina que significa M/C yo necesito que me salga por ejemplo 56,20 en cincuenta y seis con 20/100 como debería hacer? - Monica Caucota
En la macro, cambia esta línea Convertirnum= Letra & " pesos M/C" por esta Convertirnum= "en " & Letraen la fórmula cambia esto =Convertirnum(B3) por esto =Convertirnum(B3,falso)&"con " &texto((B3-entero(B3))*100, "00")&"/100" - Dante Amor
hola y como puedo hacer exactamente lo mismo desde un formulario con dos textbox? - german mendoza
Pon lo siguiente en un botón en tu formularioTextbox2.value = ConvertirNum(Textbox1.value) En el textbox1 debes poner el número, las letras aparecerán en el textbox2 - Dante Amor
GRacias - Raúl Lara
Hola buen día. Excelente respuesta, ya quedo activo en mi excel. Mil gracias por tu ayuda. - RUTH GONZALEZ
Hola buenas tardes para poner los centavos como por ejemplo $23.23 se podrá poner en la lectura de la cantidad veinte y tres pesos 23/100 - Juan Hernandez
Prueba con True o Verdadero =ConvertirNUM(B3, True) - Dante Amor
Hola me da otra cantidad en cualquier 76.88 Setenta y Seis Con Nueve pesos M/N - Juan Hernandez
la cantidad seria $76.88 con letra (Setenta y seis pesos con 88/100) - Juan Hernandez
Puse una nueva versión. Debes utilizar =ConvertirNum(B3) - Dante Amor