IMPORTANTE: Este post ha sido actualizado al nuevo modelo del API, los cambios son significativos y necesarios para que el código funcione, por favor, después de leer la publicación completa, visita el nuevo post: LOOP WHILE CON TYPESCRIPT EN EXCEL: CONVIRTIENDO SCRIPT ASÍNCRONO HEREDADO AL MODELO ACTUAL
Hola a todos:
Desde hace unos meses estoy comenzando a programar en TypeScript :). Es algo que quiero hacer no tanto ser un cambio inminente en el mundo de la programación en Excel, sino por aprender nuevos lenguajes y utilidades.
Pero qué es TypeScript?, según la fuente de Wikipedia:
TypeScript es un lenguaje de programación libre y de código abierto desarrollado y mantenido por Microsoft. Es un superconjunto de JavaScript, que esencialmente añade tipos estáticos y objetos basados en clases.
TypeScript puede ser usado para desarrollar aplicaciones JavaScript que se ejecutarán en el lado del cliente o del servidor.
TypeScript extiende la sintaxis de JavaScript, por tanto cualquier código JavaScript existente debería funcionar sin problemas. Está pensado para grandes proyectos, los cuales a través de un compilador de TypeScript se traducen a código JavaScript original.
Bien esta es la definición. Pero ¿dónde podrás encontrar el editor de código para programar en TypeScript? Actualmente está disponible en versiones de Excel Online pero cuyas licencias sean Enterprise E3 y E5.
Para tener visible la pestaña «Automatizar» en la cinta de opciones de la versión de Excel que os he comentado, es necesario que lo realices a través de tu cuenta de Office (o si es empresa, seguramente los departamentos de TI sean los que deben habilitar esta pestaña).
Una vez en tu cuenta pulsas en «Administrador» y luego «Configuración» y buscarás Office Scripts. Una vez que lo pulses se mostrará una ventana en la que deberéis marcar la casilla de Permitir a los usuarios automatizar tareas en Office la web.
Una vez realizado todo la anterior tendréis acceso a la pestaña «Automatizar» y por lo tanto a la grabadora y al editor de código.

TypeScript no es VBA y aunque tiene características parecidas algunas no lo son tanto. Actualmente me encuentro «trasteando» con el código, realizando ejemplos y pruebas para ir aprendiendo (no es sencillo, pero para mí es la forma).
Hoy voy a proponer un ejercicio que en VBA sería muy simple pero que en TypeScript me ha resultado en algunos aspectos complicado. Vamos con el ejemplo:

Teniendo en cuenta los datos de la columna A, vamos a generar en la columna B los siguiente literales:
- Grupo 1: cuando el número de la columna A sea <= 35 y en ese caso coloreamos la celda de Amarillo.
- Grupo 2: cuando el número de la columna A sea mayor de 35 y menor o igual a 50 y en ese caso coloreamos la celda de Azul Turquesa.
- Grupo 3: Mayores de 50 y aplicamos Verde.
En la columna C cuando se trate de:
- Grupo 1: si el número de la columna A es menor de 20, indicamos importe de 1.000 euros. Si es mayor, 1.500 euros.
- Grupo 2: Indicamos 2.000 euros.
- Grupo 3 Indicamos 2.500 euros.
Bien para realizar esta tareas en TypeScript utilizaremos el siguiente código:
async function main(context: Excel.RequestContext) {
//Definimos constantes
type Color = "ffff00" | "00ebff" | "008000";
const AMARILLO: Color = "ffff00";
const TURQUESA: Color = "00ebff";
const VERDE: Color = "008000";
// Definimos variables
let MiHoja = context.workbook.worksheets.getActiveWorksheet();
let MiRango = MiHoja.getUsedRange().load("Values, rowCount");
await context.sync();
//Limpiamos datos en columna B y C
MiRango.clear(Excel.ClearApplyTo.formats);
MiRango.getColumn(1).getCell(0, 0).getRowsBelow(MiRango.rowCount - 1).clear(Excel.ClearApplyTo.all);
MiRango.getColumn(2).getCell(0, 0).getRowsBelow(MiRango.rowCount - 1).clear(Excel.ClearApplyTo.all);
//Determinamos rango
let Fin = MiRango.rowCount;
let Info = MiHoja.getRangeByIndexes(1, 0, Fin, 1).load("values")
await context.sync();
//iniciamos While hasta llegar a fin
let i = -1;
while (i < Fin -2) {
i++;
let MiInfo = Info.values[i];
// iniciamos select case
let mi_msg: string;
let importe: number;
switch (true) {
case MiInfo[0] <= 35:
mi_msg = "GRUPO 1";
MiRango.getCell(i + 1, 1).format.fill.color = AMARILLO
if (MiInfo[0] < 20) {
importe = 1000;
} else {
importe = 1500;
}
break;
case MiInfo[0] > 35 && MiInfo[0]<=50:
mi_msg = "GRUPO 2";
MiRango.getCell(i + 1, 1).format.fill.color = TURQUESA
importe=2000
break;
default:
mi_msg = "GRUPO 3";
MiRango.getCell(i + 1, 1).format.fill.color = VERDE
importe=2500
break;
}
// indicamos el comentario según condición
MiRango.getCell(i+1,1).values = [[mi_msg]];
MiRango.getCell(i + 1, 2).values= [[importe]];
MiRango.getCell(i + 1, 2).numberFormatLocal = [
["#.##0,00 €"]
];
}
}
Como podéis observar, en algunos aspectos este lenguaje tiene semejanzas con VBA, pero las diferencias son importantes.
Para el ejemplo podía haber utilizado una instrucción For, pero me he decidido por un Loop While por ser distinto.
Para realizar los casos he programado un select Case y dentro de la secuencia un If condicional.
Para colorear los campos he querido introducir constantes:
type Color = "ffff00" | "00ebff" | "008000";
const AMARILLO: Color = "ffff00";
const TURQUESA: Color = "00ebff";
const VERDE: Color = "008000";
Que luego me permitan únicamente escribir el nombre del color.
También he programado que cada vez que se ejecute se borren las columnas B y C:
//Limpiamos datos en columna B y C
MiRango.clear(Excel.ClearApplyTo.formats);
MiRango.getColumn(1).getCell(0, 0).getRowsBelow(MiRango.rowCount - 1).clear(Excel.ClearApplyTo.all);
MiRango.getColumn(2).getCell(0, 0).getRowsBelow(MiRango.rowCount - 1).clear(Excel.ClearApplyTo.all);
Es importante que tengáis en cuenta que trabajamos en Base 0, es decir que la primera columna, fila será 0 y es sensible a mayúsculas y minúsculas.
Y el resultado de ejecutar el Script es el siguiente:

Esta ha sido la primera publicación que hago sobre TypeScript. Espero seguir publicando cosas nuevas en las próximas semanas.
A diferencia de las publicaciones de Excel y VBA, aquí no existe archivo de ejemplo, únicamente os dejo el código.
Espero que os haya sido de utilidad.
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Muy interesante el artículo. Qué recursos recomiendas para aprender Type Script y aplicarlo a Excel.
Hola José:
Los recursos disponibles están en la documentación que se encuentra en la red. Actualmente no hay mucho:
Algunos sitios:
– https://www.tutorialspoint.com/typescript/typescript_string_split.htm
– https://docs.microsoft.com/es-es/office/dev/scripts/resources/excel-samples
Buenas, muchas gracias por el material que tienes a disposición estoy recién empezando a estudiar typescript y he encontrado poco material en español… por lo mismo, sin querer molestarte, me quedo la duda, por que es -1 y -2…
//iniciamos While hasta llegar a fin
let i = -1;
while (i < Fin -2) {
i++;
let MiInfo = Info.values[i];
Hola Fanny, es para indicar donde comienza el índice que recorrerá el loop. Es complicado dar una explicación completa, pero básicamente tenemos que tener en cuenta los encabezados que estamos trabajando en base 0. Aunque se podrían modificar si modificamos otras variables como Fin, etc.