lunes, 15 de diciembre de 2008

Convertir números a letras en Excel

Con esta pequeña macro podrán convertir números en letras

Ejemplo

1002 --> mil dos

Para utilizarla ingresar el siguiente código en una macro. (En Excel presionar alt+F11 luego [Insertar] módulo y pegas lo siguiente)
Function num_letras(Numero As Double) As String
Dim Letras As String
Dim HuboCentavos As Boolean
Dim Decimales As Double
Decimales = Numero - Int(Numero)
Numero = Int(Numero)
Dim Numeros(90) As String
Numeros(0) = "cero"
Numeros(1) = "uno"
Numeros(2) = "dos"
Numeros(3) = "tres"
Numeros(4) = "cuatro"
Numeros(5) = "cinco"
Numeros(6) = "seis"
Numeros(7) = "siete"
Numeros(8) = "ocho"
Numeros(9) = "nueve"
Numeros(10) = "diez"
Numeros(11) = "once"
Numeros(12) = "doce"
Numeros(13) = "trece"
Numeros(14) = "catorce"
Numeros(15) = "quince"
Numeros(20) = "veinte"
Numeros(30) = "treinta"
Numeros(40) = "cuarenta"
Numeros(50) = "cincuenta"
Numeros(60) = "sesenta"
Numeros(70) = "setenta"
Numeros(80) = "ochenta"
Numeros(90) = "noventa"
Do
'*---> Centenas de Millón
If (Numero < 1000000000) And (Numero >= _
100000000) Then
If (Int(Numero / 100000000) = 1) And ((Numero _
- (Int(Numero / 100000000) * 100000000)) < _
1000000) Then
Letras = Letras & "cien millones "
Else
Select Case Int(Numero / 100000000)
Case 1
Letras = Letras & "ciento"
Case 5
Letras = Letras & "quinientos"
Case 7
Letras = Letras & "setecientos"
Case 9
Letras = Letras & "novecientos"
Case Else
Letras = Letras & Numeros(Int(Numero _
/ 100000000))
End Select
If (Int(Numero / 100000000) <> 1) And _
(Int(Numero / 100000000) <> 5) And (Int( _
Numero / 100000000) <> 7) And _
(Int(Numero / 100000000) <> 9) Then
Letras = Letras & "cientos "
Else
Letras = Letras & " "
End If
End If
Numero = Numero - (Int(Numero / 100000000) * _
100000000)
End If
'*---> Decenas de Millón
If (Numero < 100000000) And (Numero >= 10000000) _
Then
If Int(Numero / 1000000) < 16 Then
Letras = Letras & Numeros(Int(Numero / _
1000000))
Letras = Letras & " millones "
Numero = Numero - (Int(Numero / 1000000) _
* 1000000)
Else
Letras = Letras & Numeros(Int(Numero / _
10000000) * 10)
Numero = Numero - (Int(Numero / 10000000) _
* 10000000)
If Numero > 1000000 Then
Letras = Letras & " y "
End If
End If
End If
'*---> Unidades de Millón
If (Numero < 10000000) And (Numero >= 1000000) _
Then
If Int(Numero / 1000000) = 1 Then
Letras = Letras & " un millón "
Else
Letras = Letras & Numeros(Int(Numero _
/ 1000000))
Letras = Letras & " millones "
End If
Numero = Numero - (Int(Numero / 1000000) _
* 1000000)
End If
'*---> Centenas de Millar
If (Numero < 1000000) And (Numero >= 100000) Then
If (Int(Numero / 100000) = 1) And ((Numero _
- (Int(Numero / 100000) * 100000)) < 1000) Then
Letras = Letras & "cien mil "
Else
Select Case Int(Numero / 100000)
Case 1
Letras = Letras & "ciento"
Case 5
Letras = Letras & "quinientos"
Case 7
Letras = Letras & "setecientos"
Case 9
Letras = Letras & "novecientos"
Case Else
Letras = Letras & Numeros(Int(Numero _
/ 100000))
End Select
If (Int(Numero / 100000) <> 1) And (Int _
(Numero / 100000) <> 5) And (Int(Numero _
/ 100000) <> 7) And (Int(Numero / 100000) _
<> 9) Then
Letras = Letras & "cientos "
Else
Letras = Letras & " "
End If
End If
Numero = Numero - (Int(Numero / 100000) * _
100000)
End If
'*---> Decenas de Millar
If (Numero < 100000) And (Numero >= 10000) Then
If Int(Numero / 1000) < 16 Then
Letras = Letras & Numeros(Int(Numero _
/ 1000))
Letras = Letras & " mil "
Numero = Numero - (Int(Numero / 1000) * _
1000)
Else
Letras = Letras & Numeros(Int(Numero / _
10000) * 10)
Numero = Numero - (Int((Numero / 10000)) _
* 10000)
If Numero > 1000 Then
Letras = Letras & " y "
Else
Letras = Letras & " mil "
End If
End If
End If
'*---> Unidades de Millar
If (Numero < 10000) And (Numero >= 1000) Then
If Int(Numero / 1000) = 1 Then
Letras = Letras & "un"
Else
Letras = Letras & Numeros(Int(Numero / _
1000))
End If
Letras = Letras & " mil "
Numero = Numero - (Int(Numero / 1000) * 1000)
End If
'*---> Centenas
If (Numero < 1000) And (Numero > 99) Then
If (Int(Numero / 100) = 1) And ((Numero - _
(Int(Numero / 100) * 100)) < 1) Then
Letras = Letras & "cien "
Else
Select Case Int(Numero / 100)
Case 1
Letras = Letras & "ciento"
Case 5
Letras = Letras & "quinientos"
Case 7
Letras = Letras & "setecientos"
Case 9
Letras = Letras & "novecientos"
Case Else
Letras = Letras & Numeros(Int(Numero _
/ 100))
End Select
If (Int(Numero / 100) <> 1) And (Int _
(Numero / 100) <> 5) And (Int(Numero / _
100) <> 7) And (Int(Numero / 100) <> 9) _
Then
Letras = Letras & "cientos "
Else
Letras = Letras & " "
End If
End If
Numero = Numero - (Int(Numero / 100) * 100)
End If
'*---> Decenas
If (Numero < 100) And (Numero > 9) Then
If Numero < 16 Then
Letras = Letras & Numeros(Int(Numero))
Numero = Numero - Int(Numero)
Else
Letras = Letras & Numeros(Int((Numero _
/ 10)) * 10)
Numero = Numero - (Int((Numero / 10)) * 10)
If Numero > 0.99 Then
Letras = Letras & " y "
End If
End If
End If
'*---> Unidades
If (Numero < 10) And (Numero > 0.99) Then
Letras = Letras & Numeros(Int(Numero))
Numero = Numero - Int(Numero)
End If
Loop Until (Numero = 0)
'*---> Decimales
If (Decimales > 0) Then
Letras = Letras & " con "
Letras = Letras & Format(Decimales * 100, "00") _
& "/100 centavos"
End If
num_letras = Letras
End Function

