6 febrero, 2025

MOVER DATOS DE UNA TABLA ENTRE VARIAS HOJAS CON TYPESCRIPT

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 postMOVER DATOS DE UNA TABLA ENTRE VARIAS HOJAS CON TYPESCRIPT: CONVIRTIENDO SCRIPT ASÍNCRONO HEREDADO AL MODELO ACTUAL

Hola a todos!

Llevo unos días programando con TypeScript en Excel y hoy me gustaría publicar sobre algo muy concreto, las tablas.

Como sabéis una tabla la creamos seleccionando nuestros datos y dando a la selección formato tabla. Aquí lo explica perfectamente Microsoft.

Trabajar con tablas tiene muchas ventajas y muchas personas deciden utilizarlas en lugar de rangos de datos normales. Imaginando que tenemos una tabla en la Hoja1 de nuestro libro de trabajo y queremos pasarla a la Hoja2, podemos crear un sencillo código en Typescritp que nos ayude a hacerlo. Esta sería la tabla:

Para poder pasar los datos a la Hoja2 vamos a utilizar este código:

async function main(context: Excel.RequestContext) {
	//asignamos variables para hojas 1 y 2
	var Hoja1 = context.workbook.worksheets.getItem("Hoja1");
	var Hoja2 = context.workbook.worksheets.getItem("Hoja2");
	//cargamos valores de filas y columnas
	let MiRangoRow = Hoja1.getUsedRange().load("Values, rowCount");
	let MiRangoColumn = Hoja1.getUsedRange().load("Values, columnCount");
	await context.sync();
	//contamos filas y columnas
	let FinRow = MiRangoRow.rowCount;
	let FinColumn = MiRangoColumn.columnCount;
	//con la tabla 1 cargamos valores de encabezados y rango de datos
	var nTabla = Hoja1.tables.getItem("Tabla1");
	var encabezados = nTabla.getHeaderRowRange().load("values");
	var vTabla = nTabla.getDataBodyRange().load("values");
	return context.sync()
		//pasamos la información a la hoja2
		.then(function () {
			var miEncabezado = encabezados.values;
			var miTabla = vTabla.values;
			//formateamos encabezados y moneda
			Hoja2.getRangeByIndexes(0, 0, 1, FinColumn).values = miEncabezado;
			Hoja2.getRangeByIndexes(0, 0, 1, FinColumn).format.fill.color = "ED7D31"
			Hoja2.getRangeByIndexes(1, 0, FinRow - 1, FinColumn).values = miTabla;
			Hoja2.getRangeByIndexes(1, 2, FinRow - 1, FinColumn).numberFormatLocal = [
				["#.##0,00 €"]
			];
		});
}

Es interesante analizar las propiedades (entre otras):

.getHeaderRowRange().load("values");
.getDataBodyRange().load("values");

Que nos permiten obtener los valores del encabezado y el cuerpo de la tabla. Luego podremos mostrar la información y formatearla con la propiedad .getRangeByIndexes(), por ejemplo con el cuerpo de la tabla:

Hoja2.getRangeByIndexes(1, 0, FinRow-1, FinColumn).values = miTabla;  

O dando formato Euro a los importes:

Hoja2.getRangeByIndexes(1, 2, FinRow - 1, FinColumn).numberFormatLocal = [ ["#.##0,00 €"] ];

Por otra parte, suele ser habitual que en los tutoriales, se muestren ejemplos estáticos, es decir, con rango definidos y delimitados, sin explicar qué es lo que sucede si nuestra base de datos varía en filas o columnas. Esto me irrita bastante, porque es sencillo declarar dos variables para después poder indicar el total de columnas y filas y dimensionar correctamente la tabla resultante. En mi código estas variables son:

let FinRow = MiRangoRow.rowCount;
let FinColumn = MiRangoColumn.columnCount;

Y como habéis visto las hemos utilizado en la propiedad getRangeByIndexes(), sin ellas no sería posible indicar los parámetros necesarios.

Una vez ejecutado el código el resultado en la Hoja2 es este:

Es importante que sepáis que este código únicamente funcionará si trabajamos con Tablas, de forma que antes de ejecutar la programación y si no lo habéis hecho, debéis pasar los datos a formato Tabla.

Y esto es todo por hoy, espero que os sea de utilidad!. Este tipo de programaciones son muy importantes para la automatización de tareas.

Hasta el próximo post : )

¿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

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies