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 comenzaSASndo 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.

Donate Button with Credit Cards

¡¡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

Comparte este post