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: MOVER UN RANGO DE DATOS ENTRE VARIAS HOJAS CON TYPESCRIPT: CONVIRTIENDO SCRIPT ASÍNCRONO HEREDADO AL MODELO ACTUAL
Hola a todos;
Hace un par de días escribí un post sobre como mover datos de una tabla entre varias hojas de Excel con TypeScript: MOVER DATOS DE UNA TABLA ENTRE VARIAS HOJAS CON TYPESCRIPT
Es un post muy interesante pero creo que sin duda, el tema necesita más publicaciones relacionadas. En concreto, en ese post veíamos como el código únicamente nos sirve si estamos trabajando con tablas y esto, a mi modo de ver, es una limitación. Para solucionar este problema he estado programando un código con mayor funcionalidad, que nos sirva con tablas o con bases de datos normales.
Llegados hasta aquí, vamos con un ejemplo. Imaginad que tenemos en la Hoja1 de nuestro libro una base de datos con la facturación de varias empresas:
Y deseamos pasar los datos a la hoja2. Para hacerlo os propongo el siguiente 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;
await context.sync();
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 encabezado a hoja Destino
Destino.getRangeByIndexes(0, 0, 1, FinColumn).values = MiEncabezado;
//Damos color verde a los títulos
Destino.getRangeByIndexes(0, 0, 1, FinColumn).format.fill.color = "32CD32"
// Pasamos base de datos
Destino.getRangeByIndexes(1, 0, FinRow - 1, FinColumn).values = MisDatos;
// Damos formato fecha a la columna 0
Destino.getRangeByIndexes(1, 0, FinRow - 1, 1).numberFormatLocal = [
["dd/mm/aaaa"]
];
// Damos formato fecha a la columna 13
Destino.getRangeByIndexes(1, 13, FinRow - 1, 1).numberFormatLocal = [
["dd/mm/aaaa"]
];
// Damos formato moneda a la columna 17
Destino.getRangeByIndexes(1, 17, FinRow - 1, 1).numberFormatLocal = [
["#.##0,00 €"]
];
}
Como podéis observar, creamos dos variables Origen y Destino para trabajar con las Hojas1 y 2, y al igual que en ejemplo anterior de la tabla, obtenemos los rangos totales de filas y columnas y sus valores.
Luego utilizaremos la propiedad .getRangeByIndexes() para traer los los datos de los encabezados y también para igualarlos a la hoja Destino y así pasar la información de una hoja a la otra.
Con la misma propiedad podemos dar formato específico a un hoja determinada, en el ejemplo la columna 0 y 13 con fechas y la 17 con euros.
Destino.getRangeByIndexes(1, 0, FinRow - 1, 1).numberFormatLocal = [
["dd/mm/aaaa"]
];
Destino.getRangeByIndexes(1, 13, FinRow - 1, 1).numberFormatLocal = [
["dd/mm/aaaa"]
];
Destino.getRangeByIndexes(1, 17, FinRow - 1, 1).numberFormatLocal = [
["#.##0,00 €"]
];
Este método nos va a permitir trabajar con tablas o con rangos, y funcionará perfectamente 🙂
Este es el resultado, como podéis observar toda información ha pasado a la hoja2
Y esto es todo por hoy, espero que os haya resultado interesante!
Por otra parte, os voy a dejar la base de datos con la que estoy haciendo el ejemplo dado que es bastante tedioso si para reproducir el ejemplo tenéis que crear desde cero la base de datos. Os recuerdo que esto no es VBA y que el código está en el post no en el archivo de ejemplo.
Descarga el archivo de ejemplo pulsando en:
¿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