Ir al contenido
Cifra y Letra

Convertir números a letras en Excel

Estamos verificando la fórmula y el módulo para Excel antes de ofrecerlos para descarga. Mientras tanto, puedes convertir tu importe y copiarlo con el convertidor de números a letras.

Google Sheets: función comprobada

Esta función se comprobó en Google Sheets con 36 casos de importes y centavos. Descarga el archivo o copia el código. No necesitas instalar un complemento.

Descargar función para Google Sheets

En Google Sheets, ve a Extensiones y abre Apps Script. Crea un archivo nuevo, pega la función NUMLETRAS y guarda. Conserva las funciones que ya tengas. Después escribe =NUMLETRAS(A1) en la hoja, con el importe en A1.

Apps Script
/**
 * NUMLETRAS para Google Sheets (Apps Script) y referencia del algoritmo que siguen la fórmula LAMBDA y el módulo VBA.
 * Devuelve el importe en pesos con el formato de cheques y facturas: «MIL DOSCIENTOS TREINTA Y CUATRO PESOS 56/100 M.N.».
 * Límite: importes de 0 a 999,999,999,999.99 (la precisión de una hoja de cálculo no alcanza más).
 *
 * Uso en Sheets: Extensiones › Apps Script, pegar este archivo y usar =NUMLETRAS(A1) en la hoja.
 * @param {number} numero Importe positivo, con o sin centavos.
 * @return {string} Cantidad con letra en pesos mexicanos.
 * @customfunction
 */
function NUMLETRAS(numero) {
  var U = ['', 'UN', 'DOS', 'TRES', 'CUATRO', 'CINCO', 'SEIS', 'SIETE', 'OCHO', 'NUEVE', 'DIEZ', 'ONCE', 'DOCE',
    'TRECE', 'CATORCE', 'QUINCE', 'DIECISÉIS', 'DIECISIETE', 'DIECIOCHO', 'DIECINUEVE', 'VEINTE', 'VEINTIÚN',
    'VEINTIDÓS', 'VEINTITRÉS', 'VEINTICUATRO', 'VEINTICINCO', 'VEINTISÉIS', 'VEINTISIETE', 'VEINTIOCHO', 'VEINTINUEVE'];
  var D = ['', '', '', 'TREINTA', 'CUARENTA', 'CINCUENTA', 'SESENTA', 'SETENTA', 'OCHENTA', 'NOVENTA'];
  var C = ['', 'CIENTO', 'DOSCIENTOS', 'TRESCIENTOS', 'CUATROCIENTOS', 'QUINIENTOS', 'SEISCIENTOS', 'SETECIENTOS',
    'OCHOCIENTOS', 'NOVECIENTOS'];

  // 1 a 999, siempre delante de un sustantivo (pesos, mil, millones): un, veintiún, treinta y un.
  function tres(x) {
    if (x === 100) return 'CIEN';
    var h = Math.floor(x / 100);
    var r = x % 100;
    var resto = r < 30 ? U[r] : D[Math.floor(r / 10)] + (r % 10 > 0 ? ' Y ' + U[r % 10] : '');
    return (C[h] + ' ' + resto).trim();
  }

  // 1 a 999,999: «mil», no «un mil».
  function seis(x) {
    var miles = Math.floor(x / 1000);
    var resto = x % 1000;
    var parte = miles === 0 ? '' : miles === 1 ? 'MIL' : tres(miles) + ' MIL';
    return (parte + ' ' + (resto > 0 ? tres(resto) : '')).trim();
  }

  if (typeof numero !== 'number' || !isFinite(numero) || numero < 0 || numero >= 1e12) {
    return 'Escribe un importe de 0 a 999,999,999,999.99';
  }
  // Desplazar el decimal de la representación de entrada evita 1.005 * 100 = 100.499999...
  // También contempla la notación científica que usa Number.toString para valores pequeños.
  var partes = String(numero).split('e');
  var total = Math.round(Number(partes[0] + 'e' + (Number(partes[1] || 0) + 2)));
  if (total >= 1e14) return 'El redondeo supera el límite de 999,999,999,999.99';
  var entero = Math.floor(total / 100);
  var centavos = total % 100;
  var millones = Math.floor(entero / 1e6);
  var bajo = entero % 1e6;
  var texto;
  if (entero === 0) {
    texto = 'CERO';
  } else {
    var parteMillones = millones === 0 ? '' : millones === 1 ? 'UN MILLÓN' : seis(millones) + ' MILLONES';
    texto = (parteMillones + ' ' + (bajo > 0 ? seis(bajo) : '')).trim();
  }
  var moneda = entero === 1 ? 'PESO' : (millones > 0 && bajo === 0 ? 'DE PESOS' : 'PESOS');
  return texto + ' ' + moneda + ' ' + (centavos < 10 ? '0' : '') + centavos + '/100 M.N.';
}

Qué devuelve

La función devuelve la cantidad en mayúsculas, PESO o PESOS, los centavos sobre cien y M.N. Acepta importes de 0 a 999,999,999,999.99 y redondea al centavo. Si el redondeo supera ese límite, muestra un mensaje para corregir el importe.

La fórmula y el módulo de Excel siguen en verificación. Google Sheets y Excel son aplicaciones distintas: una prueba en Sheets no confirma que funcione en Excel.