Aqui esta la rutina para cov NUMEROS A TEXTO

08/07/2004 - 05:22 por Ivan | Informe spam
Observo con frecuencia esta pregunta, este prob yo tambien lo pase, aqui esta la rutina que utilizo, en la celda solo escribes =letras(celda_del_numero, Denominacion ) donde denominacion puede ser 1 = pesos, 2 = dolares,
si tienen alguna sugerencia, se los agradesco.
saludos a Todos

'Funciones para convertir de números a letras
'Llamada : Letras(Número,Formato) - Formato 1-Pesos, 2-Dólares
Function Unidades(num, UNO)
Dim U
Dim Cad

U = Array("UN", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE")
Cad = ""
If num = 1 Then
If UNO = 1 Then
Cad = Cad & "UNO"
Else
Cad = Cad & "UN"
End If
Else
Cad = Cad & U(num - 1)
End If
Unidades = Cad
End Function

Function Decenas(num1, res)
Dim D1
D1 = Array("ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIEZ Y SEIS", "DIEZ Y SIETE", _
"DIEZ Y OCHO", "DIEZ Y NUEVE")
D2 = Array("DIEZ", "VEINTE", "TREINTA", "CUARENTA", "CINCUENTA", "SESENTA", _
"SETENTA", "OCHENTA", "NOVENTA")

If num1 > 10 And num1 < 20 Then
Cad1 = D1(num1 - 10 - 1)
Else
Cad1 = D2((num1 \ 10) - 1)
If (num1 \ 10) <> 2 Then
If res > 0 Then
Cad1 = Cad1 & " Y "
Cad1 = Cad1 & Unidades(num1 Mod 10, 0)
End If
Else
If res = 0 Then
Cad1 = Cad1 & " "
Else
Cad1 = Cad1 & " Y "
Cad1 = Cad1 & Unidades(num1 Mod 10, 0)
End If
End If
End If
Decenas = Cad1
End Function

Function Cientos(num2)
num3 = num2 \ 100
Select Case num3
Case 1
If num2 = 100 Then
cad2 = "CIEN "
Else
cad2 = "CIENTO "
End If
Case 5
cad2 = "QUINIENTOS "
Case 7
cad2 = "SETECIENTOS "
Case 9
cad2 = "NOVECIENTOS "
Case Else
cad2 = Unidades(num3, 0) & "CIENTOS "
End Select

num2 = num2 Mod 100
If num2 > 0 Then
If num2 < 10 Then
cad2 = cad2 & Unidades(num2, num2)
Else
cad2 = cad2 & Decenas(num2, num2 Mod 10)
End If
End If
Cientos = cad2
End Function

Function Miles(num4)
If (num4 >= 100) Then
cad3 = Cientos(num4)
Else
If (num4 >= 10) Then
cad3 = Decenas(num4, num4 Mod 10)
Else
cad3 = Unidades(num4, 0)
End If
End If
cad3 = cad3 & " MIL "
Miles = cad3
End Function

Function Millones(cant)
If cant = 1 Then
ter = " "
Else
ter = "ES "
End If
If (cant >= 1000) Then
cantl = cantl & Miles(cant \ 1000)
cant = cant Mod 1000
End If
If cant > 0 Then
If cant >= 100 Then
cantl = cantl & Cientos(cant)
Else
If cant >= 10 Then
cantl = cantl & Decenas(cant, cant Mod 10)
Else
cantl = cantl & Unidades(cant, 0)
End If
End If
End If
Millones = cantl & " MILLON" & ter
End Function
Function decimales(numero As Single) As Integer
Dim iaux As Integer
iaux = numero - Application.Round(numero, 2)
decimales = iaux
End Function

Function letras(cantm As Variant, ByVal mon As Integer) As String
Dim cants1 As String, num1 As Variant, num2 As Variant

num1 = cantm \ 1000000
num2 = cantm - (num1 * 1000000)

cents = (num2 * 100) Mod 100
If cents = 0 Then
cents1 = "00"
Else
cents1 = Format(cents)
End If
cantm = cantm - (cents / 100)
If cantm >= 1000000 Then
cantlm = Millones(cantm \ 1000000)
cantm = cantm Mod 1000000
End If
If cantm > 0 Then
If (cantm >= 1000) Then
cantlm = cantlm & Miles(cantm \ 1000)
cantm = cantm Mod 1000
End If
End If
If cantm > 0 Then
If cantm >= 100 Then
cantlm = cantlm & Cientos(cantm)
Else
If cantm >= 10 Then
cantlm = cantlm & Decenas(cantm, cantm Mod 10)
Else
cantlm = cantlm & Unidades(cantm, 1)
End If
End If
End If
If mon = 1 Then
letras = cantlm & " PESOS " & cents1 & "/100 M.N."
Else
letras = cantlm & " DOLARES " & cents1 & "/100 U.S.D."
End If
End Function

Sub prueba()
Dim res As String, num As Single
num = 50899697.51
res = letras(num, 1)
End Sub

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
08/07/2004 - 08:51 | Informe spam
hola, Ivan !

Observo con frecuencia esta pregunta ...


=> [efectivamente] es una de las mas 'socorridas' :))
[inclusive] existe una 'infinidad' de formas de 'resolverla' [y no es una exageracion] ;)
[mas aun...] si revisas 7 mensajes antes... nico 'propone' una de ellas
usando el algoritmo de Mauricio Baeza y Samuel Monjaras
http://www.sistemaslym.net/vba/exce...etras.html el archivo se descarga en:
http://www.sistemaslym.net/vba/arch...letras.zip
=> otra de las 'frecuentadas' la encuentras en la pagina del 'Guille'...
http://www.elguille.info/vb/utilida...m2Text.htm el archivo se descarga en:
http://downloads.elguille.info/Baja...m2Text.zip

... aqui esta la rutina que utilizo ... si tienen alguna sugerencia [...]


=> [honestamente] no recuerdo cuando la vi 'por primera vez' en este mismo foro [mas de 5 años] ;)
'presenta' algunas fallas: espacios 'de mas'... 'omite' la expresion =>de<= en millones 'cerrados'...
habria que 'adaptar' para los 'dieci's' y 'veinti's' [en lugar de 'diez y siete'... 'veinte y cuatro'... etc.]
tiene un 'alcance' de hasta 10 digitos 'significativos' [falla si se trata de 11 o mas]

=> [a mi parecer] una de las mas 'sencillas' [y faciles de adaptar] que me ha tocado conocer por estos 'lares'
[publicado por Claudio Sepulveda hace bastante tiempo, aunque no estoy seguro de su autoria]
=> y con SOLO 65 lineas de codigo <= [la expongo al final del presente]
la puedes personalizar para [practicamente] CUALQUIER 'necesidad' en las primeras 12 lineas.
solo monedas del genero masculino, trabajar con el genero femenino requiere quemar unas cuantas neuronas mas
'alcanza' [bien] hasta 17 digitos 'significativos' [obviamente, despues del 15° -excel- los 'convierte' en ceros]

saludos,
hector.
_______
Function EnLetras(Valor) As String ' Funcion Principal '
If Not IsNumeric(Valor) Then
EnLetras = "¡ La referencia no es valor o... 'excede' la precision !!!": Exit Function
End If: Dim Moneda As String, Fracs As String, Cents As Integer
If Int(Abs(Valor)) = 1 Then Moneda = " peso" Else Moneda = " pesos"
If Right(Letras(Abs(Valor)), 6) = "illón " Or Right(Letras(Abs(Valor)), 8) = "illones " Then Moneda = "de" & Moneda
Cents = Application.Round(Abs(Valor) - Int(Abs(Valor)), 2) * 100
If Cents = 1 Then Fracs = " centavo" Else Fracs = " centavos"
If Cents = 0 Then Fracs = "" Else Fracs = " con " & Letras(Cents) & Fracs
EnLetras = Letras(Int(Abs(Valor))) & Moneda & Fracs
If Valor < 0 Then EnLetras = "menos " & EnLetras
End Function
Private Function Letras(Valor) As String ' Funcion Auxiliar [uso 'exclusivo' de la funcion 'principal'] '
Select Case Int(Valor)
Case 0: Letras = "cero"
Case 1: Letras = "un"
Case 2: Letras = "dos"
Case 3: Letras = "tres"
Case 4: Letras = "cuatro"
Case 5: Letras = "cinco"
Case 6: Letras = "seis"
Case 7: Letras = "siete"
Case 8: Letras = "ocho"
Case 9: Letras = "nueve"
Case 10: Letras = "diez"
Case 11: Letras = "once"
Case 12: Letras = "doce"
Case 13: Letras = "trece"
Case 14: Letras = "catorce"
Case 15: Letras = "quince"
Case Is < 20: Letras = "dieci" & Letras(Valor - 10)
Case 20: Letras = "veinte"
Case Is < 30: Letras = "veinti" & Letras(Valor - 20)
Case 30: Letras = "treinta"
Case 40: Letras = "cuarenta"
Case 50: Letras = "cincuenta"
Case 60: Letras = "sesenta"
Case 70: Letras = "setenta"
Case 80: Letras = "ochenta"
Case 90: Letras = "noventa"
Case Is < 100: Letras = Letras(Int(Valor \ 10) * 10) & " y " & Letras(Valor Mod 10)
Case 100: Letras = "cien"
Case Is < 200: Letras = "ciento " & Letras(Valor - 100)
Case 200, 300, 400, 600, 800: Letras = Letras(Int(Valor \ 100)) & "cientos"
Case 500: Letras = "quinientos"
Case 700: Letras = "setecientos"
Case 900: Letras = "novecientos"
Case Is < 1000: Letras = Letras(Int(Valor \ 100) * 100) & " " & Letras(Valor Mod 100)
Case 1000: Letras = "mil"
Case Is < 2000: Letras = "mil " & Letras(Valor Mod 1000)
Case Is < 1000000: Letras = Letras(Int(Valor \ 1000)) & " mil"
If Valor Mod 1000 Then Letras = Letras & " " & Letras(Valor Mod 1000)
Case 1000000: Letras = "un millón "
Case Is < 2000000: Letras = "un millón " & Letras(Valor Mod 1000000)
Case Is < 1000000000000#: Letras = Letras(Int(Valor / 1000000)) & " millones "
If (Valor - Int(Valor / 1000000) * 1000000) _
Then Letras = Letras & Letras(Valor - Int(Valor / 1000000) * 1000000)
Case 1000000000000#: Letras = "un billón "
Case Is < 2000000000000#
Letras = "un billón " & Letras(Valor - Int(Valor / 1000000000000#) * 1000000000000#)
Case Else: Letras = Letras(Int(Valor / 1000000000000#)) & " billones"
If (Valor - Int(Valor / 1000000000000#) * 1000000000000#) _
Then Letras = Letras & " " & Letras(Valor - Int(Valor / 1000000000000#) * 1000000000000#)
End Select
End Function
Respuesta Responder a este mensaje
#2 Rubén Sánchez
08/07/2004 - 15:58 | Informe spam
Esta muy bien, a mi también me ha funcionado. Solo he tenido un problema con
algunas variables no definidas.

Un saludo


"Ivan" escribió en el mensaje
news:
Observo con frecuencia esta pregunta, este prob yo tambien lo pase, aqui


esta la rutina que utilizo, en la celda solo escribes
=letras(celda_del_numero, Denominacion ) donde denominacion puede ser 1
= pesos, 2 = dolares,
si tienen alguna sugerencia, se los agradesco.
saludos a Todos

'Funciones para convertir de números a letras
'Llamada : Letras(Número,Formato) - Formato 1-Pesos, 2-Dólares
Function Unidades(num, UNO)
Dim U
Dim Cad

U = Array("UN", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE",


"OCHO", "NUEVE")
Cad = ""
If num = 1 Then
If UNO = 1 Then
Cad = Cad & "UNO"
Else
Cad = Cad & "UN"
End If
Else
Cad = Cad & U(num - 1)
End If
Unidades = Cad
End Function

Function Decenas(num1, res)
Dim D1
D1 = Array("ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIEZ Y


SEIS", "DIEZ Y SIETE", _
"DIEZ Y OCHO", "DIEZ Y NUEVE")
D2 = Array("DIEZ", "VEINTE", "TREINTA", "CUARENTA", "CINCUENTA",


"SESENTA", _
"SETENTA", "OCHENTA", "NOVENTA")

If num1 > 10 And num1 < 20 Then
Cad1 = D1(num1 - 10 - 1)
Else
Cad1 = D2((num1 \ 10) - 1)
If (num1 \ 10) <> 2 Then
If res > 0 Then
Cad1 = Cad1 & " Y "
Cad1 = Cad1 & Unidades(num1 Mod 10, 0)
End If
Else
If res = 0 Then
Cad1 = Cad1 & " "
Else
Cad1 = Cad1 & " Y "
Cad1 = Cad1 & Unidades(num1 Mod 10, 0)
End If
End If
End If
Decenas = Cad1
End Function

Function Cientos(num2)
num3 = num2 \ 100
Select Case num3
Case 1
If num2 = 100 Then
cad2 = "CIEN "
Else
cad2 = "CIENTO "
End If
Case 5
cad2 = "QUINIENTOS "
Case 7
cad2 = "SETECIENTOS "
Case 9
cad2 = "NOVECIENTOS "
Case Else
cad2 = Unidades(num3, 0) & "CIENTOS "
End Select

num2 = num2 Mod 100
If num2 > 0 Then
If num2 < 10 Then
cad2 = cad2 & Unidades(num2, num2)
Else
cad2 = cad2 & Decenas(num2, num2 Mod 10)
End If
End If
Cientos = cad2
End Function

Function Miles(num4)
If (num4 >= 100) Then
cad3 = Cientos(num4)
Else
If (num4 >= 10) Then
cad3 = Decenas(num4, num4 Mod 10)
Else
cad3 = Unidades(num4, 0)
End If
End If
cad3 = cad3 & " MIL "
Miles = cad3
End Function

Function Millones(cant)
If cant = 1 Then
ter = " "
Else
ter = "ES "
End If
If (cant >= 1000) Then
cantl = cantl & Miles(cant \ 1000)
cant = cant Mod 1000
End If
If cant > 0 Then
If cant >= 100 Then
cantl = cantl & Cientos(cant)
Else
If cant >= 10 Then
cantl = cantl & Decenas(cant, cant Mod 10)
Else
cantl = cantl & Unidades(cant, 0)
End If
End If
End If
Millones = cantl & " MILLON" & ter
End Function
Function decimales(numero As Single) As Integer
Dim iaux As Integer
iaux = numero - Application.Round(numero, 2)
decimales = iaux
End Function

Function letras(cantm As Variant, ByVal mon As Integer) As String
Dim cants1 As String, num1 As Variant, num2 As Variant

num1 = cantm \ 1000000
num2 = cantm - (num1 * 1000000)

cents = (num2 * 100) Mod 100
If cents = 0 Then
cents1 = "00"
Else
cents1 = Format(cents)
End If
cantm = cantm - (cents / 100)
If cantm >= 1000000 Then
cantlm = Millones(cantm \ 1000000)
cantm = cantm Mod 1000000
End If
If cantm > 0 Then
If (cantm >= 1000) Then
cantlm = cantlm & Miles(cantm \ 1000)
cantm = cantm Mod 1000
End If
End If
If cantm > 0 Then
If cantm >= 100 Then
cantlm = cantlm & Cientos(cantm)
Else
If cantm >= 10 Then
cantlm = cantlm & Decenas(cantm, cantm Mod 10)
Else
cantlm = cantlm & Unidades(cantm, 1)
End If
End If
End If
If mon = 1 Then
letras = cantlm & " PESOS " & cents1 & "/100 M.N."
Else
letras = cantlm & " DOLARES " & cents1 & "/100 U.S.D."
End If
End Function

Sub prueba()
Dim res As String, num As Single
num = 50899697.51
res = letras(num, 1)
End Sub
Respuesta Responder a este mensaje
#3 Henry Sanchez
08/07/2004 - 19:23 | Informe spam
Hola Hector,
Me parece que en el codigo que colocas en la parte
inferior de tu mensaje, hay que corregir la instruccion:
If Right(Letras(Abs(Valor)), 6) = "illón " Or Right


(Letras(Abs(Valor)), 8) = "illones " Then Moneda = "de" &
Moneda
para que quede:
If Right(Letras(Abs(Int(Valor))), 6) = "illón " Or


Right(Letras(Abs(Int(Valor))), 8) = "illones " Then
Moneda = "de" & Moneda

de lo contrario
8'000.000,50
quedaria ocho millones pesos con 50 centavos, o sea que
se perderia el "de"

Saludos,

Henry
hola, Ivan !

Observo con frecuencia esta pregunta ...


=> [efectivamente] es una de las mas 'socorridas' :))
[inclusive] existe una 'infinidad' de formas


de 'resolverla' [y no es una exageracion] ;)
[mas aun...] si revisas 7 mensajes antes...


nico 'propone' una de ellas
usando el algoritmo de Mauricio Baeza y Samuel


Monjaras



http://www.sistemaslym.net/vba/exce...etras.html
el archivo se descarga en:



http://www.sistemaslym.net/vba/arch...a_letras.z
ip
=> otra de las 'frecuentadas' la encuentras en la pagina


del 'Guille'...



http://www.elguille.info/vb/utilida...m2Text.htm el
archivo se descarga en:
http://downloads.elguille.info/BajarZip.aspx?


seccion=/vb/&zip=tcNum2Text.zip

... aqui esta la rutina que utilizo ... si tienen




alguna sugerencia [...]
=> [honestamente] no recuerdo cuando la vi 'por primera


vez' en este mismo foro [mas de 5 años] ;)
'presenta' algunas fallas: espacios 'de


mas'... 'omite' la expresion =>de<= en
millones 'cerrados'...
habria que 'adaptar' para los 'dieci's'


y 'veinti's' [en lugar de 'diez y siete'... 'veinte y
cuatro'... etc.]
tiene un 'alcance' de hasta 10


digitos 'significativos' [falla si se trata de 11 o mas]

=> [a mi parecer] una de las mas 'sencillas' [y faciles


de adaptar] que me ha tocado conocer por estos 'lares'
[publicado por Claudio Sepulveda hace bastante


tiempo, aunque no estoy seguro de su autoria]
=> y con SOLO 65 lineas de codigo <= [la expongo al


final del presente]
la puedes personalizar para [practicamente]


CUALQUIER 'necesidad' en las primeras 12 lineas.
solo monedas del genero masculino, trabajar con el


genero femenino requiere quemar unas cuantas neuronas mas
'alcanza' [bien] hasta 17 digitos 'significativos'


[obviamente, despues del 15° -excel- los 'convierte' en
ceros]

saludos,
hector.
_______
Function EnLetras(Valor) As String ' Funcion Principal '
If Not IsNumeric(Valor) Then
EnLetras = "¡ La referencia no es valor


o... 'excede' la precision !!!": Exit Function
End If: Dim Moneda As String, Fracs As String, Cents


As Integer
If Int(Abs(Valor)) = 1 Then Moneda = " peso" Else


Moneda = " pesos"
If Right(Letras(Abs(Valor)), 6) = "illón " Or Right


(Letras(Abs(Valor)), 8) = "illones " Then Moneda = "de" &
Moneda
Cents = Application.Round(Abs(Valor) - Int(Abs


(Valor)), 2) * 100
If Cents = 1 Then Fracs = " centavo" Else Fracs = "


centavos"
If Cents = 0 Then Fracs = "" Else Fracs = " con " &


Letras(Cents) & Fracs
EnLetras = Letras(Int(Abs(Valor))) & Moneda & Fracs
If Valor < 0 Then EnLetras = "menos " & EnLetras
End Function
Private Function Letras(Valor) As String ' Funcion


Auxiliar [uso 'exclusivo' de la funcion 'principal'] '
Select Case Int(Valor)
Case 0: Letras = "cero"
Case 1: Letras = "un"
Case 2: Letras = "dos"
Case 3: Letras = "tres"
Case 4: Letras = "cuatro"
Case 5: Letras = "cinco"
Case 6: Letras = "seis"
Case 7: Letras = "siete"
Case 8: Letras = "ocho"
Case 9: Letras = "nueve"
Case 10: Letras = "diez"
Case 11: Letras = "once"
Case 12: Letras = "doce"
Case 13: Letras = "trece"
Case 14: Letras = "catorce"
Case 15: Letras = "quince"
Case Is < 20: Letras = "dieci" & Letras(Valor - 10)
Case 20: Letras = "veinte"
Case Is < 30: Letras = "veinti" & Letras(Valor - 20)
Case 30: Letras = "treinta"
Case 40: Letras = "cuarenta"
Case 50: Letras = "cincuenta"
Case 60: Letras = "sesenta"
Case 70: Letras = "setenta"
Case 80: Letras = "ochenta"
Case 90: Letras = "noventa"
Case Is < 100: Letras = Letras(Int(Valor \ 10) * 10)


& " y " & Letras(Valor Mod 10)
Case 100: Letras = "cien"
Case Is < 200: Letras = "ciento " & Letras(Valor -


100)
Case 200, 300, 400, 600, 800: Letras = Letras(Int


(Valor \ 100)) & "cientos"
Case 500: Letras = "quinientos"
Case 700: Letras = "setecientos"
Case 900: Letras = "novecientos"
Case Is < 1000: Letras = Letras(Int(Valor \ 100) *


100) & " " & Letras(Valor Mod 100)
Case 1000: Letras = "mil"
Case Is < 2000: Letras = "mil " & Letras(Valor Mod


1000)
Case Is < 1000000: Letras = Letras(Int(Valor \


1000)) & " mil"
If Valor Mod 1000 Then Letras = Letras & " " &


Letras(Valor Mod 1000)
Case 1000000: Letras = "un millón "
Case Is < 2000000: Letras = "un millón " & Letras


(Valor Mod 1000000)
Case Is < 1000000000000#: Letras = Letras(Int


(Valor / 1000000)) & " millones "
If (Valor - Int(Valor / 1000000) * 1000000) _
Then Letras = Letras & Letras(Valor - Int


(Valor / 1000000) * 1000000)
Case 1000000000000#: Letras = "un billón "
Case Is < 2000000000000#
Letras = "un billón " & Letras(Valor - Int(Valor /


1000000000000#) * 1000000000000#)
Case Else: Letras = Letras(Int(Valor /


1000000000000#)) & " billones"
If (Valor - Int(Valor / 1000000000000#) *


1000000000000#) _
Then Letras = Letras & " " & Letras(Valor - Int


(Valor / 1000000000000#) * 1000000000000#)
End Select
End Function

.

Respuesta Responder a este mensaje
#4 Héctor Miguel
08/07/2004 - 19:47 | Informe spam
hola, Henry !

Me parece que en el codigo ... hay que corregir la instruccion:
If Right(Letras(Abs(Valor)), 6) = "illón " Or Right(Letras(Abs(Valor)), 8) = "illones " Then Moneda = "de" & Moneda
para que quede:
If Right(Letras(Abs(Int(Valor))), 6) = "illón " Or Right(Letras(Abs(Int(Valor))), 8) = "illones " Then Moneda = "de" & Moneda
de lo contrario 8'000.000,50 quedaria ocho millones pesos con 50 centavos, o sea que se perderia el "de"



¡ tienes toda la razon !!! ;)
aunque no es la funcion que utilizo a titulo 'personal'... SI ES [me parece] la mas 'sencilla y facil' de adaptar
y... en 'solo' 65 lineas de codigo [incluyendo las 12 que 'le adicione' y que NO 'venian' con la 'original'] ;)

... tienes un 'agudo ojo clinico' o...
acabas de ofrecer una 'clara muestra' de lo sencillo que resulta... 'detectar y reparar...' [en la funcion] ;)
[por lo pronto, ya he corregido la 'falla'] ¡ gracias !!!

saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida