Factura en Excel Parte 6 – Convertir cantidades y números a letras
PREVIO: FACTURA EN EXCEL PARTE 5
Cuando pensaba que el proyecto de Factura en Excel había finalizado, se me ocurre introducirle una nueva característica, que es la de Convertir números a letras, que justamente es un tema que tocamos en mi Curso de macros y VBA.
Recordemos que este proyecto nos permitirá tener un proyecto de una Factura automatizada, donde:
-
Vamos a dar de alta facturas.
-
Guardar las facturas en formato PDF.
-
Reimprimir facturas.
-
Enviar las facturas por email.
-
Mostrar la cantidades en letra.
Ver video Factura en Excel Parte 6
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Función UDF para Convertir números a letras
Nos vamos a nuestro capítulo 36 de nuestro Curso de VBA y macros y copiamos el código de la función UDF llamada cMoneda2. Pegamos el código en un módulo normal.
Recordemos que las funciones UDF las podemos llamar desde otros procedimientos o macro y desde celdas de Excel.
La función cMoneda2 tendrá lo siguientes parámetros:
|
Argumento |
Descripción |
|
Num |
El número que se desea convertir a texto. |
|
TipoCambio1 |
El tipo de moneda en singular. PESO |
|
TipoCambio2 |
El tipo de moneda en plural. PESOS |
|
Centavos |
Opcional. Devuelve el valor de centavos en texto o número. Ejemplo 10.80: 0 = 88/100, 1 = Ochenta y ocho centavos |
|
Denominación |
Opcional. En caso de querer mostrar el valor de M.N. (moneda nacional) u otro según el país. |
Ejemplo 1
[B4] = cMoneda2(A4,”PESO”,”PESOS”,1,”M.N.”)
95.43 = NOVENTA Y CINCO PESOS CON CUARENTA Y TRES CENTAVOS M.N.
Ejemplo 2
[B5] = cMoneda2(A5,”PESO”,”PESOS”,0,”M.N.”)
95.43 = NOVENTA Y CINCO PESOS 43/100 M.N.
Ejemplo 3
[B6] = =cMoneda2(A6,”PESO”,”PESOS”,1)
95.43 = NOVENTA Y CINCO PESOS CON CUARENTA Y TRES CENTAVOS
Figura 1. Función para convertir números a letras en Excel.
Código VBA de la macro
'========================================================================
' Función: Convertir números a letras
'
' Creado por Otto Javier González
' www.youtube.com/ottojaviergonzalez
' Finalizado el 4 de Julio de 2013
'
' Visual Basic Para Microsoft Excel 2013
' Lista de reproducción del curso en YouTube:
' http://www.youtube.com/playlist?list=PLFNWPvtjBMjtnYLCp8KJwD1Ref7WLCIVZ
'
' Modificada por: Sergio Alejandro Campos, MVP Excel (18-jul-2019)
' Canal de Youtube EXCELeINFO, curso de macros:
' https://www.youtube.com/playlist?list=PLu8wBtXk2ly6-0LtqcC2aj4g6cEnJ-_nN
'========================================================================
Option Explicit
Function cMoneda2(num As Double, TipoCambio1 As String, TipoCambio2 As String, Optional Centavos As Byte, Optional Denominacion As String) As String
Dim nEntero As Long
Dim nDecimal As Double
Dim Texto As String
nEntero = Int(num)
nDecimal = Int(Round((num - nEntero) * 100)) 'Corrección de últimoo momento
Texto = cNumero(nEntero)
' Agrega la moneda
If nEntero = 1 Then
Texto = Texto + " " + TipoCambio1
'Texto = Texto + " Dólar"
Else
If (nEntero Mod 1000000) = 0 Then
Texto = Texto + " De"
End If
Texto = Texto + " " + TipoCambio2
'Texto = Texto + " Dólares"
End If
'Agrega los centavos
If Centavos = 1 Then
If nDecimal <> 0 Then
Texto = Texto & " Con " & cNumero(nDecimal)
If nDecimal = 1 Then
Texto = Texto & " Centavo"
Else
Texto = Texto & " Centavos"
End If
End If
ElseIf Centavos = 0 Then
If nDecimal <> 0 Then
Texto = Texto
If nDecimal = 1 Then
Texto = Texto & nDecimal & "/100"
Else
Texto = Texto & " " & nDecimal & "/100"
End If
End If
End If
cMoneda2 = VBA.UCase(Texto) & " " & Denominacion
End Function
Function cNumero(ByVal num As Long) As String
Dim Texto As String
Dim cUnidades, cDecenas, cCentenas
Dim nUnidades, nDecenas, nCentenas As Byte
Dim nMiles As Long
Dim nMillones As Long
cUnidades = Array("", "Un", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve", "Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciseis", "Diecisite", "Dieciocho", "Diecinueve", "Veinte", "Veintiuno", "Veintidós", "Veintitrés", "Veitnicuatro", "Veinticinco", "Veintiseis", "Veintisiete", "Veintiocho", "Veintinueve")
cDecenas = Array("", "Diez", "Veinte", "Treinta", "Cuarenta", "Cincuenta", "Sesenta", "Setenta", "Ochenta", "Noventa", "Cien")
cCentenas = Array("", "Ciento", "Doscientos", "Trescientos", "Cuatrocientos", "Quinientos", "Seiscientos", "Setecientos", "Ochocientos", "Novecientos")
nMillones = num \ 1000000
nMiles = (num \ 1000) Mod 1000
nCentenas = (num \ 100) Mod 10
nDecenas = (num \ 10) Mod 10
nUnidades = num Mod 10
'Evaluación de Millones
If nMillones = 1 Then
Texto = "Un Millón" + IIf(num Mod 1000000 <> 0, " " + cNumero(num Mod 1000000), "")
cNumero = Texto
Exit Function
ElseIf nMillones >= 2 And nMillones <= 999 Then
Texto = cNumero(num \ 1000000) + " Millones" + IIf(num Mod 1000000 <> 0, " " + cNumero(num Mod 1000000), "")
cNumero = Texto
Exit Function
'Evaluación de Miles
ElseIf nMiles = 1 Then
Texto = "Mil" + IIf(num Mod 1000 <> 0, " " + cNumero(num Mod 1000), "")
cNumero = Texto
Exit Function
ElseIf nMiles >= 2 And nMiles <= 999 Then
Texto = cNumero(num \ 1000) + " Mil" + IIf(num Mod 1000 <> 0, " " + cNumero(num Mod 1000), "")
cNumero = Texto
Exit Function
End If
'Evaluación desde 0 a 999
'Casos Especiales
If num = 100 Then
Texto = cDecenas(10)
cNumero = Texto
Exit Function
ElseIf num = 0 Then
Texto = "Cero"
cNumero = Texto
Exit Function
End If
If nCentenas <> 0 Then
Texto = cCentenas(nCentenas)
End If
If nDecenas <> 0 Then
If nDecenas = 1 Or nDecenas = 2 Then
If nCentenas <> 0 Then
Texto = Texto + " "
End If
Texto = Texto + cUnidades(num Mod 100)
cNumero = Texto
Exit Function
Else
If nCentenas <> 0 Then
Texto = Texto + " "
End If
Texto = Texto + cDecenas(nDecenas)
End If
End If
If nUnidades <> 0 Then
If nDecenas <> 0 Then
Texto = Texto + " y "
ElseIf nCentenas <> 0 Then
Texto = Texto + " "
End If
Texto = Texto + cUnidades(nUnidades)
End If
cNumero = Texto
End Function
Descarga el archivo de ejemplo
Factura en Excel Parte 6 – Convertir cantidades y números a letras.zip
Si te gustó este tutorial por favor regístrate en nuestra Lista de correo y Suscríbete a nuestro canal de YouTube para que estés siempre enterado de lo nuevo que publicamos.

