administrando macros en libreoffice

Función para convertir de número a cantidad con letra en LibreOffice Calc

Estuve buscando una función para convertir una cantidad de un número a su equivalente con letra en LibreOffice. Para Excel existen varias pero para Calc son un poco más difíciles de encontrar.

Luego me acordé del proyecto Factura Libre que ya incluye una función para hacerlo. Sólo necesitaba buscar el código y pegarlo en un proyecto nuevo.

Primero deben de descargar el código de la función Numeros_letras.

Ahora hay que copiar todo este código a una macro nueva en Calc.

Vamos al menú Herramientas >> Macros >> Organizar macros >> LibreOffice Basic…

Menú Macros

Seleccionamos la hoja de cálculo actual, presionamos el botón Nuevo y le ponemos un nombre a nuestro módulo.

Agregando un módulo nuevo de LibreOffice Basic

Luego en la ventana que aparece pegamos el código de la función.

Pegando el código de la función - LibreOffice Basic

La función tiene 5 parámetros.

  • Numero = Valor que deseamos convertir en texto
  • Moneda = es el nombre de la moneda a mostrar
  • Fraccion_Letras = Verdadero para que la fraccion de la moneda tambien la convierta a letras
  • Fraccion = Es el nombre de la fraccion de la moneda
  • Texto_Inicial = Cualquier texto que quieras al principio del resultado
  • Texto_Final = Cualquier texto que quieras al final del resultado
  • Estilo = Formato de salida 1 = MAYÚSCULAS, 2 = minúsculas , 3 = Tipo Titulo

Los valores negativos los convierte a positivos. El valor minimo es 0, el valor maximo es 9,999,999,999,999.99

Si lo desean pueden descargar esta hoja de cálculo que muestra como se usa la función Número a letras.ods.

Número a Letras.ods - LibreOffice

Muchas Gracias a Mauricio Baeza por liberar este código bajo la licencia GPL.

Publicado por

Linuxman

Ingeniero en sistemas, me gusta Linux, el software libre, el cine y los gadgets. Lagunero de nacimiento, Jerezano de corazón y linuxero por convicción.

29 comentarios sobre “Función para convertir de número a cantidad con letra en LibreOffice Calc”

    1. También le di un vistazo, pero para empezar necesita Java, no es tan personalizable como esta función ya que tiene varios parámetros y además el código fuente.

  1. Pingback: Lo mejor del 2013
  2. En excel se puede crear un complemento (archivo xla) para que siempre este disponible en cualquier documento, ¿Alquien sabe si se puede hacer los mismo en Libreoffice? salu2 a to2

  3. Buenas amigo, alguien sabria como configurar este macro para que en la primera linea de letras me aparezca la palabra “con” justo antes de los decimales… Y como hago para quitar el simbolo de la moneda ($) que aparece automaticamente al presionar enter luego de introducir la cantidad…

  4. Hola César, para quitar el símbolo de moneda sólo tienes que quitarle el formato de moneda, es parecido a excel. Sólo dale formato a la celda.

    Con respecto al “con” creo que es como en el tercer ejemplo que aparece en la imagen. ¿Podrías decirme exactamente como lo quieres?

    Saludos.

  5. Buena funcion, creo que podria se muy util pues en documentos como pagares, letras de cambio o recibos generalmente se escribe el numero en palabras. seria inteesante pasar el codigo a PHP paa poder ofrecer esta funcion en un sitio web

    Gracias.

      1. Hola. Algo estaré haciendo mal, que a mí, no me funciona. Descargué el archivo ejemplo, y sin haberlo modifiado, tampoco me funcionó. :/ ¿Qué puedo revisar para ver por qué falla?

          1. Hermano por mas que intento instalar dicha macro (Numeros a Letras) en mi computadora, siguiendo todos los pasos y procedimientos que indicas, la misma me da un error.

            LibreOffice

  6. Si, el detalle es que la necesito para varios archivos que tengo para mi trabajo… y tengo una base de datos bastante extensa.

    Agradecido de antemano

    Linuxman

    Amigo, no necesitas instalar la macro, el archivo de descarga ya la tiene integrada.

    ¿Que error te da?

    Hermano por mas que intento instalar dicha macro (Numeros a Letras) en mi computadora, siguiendo todos los pasos y procedimientos que indicas, la misma me da un error.

    1. Hola Victor,

      Solo para revisar si había alguna adaptación en el texto de este artículo, seguí estos mismos pasos en una instalación nueva que tengo de Libreoffice y funciona perfectamente.

      Creo que con esta es la tercera vez que te pregunto ¿Qué error te muestra? y no me dices cual es o en su defecto comparte una captura de pantalla con el error. Sin más información no puedo ayudarte.

      Saludos.

    1. Fe de errata…repito la solicitud

      Ej. 2350,25= se lee DOS MIL TRECIENTOS CINCUENTA CON 25/100 ; Es decir quiero combinar el prefijo “con” y la expresion decimal 00/100…Así suele hacerse en Venezuela..

      Agradecido

      1. Hola Victor,

        Ya ve, no era tan difícil decir exactamente lo que quieres, porque no era un error.

        Tendrías que modificar el código para que muestre la cantidad con letra exactamente como lo deseas.

        Saludos.

        1. Muchas gracias hermano, ese es el detalle de todo el problema… No logro identificar en la codificación del lenguaje la forma para colocar el prefijo “con” antes de 00/100.

      1. FUNCIÓN:

        =NUMEROS_LETRAS(I39; “bolívar”;0; “centimo”; ” “; “/100 centimos “;1)

        CODIGO:

        Function Numeros_Letras(ByVal Numero As Double, _ ByVal Moneda As String, _ ByVal Fraccion_Letras As Boolean , _ ByVal Fraccion As String, _ ByVal Texto_Inicial As String, _ ByVal Texto_Final As String, _ ByVal Estilo As Integer) As String Dim strLetras As String Dim NumTmp As String Dim intFraccion As Integer

        strLetras = Texto_Inicial ‘Convertimos a positivo si es negativo Numero = Abs(Numero) NumTmp = Format(Numero, “000000000000000.00”) If Numero < 1 Then strLetras = strLetras & “cero ” & Plural(Moneda) & ” ” Else strLetras = strLetras & NumLet(Val(Left(NumTmp, 15))) If Val(NumTmp) = 1 Or Val(NumTmp) < 2 Then strLetras = strLetras & Moneda & ” ” ElseIf Val(Mid(NumTmp, 4, 12)) = 0 Or Val(Mid(NumTmp, 10, 6)) = 0 Then strLetras = strLetras & “de ” & Plural(Moneda) & ” ” Else strLetras = strLetras & Plural(Moneda) & ” ” End If End If If Fraccion_Letras Then intFraccion = Val(Right(NumTmp, 2)) Select Case intFraccion Case 0 strLetras = strLetras & “con cero ” & Plural(Fraccion) Case 1 strLetras = strLetras & “con un ” & Fraccion Case Else strLetras = strLetras & “con ” & NumLet(Val(Right(NumTmp, 2))) & Plural(Fraccion) End Select Else strLetras = strLetras & Right(NumTmp, 2) End If strLetras = strLetras & Texto_Final Select Case Estilo Case 1 strLetras = UCase(strLetras) Case 2 strLetras = LCase(strLetras) Case 3 strLetras = strLetras ‘StrConv(strLetras, vbProperCase) End Select

        Numeros_Letras = strLetras

        End Function

        Function NumLet(ByVal Numero As Double) As String Dim NumTmp As String Dim co1 As Integer Dim co2 As Integer Dim pos As Integer Dim dig As Integer Dim cen As Integer Dim dec As Integer Dim uni As Integer Dim letra1 As String Dim letra2 As String Dim letra3 As String Dim Leyenda As String Dim TFNumero As String

        NumTmp = Format(Numero, “000000000000000”) ‘Le da un formato fijo co1 = 1 pos = 1 TFNumero = “” ‘Para extraer tres digitos cada vez Do While co1 <= 5 co2 = 1 Do While co2 <= 3 ‘Extrae un digito cada vez de izquierda a derecha dig = Val(Mid(NumTmp, pos, 1)) Select Case co2 Case 1: cen = dig Case 2: dec = dig Case 3: uni = dig End Select co2 = co2 + 1 pos = pos + 1 Loop letra3 = Centena(uni, dec, cen) letra2 = Decena(uni, dec) letra1 = Unidad(uni, dec)

        Select Case co1
          Case 1
            If cen + dec + uni = 1 Then
              Leyenda = "billon "
            ElseIf cen + dec + uni > 1 Then
              Leyenda = "billones "
            End If
          Case 2
            If cen + dec + uni >= 1 And Val(Mid(NumTmp, 7, 3)) = 0 Then
              Leyenda = "mil millones "
            ElseIf cen + dec + uni >= 1 Then
              Leyenda = "mil "
            End If
          Case 3
            If cen + dec = 0 And uni = 1 Then
              Leyenda = "millon "
            ElseIf cen > 0 Or dec > 0 Or uni > 1 Then
              Leyenda = "millones "
            End If
          Case 4
            If cen + dec + uni >= 1 Then
              Leyenda = "mil "
            End If
          Case 5
            If cen + dec + uni >= 1 Then
              Leyenda = ""
            End If
          End Select

        co1 = co1 + 1 TFNumero = TFNumero + letra3 + letra2 + letra1 + Leyenda

        Leyenda = "" letra1 = "" letra2 = "" letra3 = ""

        Loop

        NumLet = TFNumero

        End Function

        Function Centena(ByVal uni As Integer, ByVal dec As Integer, _ ByVal cen As Integer) As String Dim cTexto As String

        Select Case cen Case 1 If dec + uni = 0 Then cTexto = “cien ” Else cTexto = “ciento ” End If Case 2: cTexto = “doscientos ” Case 3: cTexto = “trescientos ” Case 4: cTexto = “cuatrocientos ” Case 5: cTexto = “quinientos ” Case 6: cTexto = “seiscientos ” Case 7: cTexto = “setecientos ” Case 8: cTexto = “ochocientos ” Case 9: cTexto = “novecientos ” Case Else: cTexto = “” End Select Centena = cTexto

        End Function

        Function Decena(ByVal uni As Integer, ByVal dec As Integer) As String Dim cTexto As String

        Select Case dec Case 1: Select Case uni Case 0: cTexto = “diez ” Case 1: cTexto = “once ” Case 2: cTexto = “doce ” Case 3: cTexto = “trece ” Case 4: cTexto = “catorce ” Case 5: cTexto = “quince ” Case 6 To 9: cTexto = “dieci” End Select Case 2: If uni = 0 Then cTexto = “veinte ” ElseIf uni > 0 Then cTexto = “veinti” End If Case 3: cTexto = “treinta ” Case 4: cTexto = “cuarenta ” Case 5: cTexto = “cincuenta ” Case 6: cTexto = “sesenta ” Case 7: cTexto = “setenta ” Case 8: cTexto = “ochenta ” Case 9: cTexto = “noventa ” Case Else: cTexto = “” End Select

        If uni > 0 And dec > 2 Then cTexto = cTexto + “y “

        Decena = cTexto

        End Function

        Function Unidad(ByVal uni As Integer, ByVal dec As Integer) As String Dim cTexto As String

        If dec <> 1 Then Select Case uni Case 1: cTexto = “un ” Case 2: cTexto = “dos ” Case 3: cTexto = “tres ” Case 4: cTexto = “cuatro ” Case 5: cTexto = “cinco ” End Select End If Select Case uni Case 6: cTexto = “seis ” Case 7: cTexto = “siete ” Case 8: cTexto = “ocho ” Case 9: cTexto = “nueve ” End Select

        Unidad = cTexto

        End Function

        ‘Funcion que convierte al plural el argumento pasado Private Function Plural(ByVal Palabra As String) As String Dim pos As Integer Dim strPal As String

        If Len(Trim(Palabra)) > 0 Then pos = InStr(1, “aeiou”, Right(Palabra, 1), 1) If pos > 0 Then strPal = Palabra & “s” Else strPal = Palabra & “es con” End If End If Plural = strPal

        End Function

        Sub Macro1

        End Sub

¡Me encantaría saber que opinas!