Officefull.es

Excel, word, powerpoint, android

Convertir números a su equivalente en letras Abril 15, 2008

FUNCIONES DIVERSAS CONVERTIR NÚMEROS A SU EQUIVALENTE EN LETRAS EXCEL

Funciones en Excel por Hector Miguel Orozco

Seguimos con nuestra serie de artículos sobre transformación de números a letras en Excel. En este artículo os desglosamos cinco funciones y os ofrecemos una comparativa de las mismas.

El archivo ha sido creado por Héctor Miguel Orozco que ha recopilado y ha dado mejora a las cinco funciones que componen dicho archivo para su mejor traducción de número a letras en Excel.

 

La primera de ellas es la creada por Héctor, la más completa ya que podemos obtener la traducción de números a letras hasta en Cinco idiomas diferentes [ Español, Francés, Ingles, Catalán e Italiano ] y además es muy útil para obtener resultados tanto con monedas como para unidades de medida, o simplemente texto normal.

Función para “convertir” números a letras

' Función para "convertir" números a letras [1987 - 2003] _   © Desarrollada por: Héctor Miguel Orozco Díaz [México] _   Comentarios y Sugerencias: hemiordiahotmail.com '  ' Iniciada en 1987 como una "simple" Base de Datos _   usando funciones de búsqueda y una Tabla en una Hoja de Cálculo [Lotus para MS-DOS] _   actualmente "incorpora" 5 Idiomas: Español -por omisión-, Inglés, Francés, Italiano y Catalán '  ' Para una Declaración Obligatoria de Variables ' Option Explicit  ' Esta es la Función Principal ' Function ValorEnLetras(ByVal Ref_Valor As Variant, _                          Optional ByVal Unidad_Medida As String, _                          Optional ByVal ID_Fracciones As String, _                          Optional ByVal ID_Medida As String, _                          Optional ByVal Idioma As String, _                          Optional ByVal MAY_min As String) As String    ' Variables específicas de la función principal -español × omisión- '   Dim Abrir As String, Cerrar As String, Prefijo As String, Pre_Frac As String, FraccionesEnLetra As Boolean, _          Decimales As Variant, PostFrac As String, Fracciones As String, LetraFracciones As String, _          Grupo As Integer, TextoDelGrupo As String, Temp As String, DosPalabras As Integer, _          U_Medida_1 As String, U_Medida_2 As String, Medida_PL As String, Solitario As String, Género As String, _          Grupo1 As String, Grupo2 As String, Grupo3 As String, Grupo4 As String, Grupo5 As String, _          ValorTotal As Variant, SumarLetras As String, ValorFinalEnLetras As String   ' Variables para los textos en inglés '   Dim Prefijo_US As String, Pre_Frac_US As String, _          Fracciones_US As String, LetraFracciones_US As String   ReDim TextoDelGrupo_US(9) As String              TextoDelGrupo_US(2) = " Thousand "              TextoDelGrupo_US(3) = " Million "              TextoDelGrupo_US(4) = " Billion "              TextoDelGrupo_US(5) = " Trillion "    ' Variables para los textos en francés '   Dim Prefijo_FR As String, Pre_Frac_FR As String, _          Fracciones_FR As String, LetraFracciones_FR As String, Temp_FR As String   ReDim TextoDelGrupo_FR(9) As String              TextoDelGrupo_FR(2) = " Mille "              TextoDelGrupo_FR(3) = " Millions "              TextoDelGrupo_FR(4) = " Milliards "              TextoDelGrupo_FR(5) = " Mille "    ' Variables para los textos en italiano '   Dim Prefijo_IT As String, Pre_Frac_IT As String, _          Fracciones_IT As String, LetraFracciones_IT As String, Temp_IT As String   ReDim TextoDelGrupo_IT(9) As String              TextoDelGrupo_IT(2) = " Mila "              TextoDelGrupo_IT(3) = " Milioni "              TextoDelGrupo_IT(4) = " Miliardi "              TextoDelGrupo_IT(5) = " Mila "    ' Variables para los textos en catalán '   Dim Prefijo_CA As String, Pre_Frac_CA As String, _          Fracciones_CA As String, LetraFracciones_CA As String, TextoDelGrupo_CA As String    ' Primero *detectamos* si se solicita otro idioma (por si hay que *terminar* la función) '   If IsMissing(Idioma) Then Idioma = "" Else Idioma = QuitarExtraños(Idioma)    ' Si no hay valores... la función se termina '   If Not IsNumeric(Ref_Valor) Then     If Mid(Idioma, 2, 2) = "ng" Then       ValorEnLetras = "Reference, IS NOT VALUE or... IT'S OUT OF SCOPE"     ElseIf Left(Idioma, 2) = "Fr" Then       ValorEnLetras = "La Référence, NE CONTINET PAS DE VALEUR ou... EST EN DEHORS DE LA PLAGE"     ElseIf Left(Idioma, 2) = "It" Then       ValorEnLetras = "La Referenza, NON È VALORE o... È FUORI DI SCOPO"     ElseIf Left(Idioma, 2) = "Ca" Then       ValorEnLetras = "La Referència NO ÉS VALOR o... ESTÀ FORA DE L'ABAST"     Else       ValorEnLetras = "La Referencia, NO ES VALOR ó... ESTA FUERA DEL ALCANCE"     End If     Exit Function   ElseIf Ref_Valor = 0 And IsEmpty(Ref_Valor) Then     If Mid(Idioma, 2, 2) = "ng" Then       ValorEnLetras = "Value Reference... IS EMPTY"     ElseIf Left(Idioma, 2) = "Fr" Then       ValorEnLetras = "La Référence de Valeur... EST VIDE"     ElseIf Left(Idioma, 2) = "It" Then       ValorEnLetras = "La Referenza di Valore... È VUOTO"     ElseIf Left(Idioma, 2) = "Ca" Then       ValorEnLetras = "La Referència de Valor ...ESTÀ BUIDA"     Else       ValorEnLetras = "La Referencia de Valor... ESTA VACIA"     End If     Exit Function   End If    ' En caso contrario (hay valores)... la función debe continuar '   ' Aquí se define si se encierra el resultado con algún caracter *especial* '   If IsMissing(Unidad_Medida) _     Then Unidad_Medida = "" _     Else Unidad_Medida = StrConv(Trim(Unidad_Medida), vbProperCase)   If Left(Unidad_Medida, 1) = "(" _   Or Left(Unidad_Medida, 1) = "[" _   Or Left(Unidad_Medida, 1) = "{" _   Or Left(Unidad_Medida, 1) = "-" Then     Select Case Left(Unidad_Medida, 1)       Case "-"         Abrir = "-"         Cerrar = "-"       Case "("         Abrir = "("         Cerrar = ")"       Case "["         Abrir = "["         Cerrar = "]"       Case "{"         Abrir = "{"         Cerrar = "}"       Case Else         Abrir = ""         Cerrar = ""     End Select   End If    ' Para fijar el nombre de la unidad de medida (si se especificó alguno) '   If Abrir <> "" Then Unidad_Medida = StrConv(Trim(Mid(Unidad_Medida, 2)), vbProperCase)   If Unidad_Medida <> "" Then     DosPalabras = InStr(Unidad_Medida, " ")     ' Por si se trata de una palabra compuesta -DOS PALABRAS *como máximo*- '     If DosPalabras > 0 Then       U_Medida_1 = QuitarExtraños(Left(Unidad_Medida, DosPalabras - 1))       U_Medida_2 = QuitarExtraños(Mid(Unidad_Medida, DosPalabras + 1))       Unidad_Medida = " " & U_Medida_1 & " " & U_Medida_2     Else       Unidad_Medida = " " & QuitarExtraños(Unidad_Medida)       U_Medida_1 = ""       U_Medida_2 = ""     End If   Else     Unidad_Medida = ""   End If    ' Para modificar el prefijo si son valores negativos. _     Si NO *te gusta* la palabra *Crédito*... ¡ Cámbiala -¿No?- !!!, quizás... Rojo; Menos; Negativo; ¿otra? ... _     => OJO con los Idiomas  "" And Right(ID_Fracciones, 1) <> "." Then         If Left(ID_Fracciones, 4) = "Ning" Or Left(ID_Fracciones, 5) = "Sinid" Then           Solitario = "Uno"         Else           If Right(ID_Fracciones, 2) = "as" Then Solitario = "Una" Else Solitario = "Un"         End If         ' Aquí las fracciones en texto -para español- '         LetraFracciones = LetraDecenas(1, Right("000" & Decimales, 3), Solitario)         If Left(ID_Fracciones, 4) = "Ning" Or Left(ID_Fracciones, 5) = "Sinid" Then           Solitario = "Un"         Else           If Right(ID_Fracciones, 2) = "es" Or Right(ID_Fracciones, 4) = "sons" Then Solitario = "Une" Else Solitario = "Un"         End If         ' Aquí las fracciones en texto -para francés- '         LetraFracciones_FR = LetraDecenas_FR(Right("000" & Decimales, 3), Solitario)         If Left(ID_Fracciones, 4) = "Ning" Or Left(ID_Fracciones, 5) = "Sinid" Then           Solitario = "Uno"         Else           If Right(ID_Fracciones, 1) = "e" Then Solitario = "Una" Else Solitario = "Un"         End If         ' Aquí las fracciones en texto -para italiano- '         LetraFracciones_IT = LetraDecenas_IT(Right("000" & Decimales, 3), Solitario)       End If       If Right(ID_Fracciones, 1) <> "." Then         ' Si las decimales son de *sólo* 1 (UNO), el *identificador* es SINGULAR '         If Decimales = 1 Then           ' Al plural -en Inglés, Francés y Catalán- *sólo* se le había agregado una "s" '           If Mid(Idioma, 2, 2) = "ng" Or Left(Idioma, 2) = "Fr" Or Left(Idioma, 2) = "Ca" Then             ID_Fracciones = Left(ID_Fracciones, Len(ID_Fracciones) - 1)           ' Aquí *singularizamos* para Italiano '           ElseIf Left(Idioma, 2) = "It" Then             If Right(ID_Fracciones, 1) = "i" Then               ID_Fracciones = Left(ID_Fracciones, Len(ID_Fracciones) - 1) & "o"             ElseIf Right(ID_Fracciones, 1) = "e" Then               ID_Fracciones = Left(ID_Fracciones, Len(ID_Fracciones) - 1) & "a"             End If           Else           ' Aquí *singularizamos* para Español '             Select Case Right(ID_Fracciones, 2)               Case "as", "os", "ms": ID_Fracciones = Left(ID_Fracciones, Len(ID_Fracciones) - 1)               Case Else: ID_Fracciones = Left(ID_Fracciones, Len(ID_Fracciones) - 2)             End Select           End If         ' Aquí *preparamos* las letras para decimales "00" '         ElseIf Decimales = 0 Then           If FraccionesEnLetra Then             LetraFracciones = "Cero"             LetraFracciones_US = "Zero"             LetraFracciones_FR = "Zéro"             LetraFracciones_IT = "Zero"             LetraFracciones_CA = "Cero"           End If         End If       End If     End If     Pre_Frac = " con "     Pre_Frac_US = " and "     Pre_Frac_FR = " et "     Pre_Frac_IT = " con "     Pre_Frac_CA = " amb "     If Left(ID_Fracciones, 4) = "Ning" Or Left(ID_Fracciones, 5) = "Sinid" Then       PostFrac = ""     Else       If ID_Fracciones = "/100" Then PostFrac = "/100" Else PostFrac = " " & ID_Fracciones     End If     If Decimales = 0 And ID_Fracciones <> "/100" And PostFrac <> "" Then       Pre_Frac = " sin"       Decimales = " "       LetraFracciones = " "       LetraFracciones_US = "No "       LetraFracciones_FR = "Zéro "       Pre_Frac_IT = " senza"       LetraFracciones_IT = " "       LetraFracciones_CA = "Cero "       If PostFrac <> "/100" Then PostFrac = Mid(PostFrac, 2)     End If     ' ==> NOTA: = 1000 And Val(ValorTotal) < 2000 Then SumarLetras = Mid(SumarLetras, 4)   If Val(Grupo2) = 1 Or Val(Grupo4) = 1 Then SumarLetras = Application.Substitute(SumarLetras, "Un Mil ", "Mil ")   ' Sin son millones pero sin miles, pluralizamos como *DE* unidades_de_medida '   If Val(Grupo5 & Grupo4 & Grupo3) > 0 _   And Val(Grupo2 & Grupo1) = 0 _   And Medida_PL <> "" _     Then Medida_PL = " de" & Medida_PL  ValorEnTexto:   If Not IsMissing(MAY_min) And QuitarExtraños(MAY_min) = "Frase" Then     SumarLetras = UCase(Left(SumarLetras, 1)) & LCase(Mid(SumarLetras, 2))     Medida_PL = LCase(Medida_PL)     Fracciones = LCase(Fracciones)     ID_Medida = LCase(ID_Medida)   End If   ' El texto final... se ha *construído* '   ValorFinalEnLetras = Prefijo & SumarLetras & Medida_PL & Fracciones & ID_Medida   GoTo FormatoDelTexto  TextoEnInglés:   ' Para determinar el plural de la unidad de medida en inglés '   If Unidad_Medida <> "" Then     If Right(Unidad_Medida, 2) = "ch" Then       Medida_PL = Unidad_Medida & "es"     ElseIf Right(Unidad_Medida, 4) = "Foot" Then       Medida_PL = Application.Substitute(Unidad_Medida, "Foot", "Feet", , , vbTextCompare)     Else       Medida_PL = Unidad_Medida & "s"     End If   Else     Medida_PL = ""   End If    ' Si no hay enteros (pero SI decimales)... omitimos la búsqueda '   If Val(Ref_Valor) = 0 Then     If Unidad_Medida <> "" Then SumarLetras = "No" Else SumarLetras = "Zero"     GoTo ValorEnTexto_US   End If    ' Bucle principal de la búsqueda en inglés '   Grupo = 1   Do While Ref_Valor <> ""     Temp = LetraCentenas_US(Right(Ref_Valor, 3))     If Temp <> "" Then SumarLetras = Temp & TextoDelGrupo_US(Grupo) & SumarLetras     If Len(Ref_Valor) > 3 Then Ref_Valor = Left(Ref_Valor, Len(Ref_Valor) - 3) Else Ref_Valor = ""     Grupo = Grupo + 1   Loop    ' Entre 1.00 y 1.99, la unidad de medida es singular '   If ValorTotal < 2 And ValorTotal > 0 Then Medida_PL = Unidad_Medida   ' Parche para ajuste de espacios en cifras *miles* '   If Val(Grupo1) = 0 Then SumarLetras = Left(SumarLetras, Len(SumarLetras) - 1)  ValorEnTexto_US:   If Not IsMissing(MAY_min) And QuitarExtraños(MAY_min) = "Frase" Then     SumarLetras = UCase(Left(SumarLetras, 1)) & LCase(Mid(SumarLetras, 2))     Medida_PL = LCase(Medida_PL)     Fracciones_US = LCase(Fracciones_US)     ID_Medida = LCase(ID_Medida)   End If   ' El texto final... se ha *construído* '   ValorFinalEnLetras = Prefijo_US & SumarLetras & Medida_PL & Fracciones_US & ID_Medida   GoTo FormatoDelTexto  TextoEnFrancés:   ' Para determinar el plural de la unidad de medida en francés '   If Unidad_Medida <> "" Then     If U_Medida_1 <> "" Then       If Right(U_Medida_1, 1) = "l" Then         U_Medida_1 = Left(U_Medida_1, Len(U_Medida_1) - 1) & "ux"       ElseIf Right(U_Medida_1, 1) <> "s" And U_Medida_1 <> "Farenhit" Then         U_Medida_1 = U_Medida_1 & "s"       End If       If Right(U_Medida_2, 1) = "l" Then         U_Medida_2 = Left(U_Medida_2, Len(U_Medida_2) - 1) & "ux"       ElseIf Right(U_Medida_2, 1) <> "s" And U_Medida_2 <> "Farenhit" Then         U_Medida_2 = U_Medida_2 & "s"       End If       Medida_PL = " " & U_Medida_1 & " " & U_Medida_2     Else       If Right(Unidad_Medida, 1) = "l" Then         Medida_PL = Left(Unidad_Medida, Len(Unidad_Medida) - 1) & "ux"       ElseIf Right(Unidad_Medida, 1) <> "s" And Unidad_Medida <> "Farenhit" Then         Medida_PL = Unidad_Medida & "s"       Else         Medida_PL = Unidad_Medida       End If     End If   Else     Medida_PL = ""   End If    ' Para determinar la medida *unitaria* '   If Unidad_Medida <> "" Then     If Right(U_Medida_1, 1) = "e" _     Or Right(U_Medida_1, 3) = "son" _     Or Right(Unidad_Medida, 1) = "e" _     Or Right(Unidad_Medida, 3) = "son" _       Then Solitario = "Une" _       Else Solitario = "Un"   Else     Solitario = "Un"   End If    ' Si no hay enteros (pero SI decimales), omitimos la búsqueda '   If Val(Ref_Valor) = 0 Then     SumarLetras = "Zéro"     GoTo ValorEnTexto_FR   End If    ' Bucle principal de la búsqueda en francés '   Grupo = 1   Do While Ref_Valor <> ""     If Val(Right(Ref_Valor, 3)) = 1 Then       Select Case Grupo         Case 1: Temp = LetraCentenas_FR(Right(Ref_Valor, 3), Solitario)         Case 2, 5: Temp = "Mille "         Case 3: Temp = "Un Miilion "         Case 4: Temp = "Un Milliard "         Case Else: Temp = LetraCentenas_FR(Right(Ref_Valor, 3), Solitario)       End Select     Else       Temp = LetraCentenas_FR(Right(Ref_Valor, 3), Solitario)     End If     If Temp <> "" Then       If Val(Right(Ref_Valor, 3)) <> 1 Then Temp_FR = TextoDelGrupo_FR(Grupo) Else Temp_FR = ""       If Grupo = 5 And Val(Grupo4) = 0 Then         SumarLetras = Temp & TextoDelGrupo_FR(5) & Mid(TextoDelGrupo_FR(4), 2) & SumarLetras       Else         SumarLetras = Temp & Temp_FR & SumarLetras       End If     End If     If Len(Ref_Valor) > 3 Then Ref_Valor = Left(Ref_Valor, Len(Ref_Valor) - 3) Else Ref_Valor = ""     Grupo = Grupo + 1   Loop    ' Entre 1.00 y 1.99, la unidad de medida es singular '   If ValorTotal < 2 And ValorTotal > 0 Then Medida_PL = Unidad_Medida   ' Parche para ajuste de espacios en cifras *miles* '   If Val(Grupo1) = 0 Then SumarLetras = Left(SumarLetras, Len(SumarLetras) - 1)   ' Sin son millones pero sin miles, pluralizamos como *DE* unidades_de_medida '   If Val(Grupo5 & Grupo4 & Grupo3) > 0 And Val(Grupo2 & Grupo1) = 0 And Medida_PL <> "" _     Then Medida_PL = " de" & Medida_PL  ValorEnTexto_FR:   If Not IsMissing(MAY_min) And QuitarExtraños(MAY_min) = "Frase" Then     SumarLetras = UCase(Left(SumarLetras, 1)) & LCase(Mid(SumarLetras, 2))     Medida_PL = LCase(Medida_PL)     Fracciones_FR = LCase(Fracciones_FR)     ID_Medida = LCase(ID_Medida)   End If   ' El texto final... se ha *construído* '   ValorFinalEnLetras = Prefijo_FR & SumarLetras & Medida_PL & Fracciones_FR & ID_Medida   ' Parche para corregir cuando cent (de *cientos*) *debe ser* cents '   If Val(ValorTotal) <> 100 _     Then ValorFinalEnLetras = Application.Substitute(ValorFinalEnLetras, "Cent" & Medida_PL, "Cents" & Medida_PL)   If Val(ValorTotal) <> 100 _     Then ValorFinalEnLetras = Application.Substitute(ValorFinalEnLetras, "cent" & Medida_PL, "cents" & Medida_PL)   GoTo FormatoDelTexto  TextoEnItaliano:   ' Para determinar el plural de la unidad de medida en italiano '   If Unidad_Medida <> "" Then     If U_Medida_1 <> "" Then       If Right(U_Medida_1, 1) = "a" Then         U_Medida_1 = Left(U_Medida_1, Len(U_Medida_1) - 1) & "e"         If Right(U_Medida_1, 2) = "ie" Then U_Medida_1 = Left(U_Medida_1, Len(U_Medida_1) - 2) & "e"         If Right(U_Medida_1, 4) = "acce" Then U_Medida_1 = Left(U_Medida_1, Len(U_Medida_1) - 1) & "he"       ElseIf LCase(Right(U_Medida_1, 4)) = "uomo" Then         U_Medida_1 = Left(U_Medida_1, Len(U_Medida_1) - 1) & "ini"       ElseIf U_Medida_1 <> "Re" _       And Right(U_Medida_1, 1) <> "a" _       Or Right(U_Medida_1, 1) = "e" _       Or Right(U_Medida_1, 1) = "o" Then         U_Medida_1 = Left(U_Medida_1, Len(U_Medida_1) - 1) & "i"       Else         U_Medida_1 = U_Medida_1       End If       If U_Medida_2 <> "Farenhit" Then         If Right(U_Medida_2, 1) = "a" Then           U_Medida_2 = Left(U_Medida_2, Len(U_Medida_2) - 1) & "e"           If Right(U_Medida_2, 2) = "ie" Then U_Medida_2 = Left(U_Medida_2, Len(U_Medida_2) - 2) & "e"           If Right(U_Medida_2, 4) = "acce" Then U_Medida_2 = Left(U_Medida_2, Len(U_Medida_2) - 1) & "he"         ElseIf LCase(Right(U_Medida_2, 4)) = "uomo" Then           U_Medida_2 = Left(U_Medida_2, Len(U_Medida_2) - 1) & "ini"         ElseIf U_Medida_2 <> "Re" _         And Right(U_Medida_2, 1) <> "a" _         Or Right(U_Medida_2, 1) = "e" _         Or Right(U_Medida_2, 1) = "o" Then           U_Medida_2 = Left(U_Medida_2, Len(U_Medida_2) - 1) & "i"         Else           U_Medida_2 = U_Medida_2         End If       End If       Medida_PL = " " & U_Medida_1 & " " & U_Medida_2     Else       If Right(Unidad_Medida, 1) = "a" Then         Medida_PL = Left(Unidad_Medida, Len(Unidad_Medida) - 1) & "e"         If Right(Medida_PL, 2) = "ie" Then Medida_PL = Left(Medida_PL, Len(Medida_PL) - 2) & "e"         If Right(Medida_PL, 4) = "acce" Then Medida_PL = Left(Medida_PL, Len(Medida_PL) - 1) & "he"       ElseIf LCase(Right(Unidad_Medida, 4)) = "uomo" Then         Medida_PL = Left(Unidad_Medida, Len(Unidad_Medida) - 1) & "ini"       ElseIf Unidad_Medida <> " Re" _       And Right(Unidad_Medida, 1) <> "a" _       Or Right(Unidad_Medida, 1) = "e" _       Or Right(Unidad_Medida, 1) = "o" Then         Medida_PL = Left(Unidad_Medida, Len(Unidad_Medida) - 1) & "i"       Else         Medida_PL = Unidad_Medida       End If     End If   Else     Medida_PL = ""   End If    ' Para determinar la medida *unitaria* '   If Unidad_Medida <> "" Then     If Right(U_Medida_1, 2) = "as" Or Right(Unidad_Medida, 1) = "a" Then Solitario = "Una" Else Solitario = "Un"   Else     Solitario = "Uno"   End If    ' Si no hay enteros (pero SI decimales)... omitimos la búsqueda '   If Val(Ref_Valor) = 0 Then     SumarLetras = "Azzeri"     GoTo ValorEnTexto_IT   End If    ' Bucle principal de la búsqueda en italiano '   Grupo = 1   Do While Ref_Valor <> ""     If Val(Right(Ref_Valor, 3)) = 1 Then       Select Case Grupo         Case 1: Temp = LetraCentenas_IT(Right(Ref_Valor, 3), Solitario)         Case 2, 5: If Right(Medida_PL, 1) = "i" Then Temp = "Milli " Else Temp = "Mille "         Case 3: Temp = "Un Milione "         Case 4: Temp = "Un Miliardo "         Case Else: Temp = LetraCentenas_IT(Right(Ref_Valor, 3), Solitario)       End Select     Else       Temp = LetraCentenas_IT(Right(Ref_Valor, 3), Solitario)     End If     If Temp <> "" Then       If Val(Right(Ref_Valor, 3)) <> 1 Then Temp_IT = TextoDelGrupo_IT(Grupo) Else Temp_IT = ""       SumarLetras = Temp & Temp_IT & SumarLetras       If Grupo = 5 And Val(Grupo4) = 0 Then SumarLetras = SumarLetras & Mid(TextoDelGrupo_IT(4), 2)     End If     If Len(Ref_Valor) > 3 Then Ref_Valor = Left(Ref_Valor, Len(Ref_Valor) - 3) Else Ref_Valor = ""     Grupo = Grupo + 1   Loop    ' Entre 1.00 y 1.99, la unidad de medida es singular '   If ValorTotal < 2 And ValorTotal > 0 Then Medida_PL = Unidad_Medida   ' Sin son millones pero sin miles, pluralizamos como *DE* unidades_de_medida '   If Val(Grupo5 & Grupo4 & Grupo3) > 0 And Val(Grupo2 & Grupo1) = 0 And Medida_PL <> "" _     Then Medida_PL = " di" & Medida_PL   ' Parche para ajuste de espacios en cifras *miles* '   If Val(Grupo1) = 0 Then SumarLetras = Left(SumarLetras, Len(SumarLetras) - 1)  ValorEnTexto_IT:   If Not IsMissing(MAY_min) And QuitarExtraños(MAY_min) = "Frase" Then     SumarLetras = UCase(Left(SumarLetras, 1)) & LCase(Mid(SumarLetras, 2))     Medida_PL = LCase(Medida_PL)     Fracciones_IT = LCase(Fracciones_IT)     ID_Medida = LCase(ID_Medida)   End If   ' El texto final... se ha *construído* '   ValorFinalEnLetras = Prefijo_IT & SumarLetras & Medida_PL & Fracciones_IT & ID_Medida   GoTo FormatoDelTexto  TextoEnCatalán:   ' Para determinar el plural de la unidad de medida en catalán '   If Unidad_Medida <> "" Then Medida_PL = Unidad_Medida & "s" Else Medida_PL = ""    ' Si no hay enteros (pero SI decimales)... omitimos la búsqueda '   If Val(Ref_Valor) = 0 Then     SumarLetras = "Cero"     GoTo ValorEnTexto_CA   End If    ' Bucle principal de la búsqueda en catalán '   Grupo = 1   Do While Ref_Valor <> ""     Temp = LetraCentenas_CA(Right(Ref_Valor, 3))     If Temp <> "" Then       Select Case Grupo         Case 1           TextoDelGrupo_CA = ""         Case 2           If Val(Grupo1) > 0 Then TextoDelGrupo_CA = " Mil " Else TextoDelGrupo_CA = " Mil"         Case 3           If Val(Grupo3) = 1 And Val(Grupo5 & Grupo4) = 0 Then             If Val(Grupo2 & Grupo1) = 0 Then TextoDelGrupo_CA = " Milió" Else TextoDelGrupo_CA = " Milió "           Else             If Val(Grupo2 & Grupo1) = 0 Then TextoDelGrupo_CA = " Milions" Else TextoDelGrupo_CA = " Milions "           End If         Case 4           If Val(Grupo3) > 0 Then             TextoDelGrupo_CA = " Mil "           Else             If Val(Grupo2 & Grupo1) = 0 _               Then TextoDelGrupo_CA = " Mil Milions" _               Else TextoDelGrupo_CA = " Mil Milions "           End If         Case 5           If Val(Grupo5) = 1 Then             If Val(Grupo4 & Grupo3 & Grupo2 & Grupo1) = 0 _               Then TextoDelGrupo_CA = " Bilió" _               Else TextoDelGrupo_CA = " Bilió "           Else             If Val(Grupo4 & Grupo3 & Grupo2 & Grupo1) = 0 _               Then TextoDelGrupo_CA = " Bilions" _               Else TextoDelGrupo_CA = " Bilions "           End If       End Select       SumarLetras = Temp & TextoDelGrupo_CA & SumarLetras     End If     If Len(Ref_Valor) > 3 Then Ref_Valor = Left(Ref_Valor, Len(Ref_Valor) - 3) Else Ref_Valor = ""     Grupo = Grupo + 1   Loop    ' Entre 1.00 y 1.99, la unidad de medida es singular '   If ValorTotal < 2 And ValorTotal > 0 Then Medida_PL = Unidad_Medida   ' Parche para *omitir* (un )mil '   If Val(ValorTotal) >= 1000 And Val(ValorTotal) < 2000 Then SumarLetras = Mid(SumarLetras, 4)   ' Sin son millones pero sin miles, pluralizamos como *d' * unidades_de_medida '   If Val(Grupo5 & Grupo4 & Grupo3) > 0 And Val(Grupo2 & Grupo1) = 0 And Medida_PL <> "" _     Then Medida_PL = " d'" & Mid(Medida_PL, 2)  ValorEnTexto_CA:   If Not IsMissing(MAY_min) And QuitarExtraños(MAY_min) = "Frase" Then     SumarLetras = UCase(Left(SumarLetras, 1)) & LCase(Mid(SumarLetras, 2))     Medida_PL = LCase(Medida_PL)     Fracciones_CA = LCase(Fracciones_CA)     ID_Medida = LCase(ID_Medida)   End If   ' El texto final... se ha *construído* '   ValorFinalEnLetras = Prefijo_CA & SumarLetras & Medida_PL & Fracciones_CA & ID_Medida   GoTo FormatoDelTexto  FormatoDelTexto:   ' Aquí *respetamos* si... MAYUSCULAS, minúsculas, (etc.) '   If IsMissing(MAY_min) Then GoTo FinDeFunción Else MAY_min = QuitarExtraños(MAY_min)   If Mid(MAY_min, 2, 1) = "a" Or Mid(MAY_min, 2, 1) = "p" Then ValorFinalEnLetras = UCase(ValorFinalEnLetras)   If Mid(MAY_min, 2, 1) = "i" Or Mid(MAY_min, 2, 1) = "o" Then ValorFinalEnLetras = LCase(ValorFinalEnLetras)  FinDeFunción:   If Mid(MAY_min, 2, 1) = "a" Or Mid(MAY_min, 2, 1) = "p" Then     ValorEnLetras = ValorFinalEnLetras   Else     ValorEnLetras = AcentuarTextos(ValorFinalEnLetras)   End If End Function ' Fin de la Función Principal ' 

DESARROLLO DE LA FUNCION VALORENLETRAS [HÉCTOR MIGUEL OROZCO]

Los argumentos utilizados en la función son los siguientes:

Ref_Valor: Argumento requerido [ valor el cual vamos a traducir ]

ValorEnletras

Unidad_Medida: Argumento Opcional donde utilizaremos el nombre de la moneda o medida en singular, también podemos utilizar un nombre compuesto por ejemplo para las medidas metro cuadrado además de poder utilizar: “(“, “[“, “{“, “-” o bien encerrando el resultado “( )”, “[ ]”, “{ }”, “- -“.

e.g:

ValorEnLetras

valor en letras

ID_Fracciones : Argumento Opcional para dos decimales y moneda o medida, lo indicaremos en Plural. Si lo dejamos en blanco entonces la parte decimal no será tomada en cuenta.

Podemos usar: Céntimos, centímetros, centavos, “/100”, iniciar con “#” [ cuyo resultado será en número en número (“+ el identificador”) ] y también podemos usar “ninguno” o “sin identificar” para dejarlo solamente como dos decimales sin la parte de texto.

e.g:

valor en letras

valor en letras

valor en letras ID

valor en letras ID

Valor en letras

Id_Medida: Argumento Opcional, para algún “texto” al final como identificador de la moneda [ “M.N.”, “U.S.Cy.”, “€” …]

e.g:

valor en letras

Idioma: Argumento opcional en que podremos utilizar el idioma que necesitemos:

– Inglés o English

– Francés o French

– Italiano o Italian

– Catalán

Podemos escribir en este argumento por ejemplo:

Inglés, English o bien poner Ing o Fr It o Ca ya que el código busca del 1° al 3er caracteres y si decidimos dejar dicho argumento en Blanco o escribimos cualquier otro idioma, entonces el código lo interpretará como Español]

e.g:

Valor en letras

MAY_min: Último argumento opcional con el que podremos elegir el tipo de letras:

Mayúsuclas o podemos poner May, Upper o podemos poner Up, Capitals o bien Ca, Minúsculas o podemos poner Min, Lower o Lo y Non capitals o simplemente Non

¿Y SI LO QUEREMOS PONER LA PRIMERA LETRA DE CADA PALABRA EN MAYÚSCULA?

Bastaria con dejar en blanco dicho argumento o con poner por ejemplo: Oración

Ademas de que si escribimos en el argumento de la funcion la palabra: Frase, nos pondrá en mayúscula solamente la primera letra de toda la expresion

Quedan exceptuadas las conjunciones

e.g:

valor en letras

Valor en letras

Además la Función tiene el detalle de:

1.) Si en la celda donde introducimos nuestra cantidad para tranformalo a texto, ponemos cualquier Texto por ejemplo [ hola ] o cualquier signo [ ? / ( etc…] pues sucede lo siguiente:

valor en letras

2.) Si ponemos cualquier número negativo:

Valor en letras

3.) Operar con números de 15 digitos:

Valor en letras

4.) Y si dejamos la celda vacia:

Valor en letras

2ª FUNCION: NUMERO2LETRA

http://www.elguille.info/vb/utilidades/cNum2Text.htm

La segunda función de Guillermo Som Cerezo MVP en Visual Basic y que todos conocemos comoel Guille, también nos puede ser útil a la hora de convertir números a letras vamos a comentar dichos argumentos para Excel:

Bien tenemos los siguientes argumentos de la función:

StrNum Argumento requerido donde se introducirá el valor a traducir.

Lo : Argumento Opcional no necesario en Excel ya que su valor por defecto es cero ” 0 ” y cualquier valor añadido [1, 2, 3, 4, etc…] ocasiona la pérdida de la traducciòn en letra, en la celda donde estamos transcribiendo la función.

Si ponemos cualquier número menor que ” 0 ” entonces nos dará error en celda: #¡VALOR! [ error de argumento o tipo de operando incorrecto]

NumDecimales: Argumento Opcional que establecerá cuantas posiciones serán incluidas en la conversión de numero a letra.

  • Si establecemos menor que cero “0” nos devolverá #¡VALOR!
  • Si lo omitimos nos devuelve el texto sin decimales
  • Si lo incrementamos por ejemplo hasta 4 decimales …. por ejemplo ponemos lo siguiente:

100.9990 [ cien euros con novecientos noventa y nueve ] y ponemos en el argumento opcional de la función NumDecimales>> 4

nos da un resultado erróneo:

cien euros con nueve mil novecientos noventa céntimos y no es correcto ya que lo correcto es:

pagar 100 euros con noventa y nueve céntimos.

SMoneda: Argumento Opcional donde escribiremos el nombre de la moneda en Singular, este argumento va acompañado del argumento SexoMoneda el cual para la versión de [ VB ] fue creada como un argumento de Opción [ boton de opción ] y para EXCEL es un argumento de usuario con lo cual hay que prever la interactuación con la función. ( esta modificado por Héctor Miguel para el caso de los millones [ mirar archivo final de articulo])

***Omite la expresión“De” por ejemplo: Un millon Euros

Scentimos: Mismos comentarios que el argumento anterior: SMoneda.

SexoMoneda: Argumento opcional para elegir el sexo de la moneda y que hemos comentado en el argumento: SMoneda.

***si se omite ocasiona por ejemplo: Ochocientas Euros con noventa y nueve céntimos

SexoCentimos: Argumento opcional equivalente al comentado en SexoMoneda pero para los Decimales.

e.g:

numero a letra

3ª FUNCIÓN: NUMEROS_LETRAS POR MAURICIO BAEZA Y SAMUEL MONAJARAS

La tercera función que compone dicho archivo y que os comentamos a continuación:

Consta de dos argumentos Obligatorios:

Numero: Agumento donde introduciremos el valor a traducir

Moneda: Argumento donde se introducirá la moneda y en Singular

***Solo trabaja con masculinos, por ejemplo: Ochocientos Libras

Fraccion_Letras: Argumento donde se puede especificar si lo queremos en número o en letra

  • ***Si lo dejamos vacio entonces nos lo tomara como numero [ Ochocientos Pesos con 99 ]
  • ***Si ponemos cualquier número ya sea positivo o negativo lo tomará como letra [ Ochocientos pesos con noventa y nueve]
  • ***Si por omisión nos equivocamos y ponemos cualquier carácter distinto de un número [ dará error de argumento o operando incorrecto: #¡VALOR!

Fraccion: Argumento en el cual pondremos el texto para los decimanes y en Singular [ Centavo ]

Texto Inicial: Argumento de abertura para encerrar nuestro texto [ ***Ochocientos Pesos con noventa y nueve centavos]

Texto Final: Argumento de cierre para encerrar nuestro texto si asi lo deseamos [ ***Ochocientos euros con noventa y nueve céntimos ***]

***Podéis poner cualquier carácter [ “(“, “[“, “–“, …]

Estilo: Argumento Opcional que determina el estilo de nuestra traducción:

  • Podemos poner el valor1: Nos lo pone en Mayúscula.
  • Podemos poner el valor 2: Nos lo pone en Minúscula
  • Podemos poner el valor 3: Nos pone en mayúscula la primera letra de cada palabra incluidas las conjunciones.

***Sin Valor: nos pondría mayúsculas por omisión

e.g:

numero a letra

4ª Y 5ª FUNCION: ENLETRAS Y CONLETRAS

Función EnLetras publicada en el foro de Excel por Claudio Sepúlveda

Función ConLetras Publicada en el foro de Excel por Guillermo Alonso

***Desconocemos si son los autores originales.

*** Dichas funciones también están mejoradas por Héctor Miguel Orozco

***funciones muy sencillas y válidas sólo para una unidad monetaria [ el Peso] , se pueden utilizar sólo para traducir números a letras.

***Su desarrollo es muy sencillo con un único argumento obligado: El valor a traducir.

e.g:

EnLetras

e.g:

ConLetras

Esperamos que esta saga de Funciones os haya ayudado a comprender mejor la dificultad y complejidad que tiene el realizar la conversión números a letras como también que sobre todo os haya ayudado en vuestra necesidad.

Categorías: Sin categoría

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *