Clases Excel
Miércoles, 30 Noviembre 2016 19:00

Cómo convertir un número a su equivalente en letras en Excel (con VBA)

Valora este artículo
(0 votos)

Por alguna razón Excel nunca incluyó entre sus funciones nativas la de expresar un número como texto; por ejemplo: 123,50 en “ciento veintitrés con cincuenta”. (Tampoco la incluye ninguna otra aplicación de hoja de cálculo, que yo sepa). Pero, si te interesa incorporarla en una planilla Excel, aquí comparto el código VBA que la genera. En realidad, no es un solo código, sino dos: uno que devuelve un número genérico en letras y otro que devuelve en letras un importe al que se le puede incluir una moneda.

Números a letras en Excel 1

 

 Funciones definidas por el usuario

Excel trae casi quinientas funciones nativas, pero también nos brinda la posibilidad de crear las nuestras propias, hechas a medida, a las que denomina funciones definidas por el usuario (o UDF, por sus iniciales en inglés). En este artículo no entraremos en los detalles de la creación de dichas funciones, pero te daré todas las indicaciones para que puedas incluir funciones de terceros en un libro de Excel; más específicamente te explicaré cómo incluir las dos funciones que convierten números a sus equivalentes en letras, de las que te hablé en el comienzo.

 

 

 El Editor de VBA

El lugar designado para escribir, ver y modificar las funciones definidas por el usuario se denomina editor de Visual Basic para Aplicaciones (o editor de VBA). Para acceder a él solo tienes que usar el atajo de teclado ALT+F11 (es decir, presionar la tecla ALT y, sin soltarla, presionar F11). Se abrirá la siguiente ventana:

 

Números a letras en Excel 2

 

 

A la derecha verás una estructura de árbol, llamada el Explorador de proyectos, en la cual se puede organizar el código VBA que usemos en el libro. (Si no estuviera visible, presiona el atajo CTRL+R.)

 

Números a letras en Excel 3

 

 

Ahora crearemos un módulo, que no es otra cosa que un documento de texto donde pegaremos el código de nuestras dos funciones personalizadas. Para crearlo, puedes hacer clic en el menú Insertar y allí elegir la opción Módulo. Al final del árbol aparecerá una carpeta llamada Módulos y un nuevo ítem llamado Módulo1. A la derecha de la ventana verás el módulo propiamente dicho, el documento en blanco.

 

Números a letras en Excel 4

 

Números a letras en Excel 5

 

 

Solo resta que copies los dos códigos que aparecen a continuación de la siguiente imagen de este artículo (en los recuadros azules) y los pegues, uno a continuación de otro, en el módulo que terminas de crear. Quedará de la siguiente manera:

 

Números a letras en Excel 6

 

Número a texto

Function NUMEROATEXTO(Valor As Currency, Optional Mayusc As Boolean) As String
Dim Cantidad As Currency, ParteDecimal As Currency, Digito As Byte, DigitoD As Byte
Dim PrimerDigito As Byte, SegundoDigito As Byte, TercerDigito As Byte, Bloque As String, NumeroBloques As Byte, BloqueCero As Byte
Dim PrimerDigitoD As Byte, SegundoDigitoD As Byte, TercerDigitoD As Byte, BloqueA As String, BloqueD As String, NumeroBloquesD As Byte, BloqueCeroD As Byte
Dim Unidades As Variant, Decenas As Variant, Centenas As Variant, I As Variant
Dim ValorEntero As Long, Negativo As Boolean, NumeroATextoE As String, NumeroATextoD As String

If Valor < 0 Then
Valor = Abs(Valor)
Negativo = True
End If

Valor = Round(Valor, 2)
Cantidad = Int(Valor)
ValorEntero = Cantidad
ParteDecimal = (Valor - Cantidad) * 100
Unidades = Array("uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez", "once", "doce", "trece", "catorce", "quince", "dieciséis", "diecisiete", "dieciocho", "diecinueve", "veinte", "veintiún", "veintidós", "veintitrés", "veinticuatro", "veinticinco", "veintiséis", "veintisiete", "veintiocho", "veintinueve")
Decenas = Array("diez", "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa")
Centenas = Array("ciento", "doscientos", "trescientos", "cuatrocientos", "quinientos", "seiscientos", "setecientos", "ochocientos", "novecientos")
NumeroBloques = 1
NumeroBloquesD = 1

If Valor <= 999999999.99 Then
If Cantidad <> 0 Then
Do
PrimerDigito = 0
SegundoDigito = 0
TercerDigito = 0
Bloque = ""
BloqueCero = 0

For I = 1 To 3
Digito = Cantidad Mod 10
If Digito <> 0 Then
Select Case I
Case 1
Bloque = " " & Unidades(Digito - 1)
PrimerDigito = Digito
Case 2
If Digito <= 2 Then
Bloque = " " & Unidades((Digito * 10) + PrimerDigito - 1)
Else
Bloque = " " & Decenas(Digito - 1) & IIf(PrimerDigito <> 0, " y", Null) & Bloque
End If
SegundoDigito = Digito
Case 3
Bloque = " " & IIf(Digito = 1 And PrimerDigito = 0 And SegundoDigito = 0, "cien", Centenas(Digito - 1)) & Bloque
TercerDigito = Digito
End Select
Else
BloqueCero = BloqueCero + 1
End If

