• Home
  • Excel
  • Letras
  • Convertir números a su equivalente en letras

Convertir números a su equivalente en letras

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.

Print