Cómo convertir un número a letras en Excel (con macro lista para copiar)
Excel no tiene una función para escribir importes en letra. Te damos una macro probada para tener =NumeroALetras(A1) en euros y otras formas de hacerlo sin complicarte.
Si buscas en Excel una función que convierta 1.250,50 en «mil doscientos cincuenta euros con cincuenta céntimos», no la vas a encontrar: Excel no trae ninguna función para escribir números en letra en español. La única que existe, BAHTTEXT, lo hace en tailandés.
¿Lo necesitas para tus documentos? Si el importe en letra es para facturas, recibos, contratos o pagarés, en Documentemplate no tienes que hacer nada: la función ya viene incluida. Escribes
letra(total)en la plantilla y cada documento sale con su importe en letra, también cuando los generas desde tu hoja de Excel. Sin macros ni archivos.xlsm.
Si lo quieres dentro de Excel, hay tres formas de conseguirlo, según lo que necesites.
Si solo necesitas un importe: el convertidor
Para una factura, un recibo o un cheque sueltos, lo más rápido es el convertidor de números a letras: escribes la cifra, eliges la moneda y copias el texto, en minúsculas o en mayúsculas. No hace falta instalar nada.
Si lo necesitas en muchas celdas: una macro
Con una pequeña macro de VBA tendrás tu propia función, =NumeroALetras(A1), que se usa como cualquier otra fórmula.
Paso a paso
- Abre el libro y pulsa Alt + F11 para abrir el editor de Visual Basic.
- En el menú, Insertar → Módulo.
- Pega el código de abajo y cierra el editor.
- En cualquier celda, escribe
=NumeroALetras(B2), dondeB2es la celda con el importe. - Guarda el archivo como Libro de Excel habilitado para macros (.xlsm); si lo guardas como
.xlsx, la macro se pierde.
' =NumeroALetras(A1) → «mil doscientos cincuenta euros con cincuenta céntimos»
' Importes hasta 999.999.999,99 €.
Function NumeroALetras(ByVal importe As Double) As String
Dim euros As Long, centimos As Long, texto As String
If importe < 0 Then
NumeroALetras = "menos " & NumeroALetras(-importe)
Exit Function
End If
If importe >= 1000000000 Then
NumeroALetras = "Importe demasiado grande"
Exit Function
End If
euros = Int(importe)
centimos = Int((importe - euros) * 100 + 0.5)
If centimos = 100 Then
euros = euros + 1
centimos = 0
End If
If euros = 1 Then
texto = "un euro"
Else
texto = Apocope(Entero(euros))
If euros >= 1000000 And euros Mod 1000000 = 0 Then texto = texto & " de"
texto = texto & " euros"
End If
If centimos = 1 Then
texto = texto & " con un céntimo"
ElseIf centimos > 1 Then
texto = texto & " con " & Apocope(Entero(centimos)) & " céntimos"
End If
NumeroALetras = texto
End Function
Private Function Entero(ByVal n As Long) As String
Dim millones As Long, miles As Long, resto As Long, texto As String
If n = 0 Then
Entero = "cero"
Exit Function
End If
millones = n \ 1000000
miles = (n Mod 1000000) \ 1000
resto = n Mod 1000
If millones = 1 Then
texto = "un millón"
ElseIf millones > 1 Then
texto = Apocope(Centenas(millones)) & " millones"
End If
If miles = 1 Then
texto = texto & " mil"
ElseIf miles > 1 Then
texto = texto & " " & Apocope(Centenas(miles)) & " mil"
End If
If resto > 0 Then texto = texto & " " & Centenas(resto)
Entero = Trim(texto)
End Function
Private Function Centenas(ByVal n As Long) As String
Dim c As Long, r As Long, texto As String
If n = 100 Then
Centenas = "cien"
Exit Function
End If
c = n \ 100
r = n Mod 100
If c > 0 Then texto = Split("_ ciento doscientos trescientos cuatrocientos quinientos seiscientos setecientos ochocientos novecientos")(c)
If r > 0 Then
If r < 30 Then
texto = texto & " " & Split("cero uno dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce quince dieciséis diecisiete dieciocho diecinueve veinte veintiuno veintidós veintitrés veinticuatro veinticinco veintiséis veintisiete veintiocho veintinueve")(r)
Else
texto = texto & " " & Split("_ _ _ treinta cuarenta cincuenta sesenta setenta ochenta noventa")(r \ 10)
If r Mod 10 > 0 Then texto = texto & " y " & Split("cero uno dos tres cuatro cinco seis siete ocho nueve")(r Mod 10)
End If
End If
Centenas = Trim(texto)
End Function
Private Function Apocope(ByVal texto As String) As String
If Right(texto, 9) = "veintiuno" Then
Apocope = Left(texto, Len(texto) - 9) & "veintiún"
ElseIf Right(texto, 3) = "uno" Then
Apocope = Left(texto, Len(texto) - 1)
Else
Apocope = texto
End If
End Function
Trucos
- En mayúsculas, como en los cheques y pagarés:
=MAYUSC(NumeroALetras(B2)). - Redondea antes si la celda viene de un cálculo:
=NumeroALetras(REDONDEAR(B2;2)), para que los céntimos coincidan con la cifra que se ve. - Pesos en vez de euros: cambia
"un euro"por"un peso"," euros"por" pesos"y los céntimos por centavos. «Peso» es masculino, igual que «euro», así que el resto vale tal cual. - Macros y seguridad: al abrir el archivo, Excel te pedirá habilitar el contenido. Las macros no funcionan en Excel para la web ni en Google Sheets.
Las reglas que la macro ya tiene en cuenta
Escribir importes en letra tiene sus trampas, y la macro las respeta:
| Cifra | En letra |
|---|---|
| 21 € | veintiún euros (no «veintiuno euros») |
| 101 € | ciento un euros |
| 1.000.000 € | un millón de euros |
| 1.200.000 € | un millón doscientos mil euros |
| 21.000,21 € | veintiún mil euros con veintiún céntimos |
Si quieres comprobar cualquier otra, el convertidor usa exactamente las mismas reglas: la macro está probada contra él con miles de cifras.
Si el importe en letra va en documentos que generas desde Excel
Si escribes el importe en letra porque luego copias los datos de Excel a facturas, recibos o contratos, la macro te ahorra la mitad del trabajo, pero no la otra mitad.
En Documentemplate la plantilla calcula el importe en letra sola, con la fórmula letra(total), y puedes generar los documentos directamente desde tu hoja de cálculo: un PDF por fila, cada uno con su importe en cifra y en letra.
Pruébalo gratis
Deja de escribir el mismo documento a mano
Diseña la plantilla una vez en Documentemplate y genera cada factura, presupuesto o informe en segundos, con tu papelería y las cuentas hechas.