Macro para convertir de Numeros a Letras

5
'********************************************************************* * '** **' '** CONVERTIR DE NUMEROS A LETRAS **' '** **' '** licencia: USO LIBRE **' '** **' '** **' '** **' '********************************************************************* * Public Function CLetras(ByVal numero As Double, Optional fmtoUnidad As Integer = 0, Optional Unidades As String = "Kilos", Optional Unidad As String = "Kilo", Optional Genero As String = "M") As String Dim strUnidad(0 To 5) As String Dim strUnidades(0 To 5) As String Dim strCifras(0 To 4) As String Dim NumeroCifras As Byte Dim NumeroTercios As Byte Dim strNumero As String Dim strTMP As String Dim dblNumeroEntero As Double Dim intNumeroTmp As Integer Dim intCentavos As Integer Dim J As Integer Dim intNumTmp As Integer strUnidades(0) = " pesos m/cte": strUnidades(1) = " unidades": strUnidades(2) = " dolares": strUnidades(3) = " euros": strUnidades(4) = " " & Unidades: strUnidades(5) = "" strUnidad(0) = " peso m/cte": strUnidad(1) = " unidad": strUnidad(2) = " dolar": strUnidad(3) = " euro": strUnidad(4) = " " & Unidad: strUnidad(5) = "" strCifras(1) = "": strCifras(2) = " mil ": strCifras(3) = " millones ": strCifras(4) = " mil ": strCifras(0) = " mill�n " intCentavos = Int((Round(numero, 2) * 100) - (Int(numero) * 100)) dblNumeroEntero = Round(numero, 2) - (intCentavos / 100) strNumero = CStr(Abs(dblNumeroEntero)) NumeroCifras = Len(strNumero) NumeroTercios = Abs(Int(-NumeroCifras / 3))

description

Macro en lenguaje VBA que convierte números a letras en un campo

Transcript of Macro para convertir de Numeros a Letras

'**********************************************************************'** **''** CONVERTIR DE NUMEROS A LETRAS **''** **''** licencia: USO LIBRE **''** **''** **''** **''**********************************************************************

Public Function CLetras(ByVal numero As Double, Optional fmtoUnidad As Integer = 0, Optional Unidades As String = "Kilos", Optional Unidad As String = "Kilo", Optional Genero As String = "M") As StringDim strUnidad(0 To 5) As StringDim strUnidades(0 To 5) As StringDim strCifras(0 To 4) As StringDim NumeroCifras As ByteDim NumeroTercios As ByteDim strNumero As StringDim strTMP As StringDim dblNumeroEntero As DoubleDim intNumeroTmp As IntegerDim intCentavos As IntegerDim J As IntegerDim intNumTmp As Integer

strUnidades(0) = " pesos m/cte": strUnidades(1) = " unidades": strUnidades(2) = " dolares": strUnidades(3) = " euros": strUnidades(4) = " " & Unidades: strUnidades(5) = ""strUnidad(0) = " peso m/cte": strUnidad(1) = " unidad": strUnidad(2) = " dolar": strUnidad(3) = " euro": strUnidad(4) = " " & Unidad: strUnidad(5) = ""strCifras(1) = "": strCifras(2) = " mil ": strCifras(3) = " millones ": strCifras(4) = " mil ": strCifras(0) = " milln "

intCentavos = Int((Round(numero, 2) * 100) - (Int(numero) * 100))dblNumeroEntero = Round(numero, 2) - (intCentavos / 100)strNumero = CStr(Abs(dblNumeroEntero))NumeroCifras = Len(strNumero)NumeroTercios = Abs(Int(-NumeroCifras / 3))

Select Case dblNumeroEntero Case 0 strTMP = "cero" Case 1 If fmtoUnidad 5 Then strTMP = "un" strUnidades(fmtoUnidad) = strUnidad(fmtoUnidad) Else strTMP = "uno" End If If Genero "M" Then strTMP = "una" Case 2 To 999 strTMP = CLetrasS1(CLetrasS3(dblNumeroEntero, 1), Genero) Case 1000 strTMP = "mil" Case 1000000 strTMP = "un milln" Case 1000001 To 1999999 strCifras(3) = " milln " For J = NumeroTercios To 1 Step -1 intNumTmp = CLetrasS3(dblNumeroEntero, J) If intNumTmp 0 Then strTMP = strTMP & CLetrasS1(intNumTmp, Genero) & strCifras(J) Next J Case Else For J = NumeroTercios To 1 Step -1 intNumTmp = CLetrasS3(dblNumeroEntero, J) If intNumTmp 0 Then strTMP = strTMP & CLetrasS1(intNumTmp, Genero) & strCifras(J) Next JEnd SelectIf Right(strTMP, 9) = "millones " Then strTMP = Mid(strTMP, 1, (Len(strTMP) - 9)) & "millones de"If Right(strTMP, 6) = "milln" Then strTMP = Mid(strTMP, 1, (Len(strTMP) - 6)) & "milln de"strTMP = strTMP & strUnidades(fmtoUnidad)

If intCentavos > 0 Then Select Case fmtoUnidad Case 0 strTMP = strTMP & " con " & CLetrasS1(intCentavos, Genero) & " centavos" Case 5 strTMP = strTMP & " punto " & CLetrasS1(intCentavos, Genero) End SelectEnd If

'cambiar "un mil" o "una mil" por "mil" strTMP = Replace(strTMP, "una mil", "mil", , , vbTextCompare) strTMP = Replace(strTMP, "un mil", "mil", , , vbTextCompare)

CLetras = strTMPEnd Function

'funcin que secundaria que calcula las decenasPrivate Function CLetrasS2(numero As Integer, Genero As String) As StringDim strUnidades(0 To 20) As String: Dim strDecenas(2 To 9) As String: Dim Unidades As Byte: Dim Decenas As Byte: Dim strTMP As String

strUnidades(0) = "": strUnidades(2) = "dos": strUnidades(3) = "tres": strUnidades(4) = "cuatro": strUnidades(5) = "cinco": strUnidades(6) = "seis": strUnidades(7) = "siete": strUnidades(8) = "ocho": strUnidades(9) = "nueve": strUnidades(10) = "diez": strUnidades(11) = "once": strUnidades(12) = "doce": strUnidades(13) = "trece": strUnidades(14) = "catorce": strUnidades(15) = "quince": strUnidades(16) = "diez y seis": strUnidades(17) = "diez y siete": strUnidades(18) = "diez y ocho": strUnidades(19) = "diez y nueve": strUnidades(20) = "veinte"strDecenas(2) = "veinti": strDecenas(3) = "treinta": strDecenas(4) = "cuarenta": strDecenas(5) = "cincuenta": strDecenas(6) = "sesenta": strDecenas(7) = "setenta": strDecenas(8) = "ochenta": strDecenas(9) = "noventa"If Genero = "M" Then strUnidades(1) = "un"Else strUnidades(1) = "una" End IfDecenas = Int(numero / 10)Unidades = Int(numero - (Decenas * 10))

Select Case numero Case 1 To 20 strTMP = strUnidades(numero) Case 21 To 29 strTMP = strDecenas(Decenas) & strUnidades(Unidades) Case 30 To 99 If (Decenas > 0) And (Unidades > 0) Then strTMP = strDecenas(Decenas) & " y " & strUnidades(Unidades) If (Decenas > 0) And (Unidades = 0) Then strTMP = strDecenas(Decenas) End SelectCLetrasS2 = strTMPEnd Function

'Funcion secundaria que calcula las centenas

Private Function CLetrasS1(numero As Integer, Genero As String) As StringDim strCentenas(1 To 9) As String: Dim Centenas As Byte: Dim strTMP As String: Dim intNumeroEntero As Integer

intNumeroEntero = Int(numero)Centenas = Int(numero / 100)If Genero = "M" Then strCentenas(1) = "ciento": strCentenas(2) = "doscientos": strCentenas(3) = "trecientos": strCentenas(4) = "cuatrocientos": strCentenas(5) = "quinientos": strCentenas(6) = "seiscientos": strCentenas(7) = "setecientos": strCentenas(8) = "ochocientos": strCentenas(9) = "novecientos"Else strCentenas(1) = "ciento": strCentenas(2) = "doscientas": strCentenas(3) = "trecientas": strCentenas(4) = "cuatrocientas": strCentenas(5) = "quinientas": strCentenas(6) = "seiscientas": strCentenas(7) = "setecientas": strCentenas(8) = "ochocientas": strCentenas(9) = "novecientas"End IfSelect Case numero Case 0 To 99 strTMP = CLetrasS2(intNumeroEntero, Genero) Case 100 strTMP = "cien" Case 200, 300, 400, 500, 600, 700, 800, 900 strTMP = strCentenas(Centenas) Case Else strTMP = strCentenas(Centenas) & " " & CLetrasS2(Int(numero - (Centenas * 100)), Genero)End SelectCLetrasS1 = strTMPEnd Function

'Funcion secundaria que saca un tres cifras del numeroPrivate Function CLetrasS3(numero As Double, Tercio As Integer) As IntegerDim CadaCifra As IntegerDim OrdenInverso As IntegerDim intNumeroTmp As IntegerDim NombreCifra(1 To 12) As String

OrdenInverso = Len(CStr(numero))

'Borra la matrizFor CadaCifra = 1 To 12: NombreCifra(CadaCifra) = "0": Next CadaCifra

For CadaCifra = 1 To Len(CStr(numero)) NombreCifra(OrdenInverso) = Val(Mid(CStr(numero), CadaCifra, 1)) OrdenInverso = OrdenInverso - 1Next CadaCifraintNumeroTmp = Val(NombreCifra((Tercio * 3)) & NombreCifra((Tercio * 3) - 1) & NombreCifra((Tercio * 3) - 2))CLetrasS3 = intNumeroTmpEnd Function