Habrá alguna formula????

20/10/2003 - 21:38 por Jack-11 | Informe spam
Hola a todos,

Alguien podría ayudarme a encontrar la forma de convertir
una cantidad númerica a texto?

Ejemplo:
Este es el formato convencional:
$1,000.00
Quiero este:
Mil (lo que sea) pesos, dólares, pesetas, etc.


Ojalá alguien pueda ayudarme

hiroldan@hotmail.com

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
20/10/2003 - 23:48 | Informe spam
Hola, Jack !

... convertir una cantidad numerica a texto?
Ejemplo: $1,000.00 ... Mil (lo que sea) pesos, dólares, pesetas, etc.



==> si vas a usar 'el mismo' estilo, formato y moneda =>SIEMPRE<= [te sugiero]...
una funcion ['sencilla'] de tipo 'permanente' =>sin argumentos 'opcionales'< a) siempre en minusculas
b) las fracciones en el formato de ??/100
c) la moneda sera [siempre] peso(s)
d) todo el texto entre parentesis
e) ¿y si mejor 'personalizas' a tu conveniencia lo que sea necesario??? ;)

[p.e.] [A1] => 1000
[B1] => =EnLetras(A1)
<< 'el resultado' => (mil pesos con 00/100) >>

en un modulo de codigo 'normal' ==' Función Principal '
Function EnLetras(Valor) As String
Dim Cents As String
If Not IsNumeric(Valor) Then
EnLetras = "¡ La referencia no es valor o... 'excede' la precisión !!!"
Exit Function
ElseIf Valor = 0 Then
EnLetras = "¡ No hay valor a convertir o... está en cero !!!"
Exit Function
End If
If Valor < 0 Then Valor = Abs(Valor)
Cents = Format((Valor - Int(Valor)) * 100, " 00") & "/100"
If Int(Valor) = 1 Then
EnLetras = "(un peso con" & Cents & ")"
Exit Function
End If
EnLetras = "(" & Letras(Int(Valor)) & " pesos con" & Cents & ")"
End Function

' Función Auxiliar [de uso privado] '
Private Function Letras(Valor) As String
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

Saludos,
Héctor.

P.D. [la 'auxiliar'] es una funcion que publico en este foro Claudio Sepulveda hace [algun] tiempo
no estoy seguro si es de su 'autoria' ...['por si las dudas']... :))
Respuesta Responder a este mensaje
#2 Cheeky
22/10/2003 - 05:51 | Informe spam
Con el permiso de Héctor Miguel pongo una adaptación de su Función Principal que contempla todos los
casos de valor para una correcta redacción al convertirlos en letra.

Está para Euros, pero se puede pasar a cualquier otra moneda en un pis pas.

(Como ha dicho Héctor Miguel, hay que insertarlo en un módulo junto con la Fórmula Auxilar, que
posteó en su mensaje, para que funcione correctamente.)

' Función Principal '
Function EnLetras(Valor) As String
If Not IsNumeric(Valor) Then GoTo nonumerico Else GoTo Variables
Variables:
Dim Cents As String
Dim Resto As String
Dim moneda As String
Dim centavo As String
If Int(Abs(Valor)) = 1 Then moneda = " euro" Else moneda = " euros" ' En caso de otra moneda
cambiar euro y euros por la moneda y su plural
Resto = Round(Abs(Valor) - Int(Abs(Valor)), 2) * 100
If Resto = 1 Then centavo = " céntimo" Else centavo = " céntimos" ' Cambiar céntimo y
céntimos por la fracción correspondiente
nonumerico:
If Not IsNumeric(Valor) Then
EnLetras = "¡ La referencia no es valor o... 'excede' la precisión !!!"
Exit Function
End If
If Resto = 0 Then Cents = "" Else Cents = " con " & Letras(Resto) & centavo
EnLetras = "(" & Letras(Int(Abs(Valor))) & moneda & Cents & ")"
If Valor < 0 Then EnLetras = "menos " & EnLetras

End Function



Desde Salamanca, Cheeky
Respuesta Responder a este mensaje
#3 Héctor Miguel
22/10/2003 - 20:14 | Informe spam
Hola, Cheeky !

me parece una excelente demostracion de lo sencillo que resulta 'adaptar' la funcion 'principal' ;)
[en realidad, fue por eso que pense en 'separarla' de la funcion 'original' -que posteo Claudio alguna vez-]
de 'todas' las funciones 'del tipo' que he visto 'pasar' por este foro [y otros], esta es la mas 'amigable' [y sencilla]
-y si me permites- algunos comentarios para 'adelgazar' [y agilizar] el codigo:

1.- 'mueve' al principio el 'If Not IsNumeric... Exit Function' => te 'ahorras' 3 lineas de codigo
2.- 'junta' las declaraciones de las varialbes en una sola linea => te 'ahorras' [otras] 3 lineas de codigo
3.- la funcion 'Round' NO 'funciona' en la version '97 [que sigue 'activa'], cambiala por Application.Round
4.- agrega un 'If' para 'detectar' si son -b/m-illones 'cerrados' y 'poner' la moneda como 'DE' Moneda
[habra que agregar un espacio a ' billones' en la ultima sentencia =>Case Else<= -en la funcion 'auxiliar'-]
5.- la UNICA 'desventaja' de esta/s funcion/es es que SOLO 'contemplan' monedas del 'genero' masculino :((
['trabajar' con monedas 'femeninas' REQUIERE 'quemar' un poco mas de neuronas] :))

la 'nueva' [propuesta de] funcion quedaria como sigue:
' Función Principal '
Function EnLetras(Valor) As String
If Not IsNumeric(Valor) Then
EnLetras = "¡ La referencia no es valor o... 'excede' la precisión !!!"
Exit Function
End If
Dim Moneda As String, Fracs As String, Cents As Integer
If Int(Abs(Valor)) = 1 Then Moneda = " euro" Else Moneda = " euros"
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 = " céntimo" Else Fracs = " céntimos"
If Cents = 0 Then Fracs = "" Else Fracs = " con " & Letras(Cents) & Fracs
EnLetras = "(" & Letras(Abs(Valor)) & Moneda & Fracs & ")"
If Valor < 0 Then EnLetras = "menos " & EnLetras
End Function

Saludos,
Héctor.

P.D. para mi 'uso personal', tengo una 'coleccion' de [solamente] 5 de ellas
si te interesan, dime a donde te las hago llegar ;)
Respuesta Responder a este mensaje
#4 Cheeky
23/10/2003 - 02:18 | Informe spam
Lo has dejado pulidito el código, sí señor.

Me lo guardo, que seguro que me vendrá bien para alguna aplicación de recibos.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida