Convertir números a su equivalente en letras
FUNCIONES DIVERSAS CONVERTIR NÚMEROS A SU EQUIVALENTE EN LETRAS EXCEL
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 ]
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:
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:
Id_Medida: Argumento Opcional, para algún "texto" al final como identificador de la moneda [ "M.N.", "U.S.Cy.", "€" ...]
e.g:
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 o 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:
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:
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:
2.) Si ponemos cualquier número negativo:
3.) Operar con números de 15 digitos:
4.) Y si dejamos la celda vacia:
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:
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:
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:
e.g:
Descarga del archivo
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.