Problema con Macro para Convertir Numero a Letras
Buena tarde a todos, espero que alguien me pueda ayudar con esto, aca encontre una macro para la formula =ValorEnLetras que desarrollo el señor Hector Miguel Orosco para 5 idiomas; yo uso el idioma por omision que es el Español, pero tenia un pequeño problema, a momento de escribir un valor numerico ejem. 2.02 la funcion me devuelve DOS CON DOS, yo lo corregi porqeue kiero que me indique en letras el punto y el cero que se encuenta en los decimales, y ahora me devuelve DOS PUNTO CERO DOS, ya lo hice con todos los decimales del .01 al .09, pero el .07 me sigue dando problema, este numero tiene algo de especial??
http://www.officefull.es/todo-informatica/84-convertir-nos-a-su-equivalente-en-letras.html
http://www.officefull.es/todo-informatica/84-convertir-nos-a-su-equivalente-en-letras.html
10 responses Add Yours
-
Hola Manuel
!!
Pues no se porque sucede esto
, en un principio veo que estas utilizando el separador decimal como punto, y no se como hiciste la correccion para realizar las pruebas. Si quieres puedes decirnos como lo realizaste y asi vemos que puede suceder con el .07 ¿vales? 
Ya nos comentas y saludos!!
Monica -
Hola Monica, te agradesco por tomarte el tiempo de responderme, bueno te comento:
Primero en la linea 191 del codigo modifique el .01, luego en la linea 237 agregue los otros decimales .00 - .02 al .09, y el separador decimal en la linea 282.
Te adjunto el Archivo donde lo estoy trabajando, de nuevo te agradesco y espero tu respuesta.
Saludos -
no veo el archivo adjunto mejor te pongo aca lo que hice,
Linea 191 :
' A continuación, *preparamos" si el identificador para decimales "01" -en letras- es UNA ó UN(O) '
If FraccionesEnLetra And ID_Fracciones <> "" And Right(ID_Fracciones, 1) <> "." Then
If Left(ID_Fracciones, 4) = "Ning" Or Left(ID_Fracciones, 5) = "Sinid" Then
Solitario = "Cero Uno"
Else
If Right(ID_Fracciones, 2) = "as" Then Solitario = "Una" Else Solitario = "Un"
End If
Linea 237 y de ultimo esta la linea 282:
' Aquí *singularizamos* para Español '
Select Case Right(ID_Fracciones, 2)
Case "as", "os", "ms": ID_Fracciones = Left(ID_Fracciones, Len(ID_Fracciones) - 1)
Case Else: ID_Fracciones = Left(ID_Fracciones, Len(ID_Fracciones) - 2)
End Select
End If
ElseIf Decimales = 2 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Dos"
End If
ElseIf Decimales = 3 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Tres"
End If
ElseIf Decimales = 4 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Cuatro"
End If
ElseIf Decimales = 5 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Cinco"
End If
ElseIf Decimales = 6 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Seis"
End If
ElseIf Decimales = 7 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Siete"
End If
ElseIf Decimales = 8 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Ocho"
End If
ElseIf Decimales = 9 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Nueve"
End If
' Aquí *preparamos* las letras para decimales "00" '
ElseIf Decimales = 0 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Cero"
LetraFracciones_US = "Zero"
LetraFracciones_FR = "Zéro"
LetraFracciones_IT = "Zero"
LetraFracciones_CA = "Cero"
End If
End If
End If
End If
Pre_Frac = " punto " -
Holas manuel
!!
Pues creo que ya se porque sucede y es por el tema decimal que cuando hace las pasadas con el siete la evalua como verdadera pero pasa de largo....creo que es por los decimales y el redondeo ya que me devuelve por ejemplo 0,07000000000005 e incluso me ha devuelto 6,99999999999932E-02 y apufff !!!
Bien mira de añadir lo siguiente para el 7 ->>>
'....
ElseIf Decimales = 6 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Seis"
End If
ElseIf Round(Decimales, 2) = 7 Then
If FraccionesEnLetra Then
LetraFracciones = "cero siete"
End If
ElseIf Decimales = 8 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Ocho"
End If
'..........
No he terminado de hacer todas las pruebas oportunas por falta de tiempo
haz tus pruebas y si cualquier cosa nos comentas valess???
Gracias manuel y saludos,
Monica -
te agradesco mucho Monica... funciona muy bien, ahora tengo otro problema jeje ahora el valor Solitario cuando se topa con un 01 me esta molestando
si coloco 0.21 = CERO PUNTO VEINTICERO UNO, 0.31 = CERO PUNTO TREINTA Y CERO UNO.... etc
sin embargo solo afecta a los decimales los numero enteros estan bien....
esperare tu respuesta.. muchas gracias y saludos. -
holas de nuevo Manuel

Pues a ver como este codigo es un tanto complejo para mi limitados conocimientos
, vamos a hacer una formula:
1.- Quita el Punto cero que añadiste en la linea Linea 191
2.- Luego escribe en por ejemplo en mis pruebas sobre archivo de Hector Miguel, en la Hoja Idiomas:
Rango L15:M24
0 cero
1 uno
2 dos
3 tres
4 cuatro
5 cinco
6 seis
7 siete
8 ocho
9 nueve
3.- Celda E17 es la que llevara el valor a convertir.
4.- Celda G17 la siguiente Formula:
= SI(REDONDEAR(RESIDUO(E17;1);2)=0,01;BUSCAR(ENTERO(E17);$L$15:$M$24) & " punto Cero";ValorEnLetras(E17;;"ninguna";;;"Frase"))
5.- El resto del codigo dejalo tal cual modificaste con lo que añadi:
....
ElseIf Decimales = 2 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Dos"
End If
ElseIf Decimales = 3 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Tres"
End If
ElseIf Decimales = 4 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Cuatro"
End If
ElseIf Decimales = 5 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Cinco"
End If
ElseIf Decimales = 6 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Seis"
End If
ElseIf Round(Decimales, 2) = 7 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero sietet"
End If
ElseIf Decimales = 8 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Ocho"
End If
ElseIf Decimales = 9 Then
If FraccionesEnLetra Then
LetraFracciones = "Cero Nueve"
End If
'.........
Pre_Frac = " punto "
'....
6.- Quitando la linea de Pre_Frac = " con "
Y creo que asi ya se soluciona el tema del 01 jajaj ! CREO amos no lo se, habria que hacer pruebas aunque estoy pensando que esto se podria a ver solucionado sin necesitad de tocar o añadir codigo al del Creado Por Hector Miguel...
Haz tus pruebas y nos comentas vales?
Saludos!
Monica -
Otra forma menos farragosa para arreglar el 01 mas limpia es la siguiente:
=SI(REDONDEAR(RESIDUO(E17;1);2)=0,01;IZQUIERDA(G17;ENCONTRAR("punto";g17;1)-1) & "punto Cero Uno";ValorEnLetras(e17;;"ninguna";;;"Frase"))
FPara hacer las pruebas con esta formula que te paso ahora tendras que crear una columna adicional para que no se creen referencias circulares y asi la formula si la parte decimal es igual a 01 entonces busca en Valor en Letras hasta la palabra Punto y añade "punto cero uno" y asi si que creo que lo tienes ya. Y si la parte decimal no es igual a 01 ya entonces pon Valor en letras.
saludos,
Monica