macro para excel convierte numeros a letras

Download Macro para excel convierte numeros a letras

If you can't read please download the document

Upload: frank-khemmer-rodriguez-munoz

Post on 18-Feb-2016

220 views

Category:

Documents


4 download

DESCRIPTION

El archivo contiene un macro para excel que convierte numeros a letras, y se utiliza como una fórmula ordinaria

TRANSCRIPT

https://onedrive.live.com/?cid=adcc2c4a5dc035df&id=ADCC2C4A5DC035DF%216544&ithint=folder,rar&authkey=!ADA-GaRDoRuomRQOption ExplicitOption Compare Text' Valores por defecto para BolvaresPublic Function NumLetra(Nmero As Double, Optional NumDecimales As Integer = 2, _ Optional Unidad As String = "bolvares", Optional UdFracc As String = "cntimos", _ Optional Conexin As String = "con", Optional Cero As Boolean = False, _ Optional UD_un_uno_a As Integer = 1, Optional Frac_un_uno_a As Integer = 1) As String' funcin para convertir nmeros a letra.' se emplea un nmero tipo double, 8 bytes' (Mximo NMEROS DE 15 DGITOS, a partir de ah son nmeros en coma flotante,' y deberan introducirse como texto para poder mantener todas las cifras)'Valores por defecto:' se han incluido en la definicin de los argumentos de la funcin Dim intSigno As Integer ' signo del nmero Dim dblNmero As Double ' nmero a transformar, en positivo Dim intParteEntera As Double Dim intParteDecimal As Double dblNmero = Abs(Nmero) intSigno = Sgn(Nmero) If NumDecimales >= 0 Then Nmero = WorksheetFunction.Round(Nmero, NumDecimales) intParteEntera = Int(Abs(Nmero)) intParteDecimal = Int(Round((Abs(Nmero) - intParteEntera) * 10 ^ NumDecimales, 0)) ElseIf NumDecimales < 0 Then intParteDecimal = 0 intParteEntera = Round((Abs(Nmero) / 10 ^ Abs(NumDecimales)), 0) * 10 ^ Abs(NumDecimales) End If If (intParteEntera = 0 And Not Cero) Or (intParteDecimal = 0 And Not Cero) Then Conexin = "" ' si no hay parte entera o decimal no ponemos el texto intermedio NumLetra = Trim(Entero_Letra(intParteEntera, Unidad, Cero, UD_un_uno_a) & " " & _ Conexin & " " & Entero_Letra(intParteDecimal, UdFracc, Cero, Frac_un_uno_a)) ' cuando el nmero sea negativo If intSigno = -1 Then NumLetra = "menos " & NumLetra End IfEnd FunctionPrivate Function Entero_Letra(Nmero As Double, Unidad As String, _ Cero As Boolean, un_o_a As Integer) As String' funcin para convertir en texto nmeros enteros' lo pongo como variable double en vez de entero largo, por si es un nmero muy grande Const intMaxGrupo As Integer = 3 ' grupos de 6 cifras considerados. con 3 llegamos hasta Trillones. Dim strResultado As String ' aqu almacenaremos provisionalmente la cadena resultado Dim lngAuxNum As Long ' nmero auxiliar para convertir el nmero por partes, hasta seis cifras Dim IntUnidades As Integer, IntMillares As Integer ' millares y unidades de lngAuxNum Dim dblAuxResto As Double ' nmero auxiliar, la parte todava por convertir Dim strAuxUnidad As String Dim Resultado As String Dim i As Integer Resultado = "" 'si tenemos un cero If Nmero = 0 Then Select Case Cero Case True Resultado = "cero " & Unidad Case False Resultado = "" End Select Entero_Letra = Trim(Resultado) Exit Function End If dblAuxResto = Abs(Nmero) For i = 0 To intMaxGrupo ' tomamos el nmero de 6 en 6 cifras lngAuxNum = Round(((dblAuxResto / 10 ^ 6 - Int(dblAuxResto / 10 ^ 6)) * 10 ^ 6), 0) IntUnidades = Round((lngAuxNum / 10 ^ 3 - Int(lngAuxNum / 10 ^ 3)) * 10 ^ 3, 0) IntMillares = (lngAuxNum - IntUnidades) / 10 ^ 3 If lngAuxNum 0 Or i = 0 Then Select Case i Case 0 'unidades 'unidades strAuxUnidad = RTrim(" " & Unidad) Resultado = cifra_3(IntUnidades, False, un_o_a) & strAuxUnidad ' millares If IntMillares 0 Then strAuxUnidad = " mil" If IntMillares = 1 Then Resultado = Trim(cifra_3(IntMillares, False, 0) & strAuxUnidad & " " & Resultado) Else Resultado = Trim(cifra_3(IntMillares, False, un_o_a) & strAuxUnidad & " " & Resultado) End If End If Case 1 ' millones ' millones If lngAuxNum = 1 Then strAuxUnidad = " milln" Else strAuxUnidad = " millones" End If Resultado = Trim(cifra_3(IntUnidades, False, 1) & strAuxUnidad & " " & Resultado) ' mil millones If IntMillares 0 Then strAuxUnidad = " mil" If IntMillares = 1 Then Resultado = Trim(cifra_3(IntMillares, False, 0) & strAuxUnidad & " " & Resultado) Else Resultado = Trim(cifra_3(IntMillares, False, 1) & strAuxUnidad & " " & Resultado) End If End If Case 2 ' billones ' billones If lngAuxNum = 1 Then strAuxUnidad = " billn" Else strAuxUnidad = " billones" End If Resultado = Trim(cifra_3(IntUnidades, False, 1) & strAuxUnidad & " " & Resultado) ' mil billones If IntMillares 0 Then strAuxUnidad = " mil" If IntMillares = 1 Then Resultado = Trim(cifra_3(IntMillares, False, 0) & strAuxUnidad & " " & Resultado) Else Resultado = Trim(cifra_3(IntMillares, False, 1) & strAuxUnidad & " " & Resultado) End If End If Case 3 ' Trillones ' Trillones If lngAuxNum = 1 Then strAuxUnidad = " trilln" Else strAuxUnidad = " trillones" End If Resultado = Trim(cifra_3(IntUnidades, False, 1) & strAuxUnidad & " " & Resultado) ' mil trillones If IntMillares 0 Then strAuxUnidad = " mil" If IntMillares = 1 Then Resultado = Trim(cifra_3(IntMillares, False, 0) & strAuxUnidad & " " & Resultado) Else Resultado = Trim(cifra_3(IntMillares, False, 1) & strAuxUnidad & " " & Resultado) End If End If End Select End If dblAuxResto = Int(dblAuxResto / 10 ^ 6) 'para el siguiente ciclo If dblAuxResto = 0 Then Exit For ' si ya hemos acabado Next Entero_Letra = Trim(Replace(Resultado, " ", " "))End FunctionPrivate Function cifra_1(num As Integer, Cero As Boolean, un_o_a As Integer) As String' funcin para convertir en texto nmeros de una cifra' num el nmeroa convertir' cero verdadero 0->"cero" falso 0->""' un_o_a 0: 1->"" 1: 1->"un" 2: 1->"uno" 3: 1->"una" Select Case num Case 0 If Cero Then cifra_1 = "cero" Else cifra_1 = "" End If Case 1 Select Case un_o_a Case 0 cifra_1 = "" Case 1 cifra_1 = "un" Case 2 cifra_1 = "uno" Case 3 cifra_1 = "una" End Select Case 2 cifra_1 = "dos" Case 3 cifra_1 = "tres" Case 4 cifra_1 = "cuatro" Case 5 cifra_1 = "cinco" Case 6 cifra_1 = "seis" Case 7 cifra_1 = "siete" Case 8 cifra_1 = "ocho" Case 9 cifra_1 = "nueve" End SelectEnd FunctionPrivate Function cifra_2(num As Integer, Cero As Boolean, un_o_a As Integer) As String' funcin para convertir en texto nmeros de una cifra' num el nmeroa convertir' cero verdadero 0->"cero" falso 0->""' un_o_a 0: 1->"" 1: 1->"un" 2: 1->"uno" 3: 1->"una" Select Case num Case Is < 10 cifra_2 = cifra_1(num, Cero, un_o_a) Case 10 cifra_2 = "diez" Case 11 cifra_2 = "once" Case 12 cifra_2 = "doce" Case 13 cifra_2 = "trece" Case 14 cifra_2 = "catorce" Case 15 cifra_2 = "quince" Case 16 To 19 cifra_2 = "dieci" & cifra_1(num - 10, False, un_o_a) Case 20 cifra_2 = "veinte" Case 21 To 29 cifra_2 = "veinti" & cifra_1(num - 20, False, un_o_a) Case 30 cifra_2 = "treinta" Case 31 To 39 cifra_2 = "treinta y " & cifra_1(num - 30, False, un_o_a) Case 40 cifra_2 = "cuarenta" Case 41 To 49 cifra_2 = "cuarenta y " & cifra_1(num - 40, False, un_o_a) Case 50 cifra_2 = "cincuenta" Case 51 To 59 cifra_2 = "cincuenta y " & cifra_1(num - 50, False, un_o_a) Case 60 cifra_2 = "sesenta" Case 61 To 69 cifra_2 = "sesenta y " & cifra_1(num - 60, False, un_o_a) Case 70 cifra_2 = "setenta" Case 71 To 79 cifra_2 = "setenta y " & cifra_1(num - 70, False, un_o_a) Case 80 cifra_2 = "ochenta" Case 81 To 89 cifra_2 = "ochenta y " & cifra_1(num - 80, False, un_o_a) Case 90 cifra_2 = "noventa" Case 91 To 99 cifra_2 = "noventa y " & cifra_1(num - 90, False, un_o_a) End SelectEnd FunctionPrivate Function cifra_3(num As Integer, Cero As Boolean, un_o_a As Integer) As String' funcin para convertir en texto nmeros de una cifra' num el nmeroa convertir' cero verdadero 0->"cero" falso 0->""' un_o_a 0: 1->"" 1: 1->"un" 2: 1->"uno" 3: 1->"una"' se realizan llamadas a la funcion cifra_2 para valores inferiores a 100 Select Case num Case Is < 100 cifra_3 = cifra_2(num, Cero, un_o_a) Case 100 cifra_3 = "cien" Case 101 To 199 cifra_3 = "ciento " & cifra_2(num - 100, False, un_o_a) Case 200 To 299 If un_o_a = 3 Then cifra_3 = "doscientas " & cifra_2(num - 200, False, un_o_a) Else cifra_3 = "doscientos " & cifra_2(num - 200, False, un_o_a) End If Case 300 To 399 If un_o_a = 3 Then cifra_3 = "trescientas " & cifra_2(num - 300, False, un_o_a) Else cifra_3 = "trescientos " & cifra_2(num - 300, False, un_o_a) End If Case 400 To 499 If un_o_a = 3 Then cifra_3 = "cuatrocientas " & cifra_2(num - 400, False, un_o_a) Else cifra_3 = "cuatrocientos " & cifra_2(num - 400, False, un_o_a) End If Case 500 To 599 If un_o_a = 3 Then cifra_3 = "quinientas " & cifra_2(num - 500, False, un_o_a) Else cifra_3 = "quinientos " & cifra_2(num - 500, False, un_o_a) End If Case 600 To 699 If un_o_a = 3 Then cifra_3 = "seiscientas " & cifra_2(num - 600, False, un_o_a) Else cifra_3 = "seiscientos " & cifra_2(num - 600, False, un_o_a) End If Case 700 To 799 If un_o_a = 3 Then cifra_3 = "setecientas " & cifra_2(num - 700, False, un_o_a) Else cifra_3 = "setecientos " & cifra_2(num - 700, False, un_o_a) End If Case 800 To 899 If un_o_a = 3 Then cifra_3 = "ochocientas " & cifra_2(num - 800, False, un_o_a) Else cifra_3 = "ochocientos " & cifra_2(num - 800, False, un_o_a) End If Case 900 To 999 If un_o_a = 3 Then cifra_3 = "novecientas " & cifra_2(num - 900, False, un_o_a) Else cifra_3 = "novecientos " & cifra_2(num - 900, False, un_o_a) End If End SelectEnd Function