Luego para llamarla desde una celda de Excel lo haces con la siguiente función "=num_letras(B11)", donde B11 es la dirección de celda que tiene el número.

11 comentarios:

Dilkar dijo...

hola!!!
un pregunta, en el caso de infopath como se hace para traducir de numeros a letras, ya que necesito traducir cifras monetarias y que me las coloque en letras....
muchas gracias!!! ;)

Francisco Rojas Castro dijo...

tendrías que hacer un Web Service...

o

agregar código c# a tu formulario InfoPath con las funciones que permiten convertir números a letras

claudio dijo...

Gracias, esta rebueno este cuento y utiñl para facturas.
el tema es hasta que cantidad llega, ya que hice pruebas y puse 999.999.999 todo bien, pongo mil millones y parece que la cosa no funka, ya que se queda congelado.
me puedes ayudar para aumentar las cifras, que sean superior a la ultima provada.
Gracias

claudio dijo...

Si eres tan amable de ayudarme, podrias tambien ayudarme como publicar esta formula en un Web Service o en infopath
ya que soy novato en sharepoint.

de antemano
Muchas gracias

Anónimo dijo...

Funciono de maravilla! gracias!!

Anónimo dijo...

GENIOOOOOOOO


GRACIAS!!!!!!!!

INFINITAS!!

Anónimo dijo...

Necesito su ayuda en convertir números enteros y decimales a letra, ej.

1,234.56 Mi doscientos treinta y cuatro quetzales con cincuenta y seis centavos.

1234.00 Mi doscientos treinta y cuatro quetzales exactos.


Lo necesito por favor ayudarme con esta formula.

miguel.tuj@hotmail.com

Anónimo dijo...

Te pasaste, gracias nuevamente.

Natalia Morris dijo...

Hola tu formula me ha servido en algo te agradezco mucho , pero en algunos valores no se por que no me toma el millones por ejemplo 20.544.539 me lo escribe veintequinientos cuarenta y cuatro mil quinientos treinta y nueve , lo raro es que en otros valores de la misma cantidad de dígitos si funciona, me puedes ayudar ???

Wences Olascuada dijo...

como puedo hacer para que los decimales me aparescan asi: 123."45" = ciento veintitres pesos "45/100 M.N"

Pablo dijo...

Muy bueno este traductor, sin embargo encontré un problema y es que a las decenas de millón no les escribe la palabra millón, es decir para 20,000,000 escribe veinte, pero para 21,000,000 si escribe veintiun millones