Compartir a través de

Alguien tiene la plantilla para convertir números a letras, pero debe ser más de 10 carácteres. Por ejemplo: Gs. 1.100.000.000.-

Anónimas
2025-06-03T18:59:09+00:00

Tengo el complemento.xlx y pienso que es muy viejo.

Quiero convertir Gs. 1.100.000.000.- a letras.

Solo me deja hacer a 9 dígitos o carácteres!

Gracias!

Microsoft 365 y Office | Excel | Para el negocio | Windows

Pregunta bloqueada. Esta pregunta se migró desde la Comunidad de Soporte técnico de Microsoft. Puede votar si es útil, pero no puede agregar comentarios o respuestas ni seguir la pregunta.

0 comentarios No hay comentarios
{count} votos

17 respuestas

Ordenar por: Muy útil
  1. Anónimas
    2025-06-06T14:49:15+00:00

    Hecho con Copilot.

    ' hecho con Copilot
    
    ' correcciones a mano:
    
    ' corregit uno mil
    
    ' corregir uno millón
    
    ' borrar el primer millones cuando hay dos
    
    Function NumeroALetras2(ByVal MyNumber As String, _
    
                            Optional Separador As String = ".", _
    
                            Optional Moneda As String = "euros", _
    
                            Optional Fraccion As String = "céntimos") As String
    
        Dim Pesos As String
    
        Dim Centavos As String
    
        Dim Temp As String
    
        Dim DecimalPlace As Integer
    
        Dim Count As Integer
    
        Dim Place()
    
        Dim Palabras() As String
    
        Dim cnt As Integer
    
        Dim i As Integer
    
        ReDim Place(9)
    
        Place(2) = " mil "
    
        Place(3) = " millones "
    
        Place(4) = " mil millones "
    
        Place(5) = " billones "
    
        ' Convertir número a texto
    
        MyNumber = Trim(Str(MyNumber))
    
        ' Buscar punto decimal
    
        DecimalPlace = InStr(MyNumber, Separador)
    
        If DecimalPlace > 0 Then
    
            Centavos = GetTens(Left(Mid(MyNumber, DecimalPlace + 1) & "00", 2))
    
            MyNumber = Trim(Left(MyNumber, DecimalPlace - 1))
    
        End If
    
        Count = 1
    
        Do While MyNumber <> ""
    
            Temp = GetHundreds(Right(MyNumber, 3))
    
            If Temp <> "" Then
    
                Pesos = Temp & Place(Count) & Pesos
    
            End If
    
            If Len(MyNumber) > 3 Then
    
                MyNumber = Left(MyNumber, Len(MyNumber) - 3)
    
            Else
    
                MyNumber = ""
    
            End If
    
            Count = Count + 1
    
        Loop
    
        'para corregir el uno mil
    
        If Count = 3 And Temp = "uno" Then
    
            Pesos = Mid(Pesos, 4)
    
        End If
    
        'para corregir el uno millones
    
        If Count = 4 And Temp = "uno" Then
    
            Pesos = "un millon " & Mid(Pesos, 13)
    
        End If
    
        'para corregir el uno billones
    
        If Count = 6 And Temp = "uno" Then
    
            Pesos = "un billón " & Mid(Pesos, 13)
    
        End If
    
        Palabras = Split(Pesos, " ")
    
        ' borrar el primer millones cuando hay dos
    
        ' Contar cuántas veces aparece "millones"
    
        For i = LBound(Palabras) To UBound(Palabras)
    
            If Trim(Palabras(i)) = "millones" Then
    
                cnt = cnt + 1
    
            End If
    
        Next i
    
        If cnt > 1 Then
    
            Pesos = Application.WorksheetFunction.Substitute(Pesos, "millones ", "", 1)
    
        End If
    
        NumeroALetras2 = Application.WorksheetFunction.Trim(Pesos) & " " & Moneda
    
        If Centavos <> "" Then
    
            NumeroALetras2 = Application.WorksheetFunction.Proper(NumeroALetras2 & " con " & Centavos & " " & Fraccion)
    
        End If
    
    End Function
    
    Private Function GetHundreds(ByVal MyNumber)
    
        Dim Result As String
    
        If Val(MyNumber) = 0 Then
    
            Exit Function
    
        End If
    
        MyNumber = Right("000" & MyNumber, 3)
    
        If Mid(MyNumber, 1, 1) <> "0" Then
    
            Select Case Mid(MyNumber, 1, 1)
    
                Case "1"
    
                    Result = "ciento "
    
                Case "2"
    
                    Result = "doscientos "
    
                Case "3"
    
                    Result = "trescientos "
    
                Case "4"
    
                    Result = "cuatrocientos "
    
                Case "5"
    
                    Result = "quinientos "
    
                Case "6"
    
                    Result = "seiscientos "
    
                Case "7"
    
                    Result = "setecientos "
    
                Case "8"
    
                    Result = "ochocientos "
    
                Case "9"
    
                    Result = "novecientos "
    
            End Select
    
        End If
    
        If Mid(MyNumber, 2, 2) <> "00" Then
    
            Result = Result & GetTens(Mid(MyNumber, 2))
    
        End If
    
        GetHundreds = Result
    
    End Function
    
    Private Function GetTens(TensText)
    
        Dim Result As String
    
        If Val(Left(TensText, 1)) = 1 Then
    
            Select Case Val(TensText)
    
                Case 10
    
                    Result = "diez"
    
                Case 11
    
                    Result = "once"
    
                Case 12
    
                    Result = "doce"
    
                Case 13
    
                    Result = "trece"
    
                Case 14
    
                    Result = "catorce"
    
                Case 15
    
                    Result = "quince"
    
                Case Else
    
                    Result = "dieci" & GetDigit(Right(TensText, 1))
    
            End Select
    
        ElseIf Val(Left(TensText, 1)) = 2 Then
    
            If Right(TensText, 1) = "0" Then
    
                Result = "veinte"
    
            Else
    
                Result = "veinti" & GetDigit(Right(TensText, 1))
    
            End If
    
        Else
    
            Select Case Left(TensText, 1)
    
                Case "3"
    
                    Result = "treinta"
    
                Case "4"
    
                    Result = "cuarenta"
    
                Case "5"
    
                    Result = "cincuenta"
    
                Case "6"
    
                    Result = "sesenta"
    
                Case "7"
    
                    Result = "setenta"
    
                Case "8"
    
                    Result = "ochenta"
    
                Case "9"
    
                    Result = "noventa"
    
            End Select
    
            If Right(TensText, 1) <> "0" Then
    
                If Result = "" Then
    
                    Result = GetDigit(Right(TensText, 1))
    
                Else
    
                    Result = Result & " y " & GetDigit(Right(TensText, 1))
    
                End If
    
            End If
    
        End If
    
        GetTens = Result
    
    End Function
    
    Private Function GetDigit(Digit)
    
        Select Case Val(Digit)
    
            Case 1
    
                GetDigit = "uno"
    
            Case 2
    
                GetDigit = "dos"
    
            Case 3
    
                GetDigit = "tres"
    
            Case 4
    
                GetDigit = "cuatro"
    
            Case 5
    
                GetDigit = "cinco"
    
            Case 6
    
                GetDigit = "seis"
    
            Case 7
    
                GetDigit = "siete"
    
            Case 8
    
                GetDigit = "ocho"
    
            Case 9
    
                GetDigit = "nueve"
    
            Case Else
    
                GetDigit = ""
    
        End Select
    
    End Function
    
    0 comentarios No hay comentarios
  2. Anónimas
    2025-06-06T09:59:45+00:00

    Esto de la IA es un cambio muy importante.

    Como tú, creía que la IA era sólo recopilación y manejo de los datos disponibles en la web, pero es mucho más. La G en ChatGPT significa Generative, o sea, genera información.

    El otro día le pasé un artículo de un periódico y le pedí que me hiciese una crítica negativa del artículo, NO un resumen sino una crítica, y lo hizo muy bien y muy rápido.

    En este caso, al código que generó sólo tuve que añadirle los MilesMillones, supongo que por el Billion americano. Y lo hizo casi instantáneamente (y mi chatgpt es el gratuito). El problema del separador decimal es mínimo, es más importante el problema del billion americano (10^9) y el billón europeo (10^12).


    Aquí corregido

    ' Generado con ChatGPT y corregido a mano:
    
    '  le faltaba tratar los miles de millones
    
    '  se definen los tipos de las variables en dim y en function
    
    '  se suprimen variables no utilizadas
    
    'convierte un número hasta billones (europeos) a letra
    
    Function NumeroALetras(ByVal MyNumber As Double, _
    
                           Optional Separador As String = ",", _
    
                           Optional Moneda As String = "Euros", _
    
                           Optional Fraccion As String = "céntimos") As String
    
        Dim DecimalPlace As Integer
    
        Dim DecimalPart As String
    
        Dim EnteroPart As String
    
        Dim Pesos As String
    
        Dim Centavos As String
    
        MyNumber = Format(MyNumber, "0.00")
    
        DecimalPlace = InStr(MyNumber, Separador)
    
        If DecimalPlace > 0 Then
    
            EnteroPart = Left(MyNumber, DecimalPlace - 1)
    
            DecimalPart = Mid(MyNumber, DecimalPlace + 1)
    
        Else
    
            EnteroPart = MyNumber
    
            DecimalPart = "00"
    
        End If
    
        Pesos = ConvertirMiles(Val(EnteroPart))
    
        If Pesos = "" Then Pesos = "cero"
    
        If DecimalPart = "00" Then
    
            NumeroALetras = Application.WorksheetFunction.Proper(Pesos & " " & Moneda & " con cero " & Fraccion)
    
        Else
    
            Centavos = ConvertirDecenas(Val(DecimalPart))
    
            NumeroALetras = Application.WorksheetFunction.Proper(Pesos & " " & Moneda & " con " & Centavos & " " & Fraccion)
    
        End If
    
    End Function
    
    Function ConvertirMiles(ByVal Numero As Double) As String
    
        Dim Billones As Long
    
        Dim MilesMillones As Long
    
        Dim Millones As Long
    
        Dim Miles As Long
    
        Dim Cientos As Integer
    
        Dim Resultado As String
    
        If Numero = 0 Then
    
            ConvertirMiles = ""
    
            Exit Function
    
        End If
    
        Billones = Int(Numero / 1000000000000#)
    
        Numero = Numero - (Billones * 1000000000000#)
    
        MilesMillones = Int(Numero / 1000000000#)
    
        Numero = Numero - (MilesMillones * 1000000000#)
    
        Millones = Int(Numero / 1000000)
    
        Numero = Numero - (Millones * 1000000)
    
        Miles = Int(Numero / 1000)
    
        Numero = Numero - (Miles * 1000)
    
        Cientos = Numero
    
        Resultado = ""
    
        If Billones > 0 Then
    
            If Billones = 1 Then
    
                Resultado = Resultado & "un billón "
    
            Else
    
                Resultado = Resultado & ConvertirCentenas(Billones) & " billones "
    
            End If
    
        End If
    
        If MilesMillones > 0 Then
    
            If MilesMillones = 1 Then
    
                Resultado = Resultado & "mil millones "
    
            Else
    
                Resultado = Resultado & ConvertirCentenas(MilesMillones) & " mil "
    
            End If
    
        End If
    
        If Millones > 0 Then
    
            If Millones = 1 Then
    
                Resultado = Resultado & "un millón "
    
            Else
    
                Resultado = Resultado & ConvertirCentenas(Millones) & " millones "
    
            End If
    
        End If
    
        If Miles > 0 Then
    
            If Miles = 1 Then
    
                Resultado = Resultado & "mil "
    
            Else
    
                Resultado = Resultado & ConvertirCentenas(Miles) & " mil "
    
            End If
    
        End If
    
        If Cientos > 0 Then
    
            Resultado = Resultado & ConvertirCentenas(Cientos)
    
        End If
    
        ConvertirMiles = Trim(Resultado)
    
    End Function
    
    Function ConvertirCentenas(ByVal Numero As Integer) As String
    
        Dim Unidades()
    
        Dim Decenas()
    
        Dim Centenas()
    
        Dim U As Integer
    
        Dim D As Integer
    
        Dim C As Integer
    
        Dim Resultado As String
    
        Unidades = Array("", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", _
    
            "diez", "once", "doce", "trece", "catorce", "quince", "dieciséis", "diecisiete", "dieciocho", "diecinueve")
    
        Decenas = Array("", "", "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa")
    
        Centenas = Array("", "ciento", "doscientos", "trescientos", "cuatrocientos", "quinientos", _
    
                         "seiscientos", "setecientos", "ochocientos", "novecientos")
    
        C = Int(Numero / 100)
    
        D = Int((Numero - C * 100) / 10)
    
        U = Numero Mod 10
    
        Resultado = ""
    
        If Numero = 100 Then
    
            Resultado = "cien"
    
        Else
    
            If C > 0 Then Resultado = Centenas(C) & " "
    
            If (D * 10 + U) < 20 Then
    
                Resultado = Resultado & Unidades(D * 10 + U)
    
            Else
    
                Resultado = Resultado & Decenas(D)
    
                If U > 0 Then
    
                    If D = 2 Then
    
                        Resultado = Left(Resultado, Len(Resultado) - 1) & "i" & Unidades(U)
    
                    Else
    
                        Resultado = Resultado & " y " & Unidades(U)
    
                    End If
    
                End If
    
            End If
    
        End If
    
        ConvertirCentenas = Trim(Resultado)
    
    End Function
    
    Function ConvertirDecenas(ByVal Numero As Integer) As String
    
        If Numero < 10 Then
    
            ConvertirDecenas = "cero " & ConvertirCentenas(Numero)
    
        Else
    
            ConvertirDecenas = ConvertirCentenas(Numero)
    
        End If
    
    End Function
    
    0 comentarios No hay comentarios
  3. Héctor Miguel 71,595 Puntos de reputación
    2025-06-06T03:42:15+00:00

    No lo he probado mucho, pero si hay algún error HM lo dirá...

    si hay (como dicen ahora) 'areas de mejora' (p.ej.)

    asume que todo mundo utiliza la coma para separar decimales (error de principiante ?)

    si en lugar de "euro" se indica "peseta" devuelve (p.ej.) "doscientOs pesetas" (etc.)

    yo tengo mis metodos (con/sin vba, hasta 5 idiomas, y algo mas)

    me gustan mas que lo que 'encuentra' (por la web) chatgpt (siempre 'tomado' de alguien mas)

    veamos si regresa (y sigue interesado) OP 🤔

    0 comentarios No hay comentarios
  4. Anónimas
    2025-06-05T22:12:44+00:00

    Esta respuesta se ha traducido automáticamente. Como resultado, puede haber errores gramaticales o expresiones extrañas.

    Hola Carlos Mongelos,

    Ha pasado un tiempo y escribo para ver cómo van las cosas con este tema. ¿Ha tenido la oportunidad de comprobar las respuestas proporcionadas? Cualquier actualización será apreciada.

    Saludos 

    Jay-Tr– MSFT | Especialista en soporte técnico de la comunidad de Microsoft

    0 comentarios No hay comentarios
  5. Anónimas
    2025-06-05T09:43:20+00:00

    Queridos amiguitos, aquí tenéis el código generado por chatGPT y corregido a mano algún pequeño error.

    Funciona hasta billones (10^12).

    No lo he probado mucho, pero si hay algún error HM lo dirá.

    ' Generado con ChatGPT y corregido a mano
    
    Function NumeroALetras(ByVal MyNumber, _
    
                           Optional Moneda As String = "Euros", _
    
                           Optional Fraccion As String = "céntimos")
    
        Dim Unidades, Decenas, Centenas
    
        Dim Temp
    
        Dim DecimalPlace, Count
    
        Dim DecimalPart, EnteroPart
    
        Dim Pesos, Centavos
    
        ReDim Unidades(9)
    
        ReDim Decenas(9)
    
        ReDim Centenas(9)
    
        Unidades = Array("", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve")
    
        Decenas = Array("", "diez", "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa")
    
        Centenas = Array("", "cien", "doscientos", "trescientos", "cuatrocientos", "quinientos", "seiscientos", "setecientos", "ochocientos", "novecientos")
    
        MyNumber = Format(MyNumber, "0.00")
    
        DecimalPlace = InStr(MyNumber, ",")
    
        If DecimalPlace > 0 Then
    
            EnteroPart = Left(MyNumber, DecimalPlace - 1)
    
            DecimalPart = Mid(MyNumber, DecimalPlace + 1)
    
        Else
    
            EnteroPart = MyNumber
    
            DecimalPart = "00"
    
        End If
    
        Pesos = ConvertirMiles(Val(EnteroPart))
    
        If Pesos = "" Then Pesos = "cero"
    
        If DecimalPart = "00" Then
    
            NumeroALetras = Application.WorksheetFunction.Proper(Pesos & " " & Moneda & " con cero " & Fraccion)
    
        Else
    
            Centavos = ConvertirDecenas(Val(DecimalPart))
    
            NumeroALetras = Application.WorksheetFunction.Proper(Pesos & " " & Moneda & " con " & Centavos & " " & Fraccion)
    
        End If
    
    End Function
    
    Function ConvertirMiles(ByVal Numero)
    
        Dim Billones, MilesMillones, Millones, Miles, Cientos
    
        Dim Resultado As String
    
        If Numero = 0 Then
    
            ConvertirMiles = ""
    
            Exit Function
    
        End If
    
        Billones = Int(Numero / 1000000000000#)
    
        Numero = Numero - (Billones * 1000000000000#)
    
        MilesMillones = Int(Numero / 1000000000#)
    
        Numero = Numero - (MilesMillones * 1000000000#)
    
        Millones = Int(Numero / 1000000)
    
        Numero = Numero - (Millones * 1000000)
    
        Miles = Int(Numero / 1000)
    
        Numero = Numero - (Miles * 1000)
    
        Cientos = Numero
    
        Resultado = ""
    
        If Billones > 0 Then
    
            If Billones = 1 Then
    
                Resultado = Resultado & "un billón "
    
            Else
    
                Resultado = Resultado & ConvertirCentenas(Billones) & " billones "
    
            End If
    
        End If
    
        If MilesMillones > 0 Then
    
            If MilesMillones = 1 Then
    
                Resultado = Resultado & "mil millones "
    
            Else
    
                Resultado = Resultado & ConvertirCentenas(MilesMillones) & " mil "
    
            End If
    
        End If
    
        If Millones > 0 Then
    
            If Millones = 1 Then
    
                Resultado = Resultado & "un millón "
    
            Else
    
                Resultado = Resultado & ConvertirCentenas(Millones) & " millones "
    
            End If
    
        End If
    
        If Miles > 0 Then
    
            If Miles = 1 Then
    
                Resultado = Resultado & "mil "
    
            Else
    
                Resultado = Resultado & ConvertirCentenas(Miles) & " mil "
    
            End If
    
        End If
    
        If Cientos > 0 Then
    
            Resultado = Resultado & ConvertirCentenas(Cientos)
    
        End If
    
        ConvertirMiles = Trim(Resultado)
    
    End Function
    
    Function ConvertirCentenas(ByVal Numero)
    
        Dim Unidades, Decenas, Centenas
    
        Dim Resultado As String
    
        Unidades = Array("", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", _
    
            "diez", "once", "doce", "trece", "catorce", "quince", "dieciséis", "diecisiete", "dieciocho", "diecinueve")
    
        Decenas = Array("", "", "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa")
    
        Centenas = Array("", "ciento", "doscientos", "trescientos", "cuatrocientos", "quinientos", _
    
                         "seiscientos", "setecientos", "ochocientos", "novecientos")
    
        Dim C, D, U
    
        C = Int(Numero / 100)
    
        D = Int((Numero - C * 100) / 10)
    
        U = Numero Mod 10
    
        Resultado = ""
    
        If Numero = 100 Then
    
            Resultado = "cien"
    
        Else
    
            If C > 0 Then Resultado = Centenas(C) & " "
    
            If (D * 10 + U) < 20 Then
    
                Resultado = Resultado & Unidades(D * 10 + U)
    
            Else
    
                Resultado = Resultado & Decenas(D)
    
                If U > 0 Then
    
                    If D = 2 Then
    
                        Resultado = Left(Resultado, Len(Resultado) - 1) & "i" & Unidades(U)
    
                    Else
    
                        Resultado = Resultado & " y " & Unidades(U)
    
                    End If
    
                End If
    
            End If
    
        End If
    
        ConvertirCentenas = Trim(Resultado)
    
    End Function
    
    Function ConvertirDecenas(ByVal Numero)
    
        If Numero < 10 Then
    
            ConvertirDecenas = "cero " & ConvertirCentenas(Numero)
    
        Else
    
            ConvertirDecenas = ConvertirCentenas(Numero)
    
        End If
    
    End Function
    
    0 comentarios No hay comentarios