Cantidad = Int(Cantidad / 10)

If Cantidad = 0 Then
Exit For
End If
Next I

Select Case NumeroBloques
Case 1
NumeroATextoE = Bloque
Case 2
NumeroATextoE = Bloque & IIf(BloqueCero = 3, Null, " mil") & NumeroATextoE
Case 3
NumeroATextoE = Bloque & IIf(PrimerDigito = 1 And SegundoDigito = 0 And TercerDigito = 0, " millón", " millones") & NumeroATextoE
End Select

NumeroBloques = NumeroBloques + 1

Loop Until Cantidad = 0

NUMEROATEXTO = NumeroATextoE
If Left(NUMEROATEXTO, 9) = " uno mil " Then NUMEROATEXTO = Right(NUMEROATEXTO, Len(NUMEROATEXTO) - 4)
If Left(NUMEROATEXTO, 9) = " uno mill" Then
NUMEROATEXTO = Right(NUMEROATEXTO, Len(NUMEROATEXTO) - 4)
NUMEROATEXTO = "un" & NUMEROATEXTO
End If

Else 'La cantidad es cero
If Int(Valor) = 0 Then NUMEROATEXTO = "cero"
End If

Do
PrimerDigitoD = 0
SegundoDigitoD = 0
TercerDigitoD = 0
BloqueD = ""
BloqueCeroD = 0

For I = 1 To 2
DigitoD = ParteDecimal Mod 10
If DigitoD <> 0 Then
If ParteDecimal >= 1 And ParteDecimal <= 9 Then BloqueA = " cero"
Select Case I
Case 1
BloqueD = BloqueA & " " & Unidades(DigitoD - 1)
PrimerDigitoD = DigitoD
Case 2
If DigitoD <= 2 Then
BloqueD = " " & Unidades((DigitoD * 10) + PrimerDigitoD - 1)
Else
BloqueD = " " & Decenas(DigitoD - 1) & IIf(PrimerDigitoD <> 0, " y", Null) & BloqueD
End If
SegundoDigitoD = DigitoD
End Select
Else
BloqueCeroD = BloqueCeroD + 1
End If

ParteDecimal = Int(ParteDecimal / 10)

If ParteDecimal = 0 Then
Exit For
End If
Next I

Select Case NumeroBloquesD
Case 1
NumeroATextoD = BloqueD
Case 2
NumeroATextoD = BloqueD & IIf(BloqueCeroD = 3, Null, " mil") & NumeroATextoD
End Select

NumeroBloquesD = NumeroBloquesD + 1

Loop Until Cantidad = 0

If NumeroATextoD <> "" Then
NUMEROATEXTO = Trim(NUMEROATEXTO) & " con " & Trim(NumeroATextoD)
Else
NUMEROATEXTO = Trim(NUMEROATEXTO)
End If

If Negativo = True Then
NUMEROATEXTO = "menos " & NUMEROATEXTO
End If

If Mayusc = True Then
NUMEROATEXTO = UCase(NUMEROATEXTO)
End If

End If
End Function

 

Importe a texto

Function IMPORTEATEXTO(Valor As Currency, Optional MonedaSingular As String = "", Optional MonedaPlural As String = "", Optional Mayusc As Boolean) As String
Dim Cantidad As Currency, Centavos As Currency, Digito As Byte, PrimerDigito As Byte, SegundoDigito As Byte, TercerDigito As Byte, Bloque As String, NumeroBloques As Byte, BloqueCero As Byte
Dim Unidades As Variant, Decenas As Variant, Centenas As Variant, I As Variant
Dim ValorEntero As Long, Negativo As Boolean

Valor = Round(Valor, 2)
Cantidad = Int(Valor)
ValorEntero = Cantidad
Centavos = (Valor - Cantidad) * 100
Unidades = Array("un", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez", "once", "doce", "trece", "catorce", "quince", "dieciséis", "diecisiete", "dieciocho", "diecinueve", "veinte", "veintiún", "veintidós", "veintitrés", "veinticuatro", "veinticinco", "veintiséis", "veintisiete", "veintiocho", "veintinueve")
Decenas = Array("diez", "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa")
Centenas = Array("ciento", "doscientos", "trescientos", "cuatrocientos", "quinientos", "seiscientos", "setecientos", "ochocientos", "novecientos")
NumeroBloques = 1

If Valor >= 1 And Valor <= 999999999.99 Then
Do
PrimerDigito = 0
SegundoDigito = 0
TercerDigito = 0
Bloque = ""
BloqueCero = 0

For I = 1 To 3
Digito = Cantidad Mod 10
If Digito <> 0 Then
Select Case I
Case 1
Bloque = " " & Unidades(Digito - 1)
PrimerDigito = Digito
Case 2
If Digito <= 2 Then
Bloque = " " & Unidades((Digito * 10) + PrimerDigito - 1)
Else
Bloque = " " & Decenas(Digito - 1) & IIf(PrimerDigito <> 0, " y", Null) & Bloque
End If
SegundoDigito = Digito
Case 3
Bloque = " " & IIf(Digito = 1 And PrimerDigito = 0 And SegundoDigito = 0, "cien", Centenas(Digito - 1)) & Bloque
TercerDigito = Digito
End Select
Else
BloqueCero = BloqueCero + 1
End If

Cantidad = Int(Cantidad / 10)

If Cantidad = 0 Then
Exit For
End If
Next I

Select Case NumeroBloques
Case 1
IMPORTEATEXTO = Bloque
Case 2
IMPORTEATEXTO = Bloque & IIf(BloqueCero = 3, Null, " mil") & IMPORTEATEXTO
Case 3
IMPORTEATEXTO = Bloque & IIf(PrimerDigito = 1 And SegundoDigito = 0 And TercerDigito = 0, " millón", " millones") & IMPORTEATEXTO
End Select

NumeroBloques = NumeroBloques + 1

Loop Until Cantidad = 0

IMPORTEATEXTO = Trim(IMPORTEATEXTO & " con " & Format(Str(Centavos), "00") & "/100 " & IIf(ValorEntero = 1, MonedaSingular, MonedaPlural))

If Mayusc = True Then
IMPORTEATEXTO = UCase(IMPORTEATEXTO)
End If

End If
End Function

 

 

 ¡Guarda las macros!

Por último, muy importante, debes guardar el libro con el formato .xlsm, libro de Excel habilitado para macros. De lo contrario la macro se borrará. Para hacerlo, persona la tecla F12 y luego, en la lista desplegable del Tipo, elige la opción antes indicada:

 

Números a letras en Excel 7

 

 

Si todo ha salido bien, ya tienes las dos nuevas funciones disponibles para ser usadas en ese libro.

 

 

 Cómo se usan

Las funciones definidas por el usuario se usan exactamente de la misma manera que cualquier función nativa de Excel. Debes comenzar por ingresar el signo de igual, luego el nombre de la función y, entre paréntesis, indicar los argumentos requeridos.

 

Las dos funciones nuevas se llaman NUMEROATEXTO e IMPORTEATEXTO, respectivamente.

 

La función NUMEROATEXTO, tiene los siguientes parámetros:

=NUMEROATEXTO(valor;[mayusc])

valor: [Requerido] Es el número que se quiere expresar en letras. Puede ser cualquier número entre -999999999,99 y 999999999,99.

mayusc: [Opcional] Es un valor lógico que indica si el resultado se muestra en minúsculas o mayúsculas. Si se omite o se usa el valor FALSO (o cero), el texto se mostrará en minúsculas. Para que se muestre en mayúsculas es necesario que este argumento sea VERDADERO (o 1).

 

Números a letras en Excel 8

 

Números a letras en Excel 9

 

 

=IMPORTEATEXTO(valor;[moneda_singular];[moneda_plural];[mayusc])

valor: [Requerido] Es el número que se quiere expresar en letras. Puede ser cualquier número entre 1 y 999999999,99.

mayusc: [Opcional] Es un texto que indica el nombre de la moneda en singular (por ejemplo: peso, euro, dólar, etc.)

mayusc: [Opcional] Es un texto que indica el nombre de la moneda en plural (por ejemplo: pesos, euros, dólares, etc.)

mayusc: [Opcional] Es un valor lógico que indica si el resultado se muestra en minúsculas o mayúsculas. Si se omite o se usa el valor FALSO (o cero), el texto se mostrará en minúsculas. Para que se muestre en mayúsculas es necesario que este argumento sea VERDADERO (o 1).

 

Números a letras en Excel 10

 

 

 Descarga el libro de ejemplo

Desde el siguiente enlace puedes descargar un libro que contiene ambas funciones y varios ejemplos. Al abrirlo, Excel te advertirá, como medida de seguridad, que el libro contiene macros; debes aceptar todo para poder usar el libro con normalidad y que no se le impongan restricciones.

 

  Descarga el libro de ejemplo

 

 

Si te pareció útil este artículo te invito a suscribirte gratuitamente a nuestro Boletín, para recibir en tu email los próximos que sean publicados.

 

Visto 955 veces Modificado por última vez en Viernes, 02 Diciembre 2016 02:26

Deja un comentario

Los campos imprescindibles están marcados con asterisco (*). Tu dirección de correo nunca será publicada.

2 comentarios

  • Enlace al Comentario Carlos Barillas Viernes, 02 Diciembre 2016 15:31 publicado por Carlos Barillas

    EXCELENTE!!!!!

  • Enlace al Comentario Wilfredo Viernes, 02 Diciembre 2016 12:59 publicado por Wilfredo

    Excelente aporte, sobre todo para quienes trabajamos en el área contable.
    Muchas gracias e infinitas bendiciones para el nuevo año.

Suscríbete a nuestro Boletín gratuito

Recibe periódicamente en tu email los últimos artículos, tutoriales y otras novedades de Excel.


Tus datos son confidenciales, nunca serán compartidos con nadie.

Inicio    Contacto    Términos y condiciones    Mapa del sitio

Ir arriba

Desarrollado por www.espectradesign.com