| Artículos | 01 DIC 2000

Números en letras

Tags: Histórico
Programación de funciones adicionales en Excel
Claudio H. Sánchez.
Un problema muy común en planillas contables: dado un número, obtener su expresión en letras. Se resuelve con una función especialmente definida en Visual Basic. Es más fácil de lo que parece. Sólo se trata de empezar por el principio.

Necesitamos una función como la de la Figura 1: en una celda se escribe un número cualquiera y, en otra, una función especial nos devuelve la expresión en letras de ese número. Comencemos por el caso más simple: obtener la expresión en letras de números de solamente un dígito. Este problema puede resolverse con la función de la Figura 2.
Las funciones como las de la Figura 2 son similares a las macros: son programas escritos en Visual Basic. Comienzan con la instrucción especial Function seguida por el nombre elegido para la función, y terminan con End Function.
El nombre elegido para la función (que, en principio, puede ser cualquiera) debe aparecer, por lo menos una vez, a la izquierda de un signo =. El valor asignado en esta igualdad es el valor que devuelve la función cuando se la invoca en una hoja como en la Figura 1.
La parte principal de la función es la variable nom, que puede almacenar distintos valores simultáneamente, identificados con un subíndice. Así nom(0) es igual a “cero”, nom(1) es igual a “uno”, y así sucesivamente hasta nom(9) cuyo valor es “nueve”. El guión bajo que aparece en la definición de nom indica que la instrucción continúa en el segundo renglón.
Para crear la función de la Figura 2 hay que escribir ese código en el editor de Visual Basic (véase el recuadro “Cómo escribir las funciones”).

Dos dígitos
Para extender el campo de acción de la función anterior a números de dos dígitos podríamos continuar la definición de nom de modo que contenga cien elementos: desde “cero” hasta “noventa y nueve”. Pero, por supuesto, sería muy poco práctico.
Más razonable sería separar el número en sus dos cifras y crear dos variables similares a nom: una para las unidades y otra para las decenas. Algo así como la función de la Figura 3.
La variable uni contiene los nombres de las unidades y dec, los de las decenas. Ambas tienen diez elementos. Pero como solamente hay nueve decenas posibles (desde diez hasta noventa) el primer elemento de dec se define como vacío.
El valor de la variable xdec es la cifra de las decenas. Se obtiene dividiendo el número por diez y reteniendo solamente la parte entera. xuni es la cifra de las unidades. Se obtiene restándole al número las decenas multiplicadas por diez.
La función obtiene el nombre correspondiente a las decenas, luego el de las unidades y, finalmente, concatena ambos nombres con la conjunción “y”. El signo +, aplicado a textos, no suma sino que añade un texto a continuación del otro.
La Figura 4 muestra la función en acción. Trabaja bien en algunos casos pero no en todos. Efectivamente el 48 es “cuarenta” “y” “ocho”. Pero el 14 no es “diez” “y” “cuatro”. Y hay otros casos en que la función falla. Hay que resolver esto.

La regla general y sus excepciones
La regla según la cual el nombre se obtiene concatenando los nombres de las decenas y unidades con la conjunción “y” funciona a partir del número treinta. De modo que vamos a trabajar por un lado los números hasta el veintinueve y por el otro los siguientes. Esto es lo que hace la función de la Figura 5.
La determinación del valor de nombre está dentro de una instrucción condicional If... Else... End If. Si se cumple la condición que se indica en el If se ejecutan las instrucciones que aparecen entre el If y el Else. Si no se cumple, se ejecutan las instrucciones que aparecen entre el Else y el Endif.
Concretamente, si el valor de las decenas es mayor que dos (de treinta en adelante) el nombre se obtiene con la concatenación como en el ejemplo anterior. Si no (en inglés, else) el nombre se obtiene directamente mediante la variable uni aplicada al número.
La nueva función aparece en acción en la Figura 6. De nuevo hay algunos problemas: en el caso de números como el 50 no se debe concatenar el nombre correspondiente a las unidades. Esto se resuelve agregando otra condicional que concatene las unidades solamente cuando xuni sea mayor que cero:
If xdec > 2 Then
NOMBRE = dec(xdec)
NOMBRE = NOMBRE + “ Y “ + uni(xuni)
End If
Else
NOMBRE = uni(x)
End If

Con esta modificación la función NOMBRE trabaja correctamente con los números del uno al noventa y nueve.

Tres dígitos
Extender la función NOMBRE a números de tres dígitos no debería ser difícil. Se trata de definir una nueva variable para los nombres de las centenas y separar el número en tres cifras. La nueva función aparece en la Figura 7.
La separación en dígitos se hace como antes, usando divisiones por diez y aplicando la función Int al resultado, para conservar solamente la parte entera:

xcent = Int(x / 100)
xdec = Int(x / 10) - 10 * xcent
xuni = x - 100 * xcent - 10 * xdec

El nombre correspondiente a las dos últimas cifras se obtiene como anteriormente. Pero se agrega una nueva condicional que concatena el nombre de las centenas en el caso de que xcent sea mayor que cero.

If xcent > 0 Then nombre = cent(xcent) + nombre

Sin embargo, todavía hay un caso particular: el número 100. Este número escapa a toda norma y lo más sencillo es tratar el caso separadamente con otra condicional.

If x = 100 Then nombre = “cien”.

Y más
Habiendo alcanzado los tres dígitos, es muy simple seguir adelante. Supongamos el número 45.286.159. Podemos descomponerlo en tres grupos: 45, 286 y 159. El nombre de este número se obtiene aplicándole la función NOMBRE a cada parte y concatenando luego los resultados convenientemente. Algo así:

NOMBRE(45) + “ MILLONES ” + NOMBRE(286) + “ MIL ” + NOMBRE(159)

Por supuesto, habrá casos particulares a considerar. Pero el núcleo de la nueva función será como el que aparece en la Figura 8.
Esta función utiliza a NOMBRE como subfunción. Es un recurso perfectamente válido en el lenguaje de programación que estamos usando.

Los casos especiales
La función anterior falla en algunos casos, como se ve en la Figura 9. Vamos a considerar cada uno. La concatenación de los nombres de cada segmento de tres cifras solamente se hace si ese segmento es distinto de cero. Por ejemplo, en el número 23.000.156 no debe aparecer la palabra “mil”. En el número 567.190 no debe aparecer la palabra “millón”.
De nuevo, esto obliga al uso de condicionales que detecten estos casos. Para el caso de los millones hay tres posibilidades:
- Si parte1 es cero, no debe aparecer el grupo correspondiente a los millones.
- Si parte1 es uno, el grupo de los millones debe decir, simplemente, “UN MILLÓN”
- Si parte1 es mayor que uno, el grupo de los millones se forma con NOMBRE(parte1) + “ MILLONES “
Algo parecido sucede con el grupo de los miles. Todos estos casos se resuelven con las siguientes condicionales:
If parte1 = 0 Then millon = “”
If parte1 = 1 Then millon = “UN MILLON “
If parte1 > 1 Then millon = NOMBRE(parte1) + “

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información