Tengo un código (no es de mi autoría) que pasa cantidades o números a letras pero en el caso de ser negativos me arroja error

Tengo un complemento bajado del internet (no es de mi autoría), este devuelve los números a letras y en este caso a dolares; todo funciona muy bien cuando las cantidades son positivas pero cuando hay un valor negativo este me arroja error, el requerimiento u ayuda es que cuando la cantidad sea negativa de igual manera lo convieta en letras lo único que al final diga VALOR NEGATIVO: EJEM.

-2.457.26 => son: dos mil cuatrocientos cincuenta y siete dolares con 26/100 centavos, valor negativo.

Aquí esta el código de visual por favor me ayudan a corregir este pequeño inconveniente, de antemano muchas gracias.

---------------------------------------------------------------------------------------------------------------

Function DOLARES(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
Dim laUnidades As Variant, laDecenas As Variant, laCentenas As Variant, I As Variant 'Si esta como Option Explicit
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", "DIECISEIS", "DIECISIETE", "DIECIOCHO", "DIECINUEVE", "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
DOLARES = lcBloque
Case 2
DOLARES = lcBloque & IIf(lnBloqueCero = 3, Null, " MIL") & DOLARES
Case 3
DOLARES = lcBloque & IIf(lnPrimerDigito = 1 And lnSegundoDigito = 0 And lnTercerDigito = 0, " MILLON", " MILLONES") & DOLARES
End Select
lnNumeroBloques = lnNumeroBloques + 1
Loop Until lyCantidad = 0
DOLARES = "SON: " & DOLARES & IIf(tyCantidad > 1, " DOLARES CON ", " DOLAR CON ") & Format(Str(lyCentavos), "00") & "/100 CENTAVOS"
End Function

1 Respuesta

Respuesta
1

Te recomiendo hacer un workaround.

Primero: Validar si el numero es negativo. Si es, rellenar una variable del tipo bool con un true.

Segundo: Antes de llamar a la función DOLARES ejecutar un modulo al numero así siempre llegara positivo.

Tercero: Agregarle un parámetro más a la función Dolares de tipo bool, para que dicha función sepa si es un negativo o no.

Cuarto: En la linea  DOLARES = "SON: " & DOLARES & IIf(tyCantidad > 1, " DOLARES CON ", " DOLAR CON ") & Format(Str(lyCentavos), "00") & "/100 CENTAVOS" 

agregarle una nueva variable del tipo string.

 DOLARES = "SON: " & DOLARES & IIf(tyCantidad > 1, " DOLARES CON ", " DOLAR CON ") & Format(Str(lyCentavos), "00") & "/100 CENTAVOS" & IsNegativo

Esa variable "IsNegativo", debería llenarse con el string ", valor negativo."

en el caso de un true en la funcion. Si no, debería dejarlo en vacío, string, empty.

PD. Si me envías la version del vb, seria más rápido.

Gracias por tu recomendación pero lamentablemente no entiendo ni J de V.B. osea no se nada de programación en visual, me podrías dar un correo electrónico donde enviarte el archivo (Dolares.xla) para que me ayudes a corregir con lo que me estas comentando... por favor... mi correo es:

[email protected]

¿Xla? ¿Es un excel? ¿Osea estas usando las macros de excel que se escriben en vb?

Hola gracias por la preocupación y te envío a tu correo el archivo de excel para ver como me puedes ayudar... de antemano muchas gracias

He tomado el tuyo como ejemplo y lo he modificado con la logica que te comente.

Function CONVERTIRNUM(Numero As Double, Optional CentimosEnLetra As Boolean) As String

Dim Moneda As String
Dim Monedas As String
Dim Centimo As String
Dim Centimos As String
Dim Preposicion As String
Dim EsNegativo As String
Dim NumCentimos As Double
Dim Letra As String
Dim valorNegativo As Boolean
Const Maximo = 1999999999.99

'************************************************************
' Parámetros
'************************************************************
Moneda = "Yen" 'Nombre de Moneda (Singular)
Monedas = "Yenes" 'Nombre de Moneda (Plural)
Centimo = "Centavo" 'Nombre de Céntimos (Singular)
Centimos = "Centavos" 'Nombre de Céntimos (Plural)
Preposicion = "Con" 'Preposición entre Moneda y Céntimos
EsNegativo = "valor negativo" 'Cadena que denota si es negativo
'************************************************************
If (Numero < 0) Then
Numero = Abs(Numero)
valorNegativo = True
End If

'Validar que el Numero está dentro de los límites
If (Numero >= 0) And (Numero <= Maximo) Then

Letra = NUMERORECURSIVO((Fix(Numero))) 'Convertir el Numero en letras
'Si Numero = 1 agregar leyenda Moneda (Singular)
If (Numero = 1) Then
Letra = Letra & " " & Moneda
'De lo contrario agregar leyenda Monedas (Plural)
Else
Letra = Letra & " " & Monedas
End If
NumCentimos = Round((Numero - Fix(Numero)) * 100) 'Obtener los centimos del Numero
'Si NumCentimos es mayor a cero inicar la conversión
If NumCentimos >= 0 Then
'Si el parámetro CentimosEnLetra es VERDADERO obtener letras para los céntimos
If CentimosEnLetra Then
Letra = Letra & " " & Preposicion & " " & NUMERORECURSIVO(Fix(NumCentimos)) 'Convertir los céntimos en letra
'Si NumCentimos = 1 agregar leyenda Centimos (Singular)
If (NumCentimos = 1) Then
Letra = Letra & " " & Centimo
'De lo contrario agregar leyenda Centimos (Plural)
Else
Letra = Letra & " " & Centimos
End If
'De lo contrario mostrar los céntimos como número
Else
If NumCentimos < 10 Then
Letra = Letra & " 0" & NumCentimos & "/100"
Else
Letra = Letra & " " & NumCentimos & "/100"
End If
End If
End If

If (valorNegativo) Then
Letra = Letra & " " & EsNegativo
End If
'Regresar el resultado final de la conversión
CONVERTIRNUM = Letra

Else
'Si el Numero no está dentro de los límites, entivar un mensaje de error
CONVERTIRNUM = "ERROR: El número excede los límites."
End If

End Function

Function NUMERORECURSIVO(Numero As Long) As String

Dim Unidades, Decenas, Centenas
Dim Resultado As String

'**************************************************
' Nombre de los números
'**************************************************
Unidades = Array("", "Un", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve", "Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciséis", "Diecisiete", "Dieciocho", "Diecinueve", "Veinte", "Veintiuno", "Veintidos", "Veintitres", "Veinticuatro", "Veinticinco", "Veintiseis", "Veintisiete", "Veintiocho", "Veintinueve")
Decenas = Array("", "Diez", "Veinte", "Treinta", "Cuarenta", "Cincuenta", "Sesenta", "Setenta", "Ochenta", "Noventa", "Cien")
Centenas = Array("", "Ciento", "Doscientos", "Trescientos", "Cuatrocientos", "Quinientos", "Seiscientos", "Setecientos", "Ochocientos", "Novecientos")
'**************************************************

Select Case Numero
Case 0
Resultado = "Cero"
Case 1 To 29
Resultado = Unidades(Numero)
Case 30 To 100
Resultado = Decenas(Numero \ 10) + IIf(Numero Mod 10 <> 0, " y " + NUMERORECURSIVO(Numero Mod 10), "")
Case 101 To 999
Resultado = Centenas(Numero \ 100) + IIf(Numero Mod 100 <> 0, " " + NUMERORECURSIVO(Numero Mod 100), "")
Case 1000 To 1999
Resultado = "Mil" + IIf(Numero Mod 1000 <> 0, " " + NUMERORECURSIVO(Numero Mod 1000), "")
Case 2000 To 999999
Resultado = NUMERORECURSIVO(Numero \ 1000) + " Mil" + IIf(Numero Mod 1000 <> 0, " " + NUMERORECURSIVO(Numero Mod 1000), "")
Case 1000000 To 1999999
Resultado = "Un Millón" + IIf(Numero Mod 1000000 <> 0, " " + NUMERORECURSIVO(Numero Mod 1000000), "")
Case 2000000 To 1999999999
Resultado = NUMERORECURSIVO(Numero \ 1000000) + " Millones" + IIf(Numero Mod 1000000 <> 0, " " + NUMERORECURSIVO(Numero Mod 1000000), "")
End Select

NUMERORECURSIVO = Resultado

End Function

No se te olvide valorar la respuesta y

¡Gracias!, es precisamente lo que necesitaba, lo único que tendría que hacer es que la función me arroje primero ... SON: (cantidad en letras) y por ultimo cambiar la moneda, y al final antes de la palabra valor negativo aumentar una coma(,).

Te lo agradezco mucho por la colaboración pero si puedes hacer este ultimo cambio te lo reagradezco.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas