Problema al convertir Números a letras en función en Access 2007

desde México, D.F.

Tengo una función que me convierte los números a letras y la llamo desde un cuadro de texto independiente en un informe de Access 2007
=PesosMN([pago])
Me funciona perfectamente excepto por 2 situaciones:
1.- Cuando el valor del campo [pago] es 0 (cero), el resultado es: (PESO 00/100 M.N.)
Pregunta ¿Cómo se podría modificar para que cuando el valor sea cero escriba:
(0 PESOS 00/100 M.N.)
2.- Cuando el valor del campo [pago] es Nulo el resultado es: #Error
Pregunta: ¿Como se puede modificar para que cuando el valor sea nulo, escriba un mensaje como por ejemplo: "Sin pago realizado".


Gracias de antemano por su apoyo.
El código de la función es la siguiente:
Option Compare Database
Function PesosMN(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", "DIECISÉIS", "DIECISIETE", "DIECIOCHO", "DIECINUEVE", "VEINTE", "VEINTIÚN", "VEINTIDÓS", "VEINTITRÉS", "VEINTICUATRO", "VEINTICINCO", "VEINTISÉIS", "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
PesosMN = lcBloque
Case 2
PesosMN = lcBloque & IIf(lnBloqueCero = 3, Null, " MIL") & PesosMN
Case 3
PesosMN = lcBloque & IIf(lnPrimerDigito = 1 And lnSegundoDigito = 0 And lnTercerDigito = 0, " MILLÓN", " MILLONES") & PesosMN
End Select
lnNumeroBloques = lnNumeroBloques + 1
Loop Until lyCantidad = 0
PesosMN = "(" & PesosMN & IIf(tyCantidad > 1, " PESOS ", " PESO ") & Format(Str(lyCentavos), "00") & "/100 M.N.)"
End Function

1 respuesta

Respuesta

Para poder recibir un valor nulo debes anteponer la instrucción Optional en este caso la definición de la función quedaría;

Function PesosMN(Optional tyCantidad As Currency) As String

Debes incluir la siguientes DIM

' Si no pasa el parámetro retorna Sin pago realizado

If CLng(tyCantidad) = 0 Then
PesosMN = " Sin pago realizado"

Exit Function
End If

if tyCantidad= then

PesosMN = "0 PESOS 00/100 M.N."
Exit Function

End if

Espero te sirva, no obstante, esta función está bastante incompleta ya que no pude retornar el texto para cantidades grandes como 999.999.999,99 cifras que en mi país (Colombia) se pueden presentar. Aquí te dejo una de mis funciones, tengo otra más completa que pasa el número en Español e Inglés (USA), en mayúsculas, minúsculas o la primera letra en mayúscula.

Public Function ValorLetra(ByVal quenumero As Currency) As String
'-------------------------------
'Función para pasar números a letras en pesos
'Llamar como: ValorLetras(quenumero)
'Se puede convertir hasta 999.999.999.99
'Elaborado Por: Eduardo Pérez Fernández
'Diciembre 3 de 2000
'---------------------------------------
Dim numero As Double
Dim aux As Double
Dim nro As String
Dim CENTAVOS As Double
Dim FRACCIÓN
Dim N As String
Dim n1 As String
Dim n2, N3, N4, N5, N6, N7, N8, N9, N10, N11, N12, N13, N14, N15, N16, N17, N18, N19, N20 As String
Dim N30, N40, N50, N60, N70, N80, N90 As String
Dim N100, N200, N300, N400, N500, N600, N700, N800, N900 As String
Dim contador, inicio As Integer
Dim CADENA As String
Dim NUMP As String
Dim SUBCADENA As String
Dim CENTENA, DECENA, UNIDAD As String
Dim T
numero = Format(quenumero, "000000000.00")
aux = Int(numero)
CENTAVOS = 100 * (numero - aux)
CENTAVOS = CInt(CENTAVOS)
If CENTAVOS < 10 Then
FRACCIÓN = "0" + Trim(Str(CENTAVOS)) + "/100"
Else
FRACCIÓN = Trim(Str(CENTAVOS)) + "/100"
End If
N = ""
n1 = "UN"
n2 = "DOS"
N3 = "TRES"
N4 = "CUATRO"
N5 = "CINCO"
N6 = "SEIS"
N7 = "SIETE"
N8 = "OCHO"
N9 = "NUEVE"
N10 = "DIEZ"
N11 = "ONCE"
N12 = "DOCE"
N13 = "TRECE"
N14 = "CATORCE"
N15 = "QUINCE"
N16 = "DIECISEIS"
N17 = "DIECISIETE"
N18 = "DIECIOCHO"
N19 = "DIECINUEVE"
N20 = "VEINTE"
N30 = "TREINTA"
N40 = "CUARENTA"
N50 = "CINCUENTA"
N60 = "SESENTA"
N70 = "SETENTA"
N80 = "OCHENTA"
N90 = "NOVENTA"
N100 = "CIENTO"
N200 = "DOSCIENTOS"
N300 = "TRESCIENTOS"
N400 = "CUATROCIENTOS"
N500 = "QUINIENTOS"
N600 = "SEISCIENTOS"
N700 = "SETECIENTOS"
N800 = "OCHOCIENTOS"
N900 = "NOVECIENTOS"
contador = 1
inicio = 1
If aux = 0 Then
CADENA = Trim(Str(CENTAVOS))
Else
CADENA = Trim(Str(aux))
End If
NUMP = ""
'millones , millares y centenas
If aux = 0 Then
aux = 0
Else
aux = Len(Trim(aux))
End If
Select Case aux
Case 0
CADENA = Str(CENTAVOS)
Case 1
CADENA = "00" + CADENA
Case 2
CADENA = "0" + CADENA
Case 4
CADENA = "00" + CADENA
Case 5
CADENA = "0" + CADENA
Case 7
CADENA = "00" + CADENA
Case 8
CADENA = "0" + CADENA
End Select
While contador < 4
'descompone centenas, decenas y unidades
SUBCADENA = mId(CADENA, inicio, 3)
CENTENA = mId(SUBCADENA, 1, 1) + "00"
DECENA = mId(SUBCADENA, 2, 2)
UNIDAD = mId(SUBCADENA, 3, 1)
If SUBCADENA = "100" Then
N100 = "CIEN"
End If
If Val(SUBCADENA) > 99 Then
Select Case CENTENA
Case "100"
NUMP = NUMP + N100 + " "
Case "200"
NUMP = NUMP + N200 + " "
Case "300"
NUMP = NUMP + N300 + " "
Case "400"
NUMP = NUMP + N400 + " "
Case "500"
NUMP = NUMP + N500 + " "
Case "600"
NUMP = NUMP + N600 + " "
Case "700"
NUMP = NUMP + N700 + " "
Case "800"
NUMP = NUMP + N800 + " "
Case "900"
NUMP = NUMP + N900 + " "
Case "90"
NUMP = NUMP + N90 + " "
End Select
End If
'transformar las decenas
T = Val(DECENA)
If T > 0 Then
Select Case True
Case (Int(T / 10#) = T / 10#) Or (T > 9 And T < 20)
Select Case DECENA
Case "10"
NUMP = NUMP + N10 + " "
Case "11"
NUMP = NUMP + N11 + " "
Case "12"
NUMP = NUMP + N12 + " "
Case "13"
NUMP = NUMP + N13 + " "
Case "14"
NUMP = NUMP + N14 + " "
Case "15"
NUMP = NUMP + N15 + " "
Case "16"
NUMP = NUMP + N16 + " "
Case "17"
NUMP = NUMP + N17 + " "
Case "18"
NUMP = NUMP + N18 + " "
Case "19"
NUMP = NUMP + N19 + " "
Case "20"
NUMP = NUMP + N20 + " "
Case "30"
NUMP = NUMP + N30 + " "
Case "40"
NUMP = NUMP + N40 + " "
Case "50"
NUMP = NUMP + N50 + " "
Case "60"
NUMP = NUMP + N60 + " "
Case "70"
NUMP = NUMP + N70 + " "
Case "80"
NUMP = NUMP + N80 + " "
Case "90"
NUMP = NUMP + N90 + " "
Case "100"
NUMP = NUMP + N100 + " "
End Select
Case T > 9 And (Int(T / 10#) <> T / 10#)
DECENA = mId(DECENA, 1, 1) + "0"
If DECENA <> "20" Then
Select Case DECENA
Case "10"
NUMP = NUMP + N10
Case "20"
NUMP = NUMP + N20
Case "30"
NUMP = NUMP + N30
Case "40"
NUMP = NUMP + N40
Case "50"
NUMP = NUMP + N50
Case "60"
NUMP = NUMP + N60
Case "70"
NUMP = NUMP + N70
Case "80"
NUMP = NUMP + N80
Case "90"
NUMP = NUMP + N90
Case "100"
NUMP = NUMP + N100
End Select
Select Case UNIDAD
Case "1"
NUMP = NUMP + " Y " + n1
Case "2"
NUMP = NUMP + " Y " + n2
Case "3"
NUMP = NUMP + " Y " + N3
Case "4"
NUMP = NUMP + " Y " + N4
Case "5"
NUMP = NUMP + " Y " + N5
Case "6"
NUMP = NUMP + " Y " + N6
Case "7"
NUMP = NUMP + " Y " + N7
Case "8"
NUMP = NUMP + " Y " + N8
Case "9"
NUMP = NUMP + " Y " + N9
Case "10"
NUMP = NUMP + " Y " + N10
End Select
Else
Select Case UNIDAD
Case "1"
NUMP = NUMP + "VEINTI" + n1
Case "2"
NUMP = NUMP + "VEINTI" + n2
Case "3"
NUMP = NUMP + "VEINTI" + N3
Case "4"
NUMP = NUMP + "VEINTI" + N4
Case "5"
NUMP = NUMP + "VEINTI" + N5
Case "6"
NUMP = NUMP + "VEINTI" + N6
Case "7"
NUMP = NUMP + "VEINTI" + N7
Case "8"
NUMP = NUMP + "VEINTI" + N8
Case "9"
NUMP = NUMP + "VEINTI" + N9
Case "10"
NUMP = NUMP + "VEINTI" + n1
End Select
End If
Case T < 10
Select Case UNIDAD
Case "1"
NUMP = NUMP + n1
Case "2"
NUMP = NUMP + n2
Case "3"
NUMP = NUMP + N3
Case "4"
NUMP = NUMP + N4
Case "5"
NUMP = NUMP + N5
Case "6"
NUMP = NUMP + N6
Case "7"
NUMP = NUMP + N7
Case "8"
NUMP = NUMP + N8
Case "9"
NUMP = NUMP + N9
Case "10"
NUMP = NUMP + N10
End Select
End Select
End If
If numero > 999999 And contador = 1 Then
NUMP = NUMP + " MILLONES "
End If
If Left(NUMP, 11) = "UN MILLONES" Then
NUMP = " UN MILLON "
End If
If numero > 999 And numero < 1000000 And contador = 1 And Val(SUBCADENA) > 0 Then
NUMP = NUMP + " MIL "
End If
If numero > 999999 And contador = 2 And Val(SUBCADENA) > 0 Then
NUMP = NUMP + " MIL "
End If
inicio = (contador * 3) + 1
contador = contador + 1
Wend
'If numero = 1000000 Then
'NUMP = Trim(NUMP) + " DE"
'End If
' Modifo aqui para MILLONES DE .. cuando son mayores que 1000000 y multiplos en ceros
If numero >= 1000000 Then
If numero / 1000000 = Int(numero / 1000000) Then
NUMP = Trim(NUMP) + " DE"
End If
End If
'deletrea el numero
Select Case True
Case CENTAVOS = 0 And numero > 1
nro = " " + NUMP + " PESOS "
Case CENTAVOS = 0 And Int(numero) = 1
nro = " " + NUMP + " PESO "
Case CENTAVOS <> 0 And Int(numero) = 1
nro = " " + NUMP + " PESO CON " + FRACCIÓN + " "
Case CENTAVOS <> 0 And numero > 1
nro = " " + NUMP + " PESOS CON " + FRACCIÓN + " "
Case Else
nro = " " + NUMP + " CENTAVOS "
End Select
ValorLetra = nro
End Function

Observa que en la función no incluyo Optional yo valido null y cero antes de llamar la función.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas