Estuve buscando una función para obtener un número con letra usando una función para LibreOffice Calc. 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.
Para lograrlo hay que seguir estas instrucciones o descargar el ejemplo.
Dónde agregar el código de la función.
Vamos al menú Herramientas >> Macros >> Organizar macros >> BASIC…

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

Agregamos un módulo nuevo.
Luego en la ventana que aparece pegamos el código de la función.
El código de la función para obtener el número con letra.
Es importante eliminar el código por default del módulo.
REM ***** BASIC *****
Sub Main
End Sub
Ahora podemos copiar y pegar el código de la función en el módulo que acabamos de crear.
Option Explicit
'*************************************************************************************************
' FUNCION PARA CONVERTIR NUMEROS A LETRAS
'
' Copyright (C) 2005 Mauricio Baeza Servin
' Este programa es software libre. Puede redistribuirlo y/o modificarlo bajo los términos de la
' Licencia Pública General de GNU según es publicada por la Free Software Foundation, bien de la
' versión 2 de dicha Licencia o bien (según su elección) de cualquier versión posterior.
'
' Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA, incluso
' sin la garantía MERCANTIL implícita o sin garantizar la CONVENIENCIA PARA UN PROPÓSITO PARTICULAR.
' Véase la Licencia Pública General de GNU para más detalles.
'
' Debería haber recibido una copia de la Licencia Pública General junto con este programa. Si no ha
' sido así, escriba a la Free Software Foundation, Inc., en 675 Mass Ave, Cambridge, MA 02139, EEUU.
'
' Mauricio Baeza - mauricio@correolibre.net
'
'*************************************************************************************************
'Hago uso de variables bastante explicitas para facilitar la lectura del codigo
'Los comentarios cumplen y complementan la misma funcion
'Ultima modificacion Octubre del 2002
'Argumentos:
'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 finla del resultado
'Estilo = Formato de salida
' 1 = MAYUSCULAS
' 2 = minusculas
' 3 = Tipo Titulo
'Los valores negativos los convierte a positivos
'El valor minimo en 0, el valor maximo es 9,999,999,999,999.99
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"
End If
End If
Plural = strPal
End Function

Ajustando la salida de la función para México
La función tiene 7 parámetros.
- Numero = Valor que deseamos convertir en texto
- Moneda = es el nombre de la moneda a mostrar
- Fraccion_Letras = Para que la fracción de la moneda tambien la convierta a letras. 1 es VERDADERO, 0 (cero) es FALSO.
- 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
Veamos, una fórmula como está dará el siguiente resultado:
=NUMEROS_LETRAS(B4, "peso",0, "centavos", "Cantidad: ", "/100 M.N.",1)
CANTIDAD: UN MIL DOSCIENTOS TREINTA Y CINCO PESOS 15/100 M.N.
Descarga una hoja de cálculo de ejemplo.
Si lo desean pueden descargar esta hoja de cálculo que muestra como se usa la función LibreOffice Números a Letras.ods

La función muestra la cantidad con letra con diferentes opciones de personalización.
Revisando las opciones de seguridad
Un detalle final, si descarga el archivo de ejemplo, es probable que reciba una alerta de seguridad.

Es normal porque es cierto, el archivo contiene una macro. Solo tiene que presionar el botón de Activar macros para que funcione o si es usted muy desconfiado, pues a copiar y pegar el código.
Si vas a usar frecuentemente el archivo este mensaje puede parecer un poco molesto. Puedes ir a Opciones - LibreOffice - Seguridad - Seguridad de macros y tienes dos opciones. Bajar el nivel de seguridad o lo que yo hago, agregar una carpeta a las Ubicaciones de archivos de confianza.

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