Convertir número a letras en Excel: macro lista para pegar

Published On:
Un estuche de madera con cinco huecos para pesas de latón; cuatro están ocupados y la quinta pesa, con el botón verde, cae sobre el hueco vacío.

Excel no trae ninguna función para escribir un número con letra: hay que añadirla con una macro. Pega la función NumeroALetras en un módulo de VBA y escribe =NumeroALetras(A1): la cantidad 1234,56 pasa a «mil doscientos treinta y cuatro pesos con cincuenta y seis centavos».

Quien tiene poco tiempo puede ir al final. Allí está el ejercicio.

Por qué Excel no lo hace solo

Porque no existe una función predeterminada para eso. Lo confirma una respuesta de Microsoft en su comunidad de soporte: la salida que propone es pegar una función propia en un módulo de VBA. La que ofrece Microsoft escribe dólares y centavos en inglés; la de abajo está hecha para el español.

El mecanismo: cinco pasos

  1. Abre el libro en Excel y pulsa Alt + F11 para abrir el Editor de Visual Basic.
  2. En el menú Insertar, elige Módulo.
  3. Pega el código de más abajo en la ventana del módulo.
  4. Cierra el editor.
  5. Guarda el libro como Libro de Excel habilitado para macros (*.xlsm): un archivo .xlsx no conserva las macros.

Una macro puede hacer cualquier cosa en tu equipo, así que léela antes de pegarla. Esta solo calcula texto: no abre archivos ni se conecta a internet.

Option Explicit

' Convierte un numero en letras, en espanol (RAE). Ejemplo: =NumeroALetras(1234,56)
' Admite de 0 a 999 999 999 999,99. Uso:
'   =NumeroALetras(A1)                              -> pesos y centavos
'   =NumeroALetras(A1;"dólar";"dólares")           -> otra moneda
'   =NumeroALetras(A1;"";"")                        -> sin moneda
Function NumeroALetras(ByVal Valor As Variant, Optional ByVal Singular As String = "peso", Optional ByVal Plural As String = "pesos", Optional ByVal Centavo As String = "centavo", Optional ByVal Centavos As String = "centavos") As String
    Dim n As Double, cents As Double, ent As Double, ce As Long, t As String
    If Not IsNumeric(Valor) Then
        NumeroALetras = "Valor no numérico"
        Exit Function
    End If
    n = CDbl(Valor)
    If n < 0 Or n >= 1000000000000# Then
        NumeroALetras = "Fuera de rango"
        Exit Function
    End If
    cents = Int(n * 100# + 0.5 + 0.000000001)
    ent = Int(cents / 100#)
    ce = CLng(cents - ent * 100#)
    Dim ConMoneda As Boolean
    ConMoneda = (Singular <> "" Or Plural <> "")
    t = Entero(ent, ConMoneda)
    If ent >= 1000000# And ent - Int(ent / 1000000#) * 1000000# = 0 Then t = t & " de"
    If ent = 1 Then
        If Singular <> "" Then t = t & " " & Singular
    Else
        If Plural <> "" Then t = t & " " & Plural
    End If
    If ce > 0 Then
        t = t & " con " & Entero(CDbl(ce), ConMoneda)
        If ce = 1 Then
            If Centavo <> "" Then t = t & " " & Centavo
        Else
            If Centavos <> "" Then t = t & " " & Centavos
        End If
    End If
    NumeroALetras = t
End Function

Private Function Entero(ByVal n As Double, ByVal ApocFinal As Boolean) As String
    Dim hi As Double, lo As Double, s As String
    If n = 0 Then
        Entero = "cero"
        Exit Function
    End If
    hi = Int(n / 1000000#)
    lo = n - hi * 1000000#
    If hi > 0 Then
        If hi = 1 Then
            s = "un millón"
        Else
            s = Grupo(CLng(hi), True) & " millones"
        End If
    End If
    If lo > 0 Then
        If s <> "" Then s = s & " "
        s = s & Grupo(CLng(lo), ApocFinal)
    End If
    Entero = s
End Function

Private Function Grupo(ByVal n As Long, ByVal Apoc As Boolean) As String
    Dim m As Long, r As Long, s As String, w As String
    m = n \ 1000
    r = n Mod 1000
    If m > 0 Then
        If m = 1 Then
            s = "mil"
        Else
            s = Apocopar(MenosDeMil(m)) & " mil"
        End If
    End If
    If r > 0 Then
        w = MenosDeMil(r)
        If Apoc Then w = Apocopar(w)
        If s <> "" Then s = s & " "
        s = s & w
    End If
    Grupo = s
End Function

Private Function MenosDeMil(ByVal n As Long) As String
    Dim c As Long, r As Long, s As String
    Dim uni As Variant, dec As Variant, cen As Variant
    uni = Array("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")
    dec = Array("", "", "", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa")
    cen = Array("", "ciento", "doscientos", "trescientos", "cuatrocientos", "quinientos", "seiscientos", "setecientos", "ochocientos", "novecientos")
    If n = 100 Then
        MenosDeMil = "cien"
        Exit Function
    End If
    c = n \ 100
    r = n Mod 100
    If c > 0 Then s = cen(c)
    If r > 0 Then
        If s <> "" Then s = s & " "
        If r < 30 Then
            s = s & uni(r)
        ElseIf r Mod 10 = 0 Then
            s = s & dec(r \ 10)
        Else
            s = s & dec(r \ 10) & " y " & uni(r Mod 10)
        End If
    End If
    MenosDeMil = s
End Function

Private Function Apocopar(ByVal s As String) As String
    If Right(s, 9) = "veintiuno" Then
        Apocopar = Left(s, Len(s) - 9) & "veintiún"
    ElseIf Right(s, 3) = "uno" Then
        Apocopar = Left(s, Len(s) - 3) & "un"
    Else
        Apocopar = s
    End If
End Function

Cómo se usa

Fórmula Resultado
=NumeroALetras(A1) con 21 en A1 veintiún pesos
=NumeroALetras(1000000) un millón de pesos
=NumeroALetras(A1;"dólar";"dólares") con 1 en A1 un dólar
=NumeroALetras(A1;"";"") con 21 en A1 veintiuno
=MAYUSC(NumeroALetras(A1)) con 16 en A1 DIECISÉIS PESOS

Según la configuración de tu Excel, los argumentos se separan con punto y coma (;) o con coma (,). Usa el que te pida tu Excel. La función escribe en minúsculas; para mayúsculas, envuélvela en MAYUSC (en Excel en inglés, UPPER).

La prueba del pariente: comprueba que está bien pegada

Escribe =NumeroALetras(21), =NumeroALetras(1000000) y =NumeroALetras(0). Deben dar veintiún pesos, un millón de pesos y cero pesos. Si los tres coinciden, la macro funciona. La función se ha comprobado con 27 importes, desde 0 hasta 999 999 999 999,99.

Lo que no hace

Llega hasta 999 999 999 999,99 y solo escribe monedas masculinas: con un sustantivo femenino habría que cambiar un por una a mano. Si prefieres no usar macros, escribe la cantidad en el conversor de número a letras y copia el resultado.

Las reglas salen del artículo «cardinales» del Diccionario panhispánico de dudas.

Practica: ¿qué devuelve la fórmula?

Cuatro casos.

1. =NumeroALetras(21)

👉 veintiún pesos: uno se acorta delante del sustantivo.

2. =NumeroALetras(1000000)

👉 un millón de pesos: millón solo pide de.

3. =NumeroALetras(0)

👉 cero pesos: el cero va con plural.

4. =NumeroALetras(1;"dólar";"dólares")

👉 un dólar: con 1 se usa el singular.

Si encuentras un error en esta página, escríbeme: se corrige y la corrección se publica.

Perfil del autor

escrituracorrecta.com
escrituracorrecta.com
Escritura Correcta la escribe una sola persona, bajo seudónimo. No soy filólogo ni corrector profesional: cada regla que se explica aquí es una que tuve que aprender de forma consciente, y por eso viene siempre con su porqué y nunca con un «como suene». Si encuentras un error, escríbeme: se corrige y la corrección se publica.