Function CantidadEnLetra(tyCantidad As Currency) As String
Dim lyCantidad As Currency, lyCentavos As Currency, lnDigito As Byte, lnPrimerDigito As Byte, lnSegundoDigito As Byte, lnTercerDigito As Byte, lcBloque As String, lnNumeroBloques As Byte, lnBloqueCero
tyCantidad = Round(tyCantidad, 2)
lyCantidad = Int(tyCantidad)
lyCentavos = (tyCantidad - lyCantidad) * 100
laUnidades = Array("UN", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE", "DIEZ", "ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIESISEIS", "DIESISIETE", "DIESIOCHO", "DIESINUEVE", "VEINTE", "VEINTIUN", "VEINTIDOS", "VEINTITRES", "VEINTICUATRO", "VEINTICINCO", "VEINTISEIS", "VEINTISIETE", "VEINTIOCHO", "VEINTINUEVE")
laDecenas = Array("DIEZ", "VEINTE", "TREINTA", "CUARENTA", "CINCUENTA", "SESENTA", "SETENTA", "OCHENTA", "NOVENTA")
laCentenas = Array("CIENTO", "DOSCIENTOS", "TRESCIENTOS", "CUATROCIENTOS", "QUINIENTOS", "SEISCIENTOS", "SETECIENTOS", "OCHOCIENTOS", "NOVECIENTOS")
lnNumeroBloques = 1
Do
lnPrimerDigito = 0
lnSegundoDigito = 0
lnTercerDigito = 0
lcBloque = ""
lnBloqueCero = 0
For i = 1 To 3
lnDigito = lyCantidad Mod 10
If lnDigito <> 0 Then
Select Case i
Case 1
lcBloque = " " & laUnidades(lnDigito - 1)
lnPrimerDigito = lnDigito
Case 2
If lnDigito <= 2 Then
lcBloque = " " & laUnidades((lnDigito * 10) + lnPrimerDigito - 1)
Else
lcBloque = " " & laDecenas(lnDigito - 1) & IIf(lnPrimerDigito <> 0, " Y", Null) & lcBloque
End If
lnSegundoDigito = lnDigito
Case 3
lcBloque = " " & IIf(lnDigito = 1 And lnPrimerDigito = 0 And lnSegundoDigito = 0, "CIEN", laCentenas(lnDigito - 1)) & lcBloque
lnTercerDigito = lnDigito
End Select
Else
lnBloqueCero = lnBloqueCero + 1
End If
lyCantidad = Int(lyCantidad / 10)
If lyCantidad = 0 Then
Exit For
End If
Next i
Select Case lnNumeroBloques
Case 1
CantidadEnLetra = lcBloque
Case 2
CantidadEnLetra = lcBloque & IIf(lnBloqueCero = 3, Null, " MIL") & CantidadEnLetra
Case 3
CantidadEnLetra = lcBloque & IIf(lnPrimerDigito = 1 And lnSegundoDigito = 0 And lnTercerDigito = 0, " MILLON", " MILLONES") & CantidadEnLetra
End Select
lnNumeroBloques = lnNumeroBloques + 1
Loop Until lyCantidad = 0
CantidadEnLetra = "(" & CantidadEnLetra & IIf(tyCantidad > 1, " PESOS ", " PESO ") & Format(Str(lyCentavos), "00") & "/100 M.N. )"
End Function
Comentarios sobre la versión: Versión 1 (14)
Primero que nada quiero agradecer a Roberto por el excelente codigo, y quiero darle las gracias por su excelente respuesta a mi pregunta de como utilizarlo en Visual y no lo creera pero me decia que el sinceramente no sabia como utilizarlo en Visual pero con el ejemplo que me dio para Excel, he sacado la manera de utilizarlo y es la Siguioente y creo que algunas otras personas tampoco sabian:
PARA UTILIZARLO EN VISUAL BASIC:
LETRA.Text = CantidadEnLetra(SUBTOTAL.Text)
LETRA.Text = "CAJA DE TEXTO EN DONDE SE MOSTRARA LA CANTIDAD EN LETRAS"
CantidadEnLetra =" Funcion para convertir a letras los nemeros.
SUBTOTAL.Text="CAJA DE TEXTO, EN DONDE SE TIENE LA CANTIDAD A CONVERTIR.
Hacen más de 15 años hice uno demasiado largo, que primero preguntaba las unidades que deseaba escribir (tipo de moneda, medidas lineales o de superficie, gramos, litros, grados centígrados o farenheit, etc), luego debía escribir en guarismos, el número que deseaba escribir en letras, con el objeto de que el resultase, además de escribir los guarismos en letras, también escribiese de qué se trataba. Incluso le añadí un género, porque las toneladas son, P Ej. quinientAs, mientras que los pesos son quinientOs.
El macro era llamada por otro macro porque algo de mi trabajo es la redacción de documentos y la idea es que cuando se esté elaborando uno, invoque el programa, coloque la cifra y continúe lo que reste del documento.
Nunca estudié nada de computación, de manera que lo hice empíricamente.