Hola a todos!. ¿Qué tal estáis?, espero que muy bien.

Llevo bastantes horas del fin de semana trasteando con TypeScript, probando métodos, objetos y propiedades para crear utilidades similares a las que creo con VBA. Para mi es fundamental llegar a ese punto porque significará el comienzo de una nueva etapa.

Uno de los problemas con los que me estoy encontrando a la hora de trabajar con TypeScript es conseguir rapidez en los procedimientos, necesito cálculos ágiles y eficientes para equiparar el lenguaje a VBA y tenerlo presente como una alternativa válida. Sobre el tema de optimizar TypeScript os dejo este enlace como referencia.

Esto solo se logra estudiando y realizando pruebas, no existe otra forma. Por lo que hoy voy a mostraros un ejemplo de una tarea típica de cálculo con VBA en Excel. Imaginad que necesitáis conocer el coste que vuestra empresa paga por cada empleado a la Seguridad Social, (Coste Empresa por Empleado).

Para este ejemplo voy a utilizar el supuesto de que en todos los casos se aplica la base máxima (4.070,10 euros/mes) y por lo tanto un tope anual: 48.841,2 Euros.

Y para el resto de conceptos los siguientes porcentajes:

  • Contingencias comunes: 23,60
  • Desempleo: 5,50
  • Fogasa: 0,20
  • Formación Profesional: 0,60
  • Accidentes de trabajo y enfermedades profesionales: 3,6 (el sector elegido es 80 Actividades de seguridad e investigación).

En estos enlaces encontraréis toda la información relativa:
Bases y tipos de cotización 2019
Tarifa de Primas de A.T. y E.P.

Para nuestro ejemplo tenemos a las siguiente personas con su correspondiente Base. Se supone que trabajan en un centro de alta seguridad como científicos:

La tarea a realizar es pasar las columnas a la hoja 2 y calcular otras dos columnas, una con el coste empresa y otra con el suma de Base y Coste Empresa.

Para realizar esto utilizaré este código:

async function main(context: Excel.RequestContext) {
	//asignamos variables para hojas 1 y 2
	let Origen = context.workbook.worksheets.getItem("Hoja1");
	let Destino = context.workbook.worksheets.getItem("Hoja2");
	//cargamos valores de filas y columnas
	let MiRangoRow = Origen.getUsedRange().load("Values, rowCount");
	let MiRangoColumn = Origen.getUsedRange().load("Values, columnCount");
	await context.sync();
	//contamos filas y columnas
	let FinRow = MiRangoRow.rowCount;
	let FinColumn = MiRangoColumn.columnCount;
	let encabezados = Origen.getRangeByIndexes(0, 0, 1, FinColumn).load("values");
	let ndatos = Origen.getRangeByIndexes(1, 0, FinRow - 1, FinColumn).load("values");
	await context.sync();
	//asignamos variables para el conjunto de datos y los encabezados
	let MisDatos = ndatos.values;
	let MiEncabezado = encabezados.values;
	//Pasamos encabezados y datos a hoja Destino
	Destino.getRangeByIndexes(0, 0, 1, FinColumn).values = MiEncabezado;
	Destino.getRangeByIndexes(1, 0, FinRow - 1, FinColumn).values = MisDatos;
	Destino.getCell(0, 2).values = [
		["SEG. SOCIAL EMPRESA"]
	];
	Destino.getCell(0, 3).values = [
		["TOTAL"]
	];
	let Base = Destino.getRangeByIndexes(1, 1, FinRow - 1, 1).load("values")
	let sEmpresa = Destino.getRangeByIndexes(1, 2, FinRow - 1, 1).load("values")
	await context.sync();
	//Calculamos nuevos campos
	for (let i = 1; i < FinRow; i++) {
		Destino.activate();
		let nBase = Base.values[i];
		if (nBase < [
				[48841, 2]
			]) {
			Destino.getCell(i, 2).formulas = [
				["=B" + (i + 1) + "*33.5/100"]
			];
		} else {
			Destino.getCell(i, 2).formulas = [
				["=" + "48841.2" + " * 33.5 / 100"]
			];
		}
		let MisEmpresa = sEmpresa.values[i];
		Destino.getCell(i, 3).formulas = [
			["=B" + (i + 1) + "+" + "C" + (i + 1)]
		];
	}
	Destino.getRangeByIndexes(1, 1, FinRow, 3).numberFormatLocal = [
		["#.##0,00 €"]
	];
	//Calculamos totales
	Destino.getCell(FinRow, 1).formulas = [
		["=SUM(B2:B" + FinRow + ")"]
	];
	Destino.getCell(FinRow, 2).formulas = [
		["=SUM(C2:C" + FinRow + ")"]
	];
	Destino.getCell(FinRow, 3).formulas = [
		["=SUM(D2:D" + FinRow + ")"]
	];
	//Resaltamos totales
	Destino.getRange("B" + (FinRow + 1) + ":" + "D" + (FinRow + 1)).format.font.bold = true;
}

Creo que he conseguido hacerlo muy eficiente y rápido, (ese era el objetivo). Como podéis observar las fórmulas las paso como un string a la celda y luego se evalúan directamente en la hoja. (podría convertirlas a valores, pero ralentizaría el código).

Lo fundamental es utilizar lo menos posible el método Load() y si es necesario especificar la propiedad, ej: «values». Y otra cosa importante, si estamos trabajando con bucles, ojo las instrucciones que incluimos, pueden ralentizar mucho la rutina que se está ejecutando.

El resultado de ejecutar el script es este:

Lo importante de este ejemplo es compartir información para crear aplicaciones rápidas y eficientes.

y esto es todo, espero que os resulte de interés y os sea de utilidad. Me ha costado bastante! 🙂

Descarga el archivo de ejemplo pulsando en:

¿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