Convertir el importe de una factura en letra
Buenas tardes necesito convertir el importe de una factura en letra.
Espero puedan ayudarme
Gracias..
Espero puedan ayudarme
Gracias..
1 respuesta
Respuesta de query
1
1
Aquí te envío un módulo con tres procedimientos de los que sólo tendrás que utilizar la función abcednum indicándole el número y el género del número (masculino, femenino o neutro)
Option Compare Database 'Usar orden de base de datos en comparaciones de cadenas
Option Explicit
Global G_Genero_Numero As String
Global Const NUM_FEM = 0
Global Const NUM_MAS = 1
Global Const NUM_NEU = 2
Function abcednum(Num, lang As String) As String
G_Genero_Numero = lang
Select Case lang
Case "es", "esf"
abcednum = n2t_tbs_es(Num, NUM_FEM)
Case "esm"
abcednum = n2t_tbs_es(Num, NUM_MAS)
Case "esn"
abcednum = n2t_tbs_es(Num, NUM_NEU)
Case Else
abcednum = n2t_tbs_es(Num, NUM_FEM)
G_Genero_Numero = "es"
End Select
End Function
Function n2t_tbs_es(Num, sexo) As String
Dim abnum As Long, _
txt As String, _
xt As String
If Abs(Fix(Num)) > 999999999 Then
n2t_tbs_es = "Excedido valor soportado."
Exit Function
End If
abnum = Abs(Fix(Num))
xt = Right$(Format$(Fix(abnum / 1000000), "000"), 3)
If Val(xt) <> 0 Then txt = n2t_tbs_es_f(1, xt, sexo)
xt = Right$(Format$(Fix(abnum / 1000), "000"), 3)
If Val(xt) <> 0 Then txt = txt & n2t_tbs_es_f(2, xt, sexo)
xt = Right$(Format$(abnum, "000"), 3)
If Val(xt) <> 0 Then txt = txt & n2t_tbs_es_f(3, xt, sexo)
n2t_tbs_es = txt
End Function
Function n2t_tbs_es_f(n As Integer, cf As String, sexo) As String
' sexo: 0=femenino, 1=masculino, 2=masculino terminado en UN
Static cf1(16) As String, cf2(10) As String, cf3(10) As String, sw As Integer
Dim ftxt As String
If sw = 0 Then
cf1(1) = "UNA"
cf1(2) = "DOS"
cf1(3) = "TRES"
cf1(4) = "CUATRO"
cf1(5) = "CINCO"
cf1(6) = "SEIS"
cf1(7) = "SIETE"
cf1(8) = "OCHO"
cf1(9) = "NUEVE"
cf1(10) = "DIEZ"
cf1(11) = "ONCE"
cf1(12) = "DOCE"
cf1(13) = "TRECE"
cf1(14) = "CATORCE"
cf1(15) = "QUINCE"
cf2(1) = "DIECI"
cf2(2) = "VEINTI"
cf2(3) = "TREINTA"
cf2(4) = "CUARENTA"
cf2(5) = "CINCUENTA"
cf2(6) = "SESENTA"
cf2(7) = "SETENTA"
cf2(8) = "OCHENTA"
cf2(9) = "NOVENTA"
cf3(1) = "CIENTO"
cf3(2) = "DOS"
cf3(3) = "TRES"
cf3(4) = "CUATRO"
cf3(5) = "QUINIEN"
cf3(6) = "SEIS"
cf3(7) = "SETE"
cf3(8) = "OCHO"
cf3(9) = "NOVE"
sw = 1
End If
If sexo = 0 Then cf1(1) = "UNA" Else If n = 3 And sexo = 1 Then cf1(1) = "UNO" Else cf1(1) = "UN"
If Val(cf) = 1 And n = 2 Then GoTo sx4_n2t_tbs_es
If Mid$(cf, 1, 1) = "0" Then GoTo sx2_n2t_tbs_es
If Val(cf) = 100 Then ftxt = "CIEN": GoTo sx4_n2t_tbs_es
ftxt = cf3(Val(Mid$(cf, 1, 1)))
Select Case Val(Mid$(cf, 1, 1))
Case 1
ftxt = ftxt & " ": GoTo sx2_n2t_tbs_es
Case 2 To 4, 6 To 9
ftxt = ftxt & "CIEN"
End Select
If n > 1 And sexo = 0 Then
ftxt = ftxt & "TAS "
Else
ftxt = ftxt & "TOS "
End If
sx2_n2t_tbs_es:
Select Case Val(Mid$(cf, 2))
Case 10
ftxt = ftxt & "DIEZ "
Case 2 To 15
ftxt = ftxt & cf1(Val(Mid$(cf, 2)))
Case 20
ftxt = ftxt & "VEINTE "
Case Else
If Val(Mid$(cf, 2, 1)) > 0 Then ftxt = ftxt & cf2(Val(Mid$(cf, 2, 1)))
If Val(Mid$(cf, 2, 1)) > 2 Then
If Val(Mid$(cf, 3, 1)) = 0 Then GoTo sx4_n2t_tbs_es
ftxt = ftxt & " Y "
End If
If n = 1 And Mid$(cf, 3, 1) = "1" Then
ftxt = ftxt & "UN"
ElseIf Val(Mid$(cf, 3, 1)) > 0 Then
ftxt = ftxt & cf1(Val(Mid$(cf, 3, 1)))
End If
End Select
sx4_n2t_tbs_es:
Select Case n
Case 1
Select Case Val(cf)
Case 1
ftxt = ftxt & " MILLON "
Case Is > 1
ftxt = ftxt & " MILLONES "
End Select
Case 2
ftxt = ftxt & " MIL "
End Select
n2t_tbs_es_f = ftxt
End Function
SUERTE y que te sirva de ayuda.
Hasta luego.
NOTA: Si necesitas que se reconozca también la parte decimal, te recomiendo que te pases por esta dirección (http://guille.costasol.net/utilidades/cNum2Text.htm) donde tienen el mismo procedimiento pero mejorado. EL Guille es un tipo genial.
Option Compare Database 'Usar orden de base de datos en comparaciones de cadenas
Option Explicit
Global G_Genero_Numero As String
Global Const NUM_FEM = 0
Global Const NUM_MAS = 1
Global Const NUM_NEU = 2
Function abcednum(Num, lang As String) As String
G_Genero_Numero = lang
Select Case lang
Case "es", "esf"
abcednum = n2t_tbs_es(Num, NUM_FEM)
Case "esm"
abcednum = n2t_tbs_es(Num, NUM_MAS)
Case "esn"
abcednum = n2t_tbs_es(Num, NUM_NEU)
Case Else
abcednum = n2t_tbs_es(Num, NUM_FEM)
G_Genero_Numero = "es"
End Select
End Function
Function n2t_tbs_es(Num, sexo) As String
Dim abnum As Long, _
txt As String, _
xt As String
If Abs(Fix(Num)) > 999999999 Then
n2t_tbs_es = "Excedido valor soportado."
Exit Function
End If
abnum = Abs(Fix(Num))
xt = Right$(Format$(Fix(abnum / 1000000), "000"), 3)
If Val(xt) <> 0 Then txt = n2t_tbs_es_f(1, xt, sexo)
xt = Right$(Format$(Fix(abnum / 1000), "000"), 3)
If Val(xt) <> 0 Then txt = txt & n2t_tbs_es_f(2, xt, sexo)
xt = Right$(Format$(abnum, "000"), 3)
If Val(xt) <> 0 Then txt = txt & n2t_tbs_es_f(3, xt, sexo)
n2t_tbs_es = txt
End Function
Function n2t_tbs_es_f(n As Integer, cf As String, sexo) As String
' sexo: 0=femenino, 1=masculino, 2=masculino terminado en UN
Static cf1(16) As String, cf2(10) As String, cf3(10) As String, sw As Integer
Dim ftxt As String
If sw = 0 Then
cf1(1) = "UNA"
cf1(2) = "DOS"
cf1(3) = "TRES"
cf1(4) = "CUATRO"
cf1(5) = "CINCO"
cf1(6) = "SEIS"
cf1(7) = "SIETE"
cf1(8) = "OCHO"
cf1(9) = "NUEVE"
cf1(10) = "DIEZ"
cf1(11) = "ONCE"
cf1(12) = "DOCE"
cf1(13) = "TRECE"
cf1(14) = "CATORCE"
cf1(15) = "QUINCE"
cf2(1) = "DIECI"
cf2(2) = "VEINTI"
cf2(3) = "TREINTA"
cf2(4) = "CUARENTA"
cf2(5) = "CINCUENTA"
cf2(6) = "SESENTA"
cf2(7) = "SETENTA"
cf2(8) = "OCHENTA"
cf2(9) = "NOVENTA"
cf3(1) = "CIENTO"
cf3(2) = "DOS"
cf3(3) = "TRES"
cf3(4) = "CUATRO"
cf3(5) = "QUINIEN"
cf3(6) = "SEIS"
cf3(7) = "SETE"
cf3(8) = "OCHO"
cf3(9) = "NOVE"
sw = 1
End If
If sexo = 0 Then cf1(1) = "UNA" Else If n = 3 And sexo = 1 Then cf1(1) = "UNO" Else cf1(1) = "UN"
If Val(cf) = 1 And n = 2 Then GoTo sx4_n2t_tbs_es
If Mid$(cf, 1, 1) = "0" Then GoTo sx2_n2t_tbs_es
If Val(cf) = 100 Then ftxt = "CIEN": GoTo sx4_n2t_tbs_es
ftxt = cf3(Val(Mid$(cf, 1, 1)))
Select Case Val(Mid$(cf, 1, 1))
Case 1
ftxt = ftxt & " ": GoTo sx2_n2t_tbs_es
Case 2 To 4, 6 To 9
ftxt = ftxt & "CIEN"
End Select
If n > 1 And sexo = 0 Then
ftxt = ftxt & "TAS "
Else
ftxt = ftxt & "TOS "
End If
sx2_n2t_tbs_es:
Select Case Val(Mid$(cf, 2))
Case 10
ftxt = ftxt & "DIEZ "
Case 2 To 15
ftxt = ftxt & cf1(Val(Mid$(cf, 2)))
Case 20
ftxt = ftxt & "VEINTE "
Case Else
If Val(Mid$(cf, 2, 1)) > 0 Then ftxt = ftxt & cf2(Val(Mid$(cf, 2, 1)))
If Val(Mid$(cf, 2, 1)) > 2 Then
If Val(Mid$(cf, 3, 1)) = 0 Then GoTo sx4_n2t_tbs_es
ftxt = ftxt & " Y "
End If
If n = 1 And Mid$(cf, 3, 1) = "1" Then
ftxt = ftxt & "UN"
ElseIf Val(Mid$(cf, 3, 1)) > 0 Then
ftxt = ftxt & cf1(Val(Mid$(cf, 3, 1)))
End If
End Select
sx4_n2t_tbs_es:
Select Case n
Case 1
Select Case Val(cf)
Case 1
ftxt = ftxt & " MILLON "
Case Is > 1
ftxt = ftxt & " MILLONES "
End Select
Case 2
ftxt = ftxt & " MIL "
End Select
n2t_tbs_es_f = ftxt
End Function
SUERTE y que te sirva de ayuda.
Hasta luego.
NOTA: Si necesitas que se reconozca también la parte decimal, te recomiendo que te pases por esta dirección (http://guille.costasol.net/utilidades/cNum2Text.htm) donde tienen el mismo procedimiento pero mejorado. EL Guille es un tipo genial.
Gracias por contestar.
Mira estoy iniciándome en Access, no se si me podrías detallar más el procedimiento. Es decir, donde pondría yo este código que me mandaste.
Mira estoy iniciándome en Access, no se si me podrías detallar más el procedimiento. Es decir, donde pondría yo este código que me mandaste.
1º Create un módulo y pega el contenido del código que te he enviado.
2º Para utilizarlo, tendrás que colocar como origen del control de un cuadro de texto (desde la ventana propiedades del control en la ficha de datos) de un formulario o informe una llamada a la función abcdnum.
Ej:
=abcednum(NombreCampoNumerico, "esm")
- NombreCampoNumerico: es el nombre de uno de los campos de tipo numérico de tu formulario o informe.
2º Para utilizarlo, tendrás que colocar como origen del control de un cuadro de texto (desde la ventana propiedades del control en la ficha de datos) de un formulario o informe una llamada a la función abcdnum.
Ej:
=abcednum(NombreCampoNumerico, "esm")
- NombreCampoNumerico: es el nombre de uno de los campos de tipo numérico de tu formulario o informe.
Que tal query
Gracias por contestar tan rápido a mis preguntas.
La última pregunta que te hice, me resulto perfectamente. Gracias.
El único pero es que en una factura la cantidad en letra se escribe así.
Por ejemplo:
mil doscientos treinta pesos 45/100 m.n.
Y el código que me mandaste lo pone así
Mil doscientos treinta
Tendrás el resto del código para que ponga pesos y en numero los centavos.
Te lo agradecería mucho si lo tuvieras.
De todos modos muchísimas gracias query por tu ayuda me ha servido de mucho.
Saludos.
Gracias por contestar tan rápido a mis preguntas.
La última pregunta que te hice, me resulto perfectamente. Gracias.
El único pero es que en una factura la cantidad en letra se escribe así.
Por ejemplo:
mil doscientos treinta pesos 45/100 m.n.
Y el código que me mandaste lo pone así
Mil doscientos treinta
Tendrás el resto del código para que ponga pesos y en numero los centavos.
Te lo agradecería mucho si lo tuvieras.
De todos modos muchísimas gracias query por tu ayuda me ha servido de mucho.
Saludos.
Sustituye la antigua función adcdenum del módulo que creaste por esta nueva que trata la parte decimal como me estas comentando.
Function abcednum(Num, lang As String) As String
Dim sNumero As String
Dim sN As String
Dim lPosDecimal As Integer
G_Genero_Numero = lang
Select Case lang
Case "es", "esf"
sNumero = n2t_tbs_es(Num, NUM_FEM)
Case "esm"
sNumero = n2t_tbs_es(Num, NUM_MAS)
Case "esn"
sNumero = n2t_tbs_es(Num, NUM_NEU)
Case Else
sNumero = n2t_tbs_es(Num, NUM_FEM)
G_Genero_Numero = "es"
End Select
Dim sDecimal As String * 1
' Averiguar el signo decimal
sN = Format$(25.5, "#.#")
If InStr(sN, ".") Then
sDecimal = "."
Else
sDecimal = ","
End If
' Convierte a texto el nº y obtiene la parte decimal
sN = Format(Num, "#.##")
lPosDecimal = InStr(sN, sDecimal)
' Si hay decimales los muestra con el formato de México
If lPosDecimal Then
sN = Mid$(sN, lPosDecimal + 1, 2)
sNumero = sNumero & "pesos " & sN & "/100 m.n."
End If
abcednum = sNumero
End Function
Pruébalas y me comentas.
Function abcednum(Num, lang As String) As String
Dim sNumero As String
Dim sN As String
Dim lPosDecimal As Integer
G_Genero_Numero = lang
Select Case lang
Case "es", "esf"
sNumero = n2t_tbs_es(Num, NUM_FEM)
Case "esm"
sNumero = n2t_tbs_es(Num, NUM_MAS)
Case "esn"
sNumero = n2t_tbs_es(Num, NUM_NEU)
Case Else
sNumero = n2t_tbs_es(Num, NUM_FEM)
G_Genero_Numero = "es"
End Select
Dim sDecimal As String * 1
' Averiguar el signo decimal
sN = Format$(25.5, "#.#")
If InStr(sN, ".") Then
sDecimal = "."
Else
sDecimal = ","
End If
' Convierte a texto el nº y obtiene la parte decimal
sN = Format(Num, "#.##")
lPosDecimal = InStr(sN, sDecimal)
' Si hay decimales los muestra con el formato de México
If lPosDecimal Then
sN = Mid$(sN, lPosDecimal + 1, 2)
sNumero = sNumero & "pesos " & sN & "/100 m.n."
End If
abcednum = sNumero
End Function
Pruébalas y me comentas.
- Compartir respuesta
- Anónimo
ahora mismo