Crear una tabla automáticamente cuando no sabes cuántas filas vienen (Office Scripts)
Un miembro de la comunidad llegó con un reto poco habitual: necesitaba un script para Excel en la web que convirtiera un rango en tabla sin saber de antemano cuántas filas iban a entrar. Las columnas eran siempre las mismas, pero las filas podían ser 3 o 30. Y como era Excel online, no valía una macro de VBA: tenía que ser con Office Scripts.
La comunidad ofreció varios caminos.
La vía clásica con macros (VBA). Héctor recordó que, si en lugar de un rango normal se usan tablas (ListObjects), el problema desaparece de raíz: una tabla crece automáticamente al añadir filas o columnas, así que no hace falta calcular dónde terminan los datos. El inconveniente es que esto no funciona en la versión web, que es justo donde estaba el problema.
El enfoque con Office Scripts contando el rango usado. Leo propuso un script que parte de una celda fija (por ejemplo B5), lee el rango usado de la hoja con getUsedRange, calcula la última fila y la última columna, construye el rango con getRangeByIndexes y lo convierte en tabla con addTable:
``
function main(workbook: ExcelScript.Workbook) {
const hoja = workbook.getActiveWorksheet();
const rangoUsado = hoja.getUsedRange();
const ultimaFila = rangoUsado.getRowIndex() + rangoUsado.getRowCount() - 1;
const ultimaColumna = rangoUsado.getColumnIndex() + rangoUsado.getColumnCount() - 1;
// B5 = fila 4, columna 1 (índices base 0)
const filaInicio = 4;
const columnaInicio = 1;
const numFilas = ultimaFila - filaInicio + 1;
const numColumnas = ultimaColumna - columnaInicio + 1;
const rangoTabla = hoja.getRangeByIndexes(filaInicio, columnaInicio, numFilas, numColumnas);
workbook.addTable(rangoTabla, true);
}
`
La versión elegante en cuatro líneas. Acto seguido, Leo enseñó un atajo mucho más limpio: si los datos forman un bloque contiguo a partir de una celda, getSurroundingRegion detecta solo ese bloque sin necesidad de calcular nada:
`
function main(workbook: ExcelScript.Workbook) {
const hoja = workbook.getActiveWorksheet();
const rangoTabla = hoja.getRange("B5").getSurroundingRegion();
workbook.addTable(rangoTabla, true);
}
`
Con esa pista, el autor terminó de pulir su propio script (una variante que recorre el rango usado a partir de A1 con un número de columnas configurable) y confirmó que funcionaba: "Lo hizo! Está probado ya".
La conclusión es práctica: cuando el número de filas es variable, no hace falta medir nada a mano. En escritorio, una tabla (ListObject) crece sola; en la web, getSurroundingRegion` hace ese mismo trabajo de detectar el bloque de datos en una sola línea.
El problema: no sabes cuántas filas van a llegar
Un miembro de la comunidad llegó con un reto poco habitual: necesitaba un script que convirtiera un rango en tabla dentro de Excel en la web. Las columnas eran siempre las mismas, pero las filas podían ser 3 o podían ser 30, y no había forma de saberlo de antemano.
Al tratarse de la versión web, VBA quedaba descartado. La única vía era Office Scripts, el lenguaje de automatización de Excel online.
El obstáculo es clásico: si escribes el rango a mano, el script funciona hoy y falla mañana, cuando entren cinco filas más. Y si te pasas de largo por precaución, la tabla arrastra filas vacías que ensucian todo lo que venga después.
La vía clásica: trabajar con tablas desde el principio
Héctor recordó el atajo más sencillo de todos: si en lugar de un rango normal usas tablas (los ListObjects de Excel), el problema desaparece de raíz. Una tabla crece sola al añadir filas o columnas, así que nadie tiene que calcular dónde terminan los datos.
El inconveniente es que esa solución vive en el escritorio, y aquí el problema estaba justo en la versión web. Aun así merece la pena tenerlo presente: buena parte de los problemas de rangos variables se evitan estructurando los datos como tabla antes de automatizar nada.
Enfoque 1: medir el rango usado
Leo propuso primero un script que calcula los límites por su cuenta. Parte de una celda fija, lee el rango usado de la hoja con getUsedRange, deduce la última fila y la última columna, construye el rango con getRangeByIndexes y lo convierte en tabla con addTable:
function main(workbook: ExcelScript.Workbook) {
const hoja = workbook.getActiveWorksheet();
const rangoUsado = hoja.getUsedRange();
const ultimaFila = rangoUsado.getRowIndex() + rangoUsado.getRowCount() - 1;
const ultimaColumna = rangoUsado.getColumnIndex() + rangoUsado.getColumnCount() - 1;
const filaInicio = 4;
const columnaInicio = 1;
const numFilas = ultimaFila - filaInicio + 1;
const numColumnas = ultimaColumna - columnaInicio + 1;
const rangoTabla = hoja.getRangeByIndexes(filaInicio, columnaInicio, numFilas, numColumnas);
workbook.addTable(rangoTabla, true);
}Los valores filaInicio y columnaInicio corresponden a la celda B5, porque los índices de Office Scripts empiezan en cero: la fila 5 es el índice 4 y la columna B es el índice 1.
Funciona, pero tiene un punto débil: getUsedRange mira toda la hoja. Si hay un título suelto en la esquina o una nota al pie, el rango calculado se estira más de la cuenta.
Enfoque 2: la versión elegante en cuatro líneas
Acto seguido, Leo enseñó un atajo mucho más limpio. Si los datos forman un bloque contiguo a partir de una celda, el método getSurroundingRegion detecta solo ese bloque, sin necesidad de calcular nada:
function main(workbook: ExcelScript.Workbook) {
const hoja = workbook.getActiveWorksheet();
const rangoTabla = hoja.getRange("B5").getSurroundingRegion();
workbook.addTable(rangoTabla, true);
}Cuatro líneas frente a doce, y encima más robusto: al partir de una celda concreta y expandirse solo por celdas contiguas, ignora cualquier cosa que haya suelta en otra parte de la hoja. Es el equivalente en Office Scripts de pulsar Ctrl y las flechas para seleccionar el bloque actual.
Con esa pista, el autor terminó de pulir su propio script (una variante que recorre el rango usado a partir de A1 con un número de columnas configurable) y confirmó que funcionaba: "Lo hizo! Está probado ya".
Métodos clave de Office Scripts
getActiveWorksheet— devuelve la hoja sobre la que se ejecuta el script.getUsedRange— devuelve el rango ocupado de la hoja entera. Útil, pero sensible a celdas sueltas.getSurroundingRegion— a partir de una celda, expande la selección por celdas contiguas hasta encontrar filas o columnas en blanco. Es la clave de la solución corta.getRangeByIndexes— construye un rango a partir de fila inicial, columna inicial, número de filas y número de columnas, todo con índices base cero.addTable— convierte un rango en tabla. El segundo argumento indica si la primera fila contiene encabezados.
Conclusión
Cuando el número de filas es variable, no hace falta medir nada a mano. En escritorio, una tabla crece sola; en la web, getSurroundingRegion hace ese mismo trabajo de detectar el bloque de datos en una sola línea.
Es un patrón que se repite mucho en la comunidad de InflueXcel: la primera solución que aparece suele ser la que calcula todo explícitamente, y al poco alguien recuerda que la herramienta ya trae ese cálculo resuelto de fábrica. Merece la pena buscar el método nativo antes de programar la aritmética a mano.
Más casos con estas funciones
Más contenido de Excel en InflueXcel
- Convertir archivos .xls a .xlsx en lote: VBA, Python y Power Automate CasoUn miembro de la comunidad tiene un sistema que genera archivos en formato .xls (Excel 97-2003) en una carpeta, y necesita convertirlos a .x
- Descomposición de Cholesky con matrices dinámicas: de VBA a LAMBDA+REDUCE CasoJuan Pablo lanza un reto al grupo: tiene una descomposición de Cholesky resuelta con VBA y quiere saber si se puede hacer con matrices dinám
- Validar datos en Excel con máscaras de formato (sin VBA) TutorialValidar que un código, una matrícula o un NIF siguen el formato correcto suele acabar en una macro. No hace falta: con una función personali
- Del VBA a una sola fórmula: calcular el RFC mexicano con LET, MAP y expresiones regulares CasoHéctor llega al grupo con un problema que no se ve todos los días: tiene resuelto el cálculo del RFC mexicano, pero lo tiene en VBA, y quier
- Crear el árbol de carpetas del año desde Excel con una macro parametrizable CasoEsta vez no hay una pregunta que resolver: Héctor pasó por el grupo y dejó directamente la herramienta, una macro que crea en Windows la car
- Extraer datos de archivos XML complejos: Power Query, VBA y Power Automate CasoSergio plantea un problema real con datos abiertos del gobierno español: archivos XML de licitaciones públicas con más de 30 niveles de anid
- Automatizar Excel con VBA y ChatGPT: de pedirle el código a integrar la API TutorialTres niveles de automatización con VBA, ordenados de menos a más, y los dos primeros no exigen saber programar. 1. Pedirle el código a ChatG
- Reformatear un código alfanumérico al teclear: de NN1234567 a NN-12345-67 CasoEsta semana surgió en la comunidad una duda muy práctica: cómo conseguir que al escribir un código tipo NN1234567 (dos letras seguidas de si
- Contar participantes por mes en cursos con rangos de fechas CasoInteresante reto planteado por Jaime: tiene una lista de cursos, cada uno con fecha de inicio, fecha de fin y un número de participantes. Ne
- Filtros avanzados en Excel: filtrar por una lista de criterios TutorialEl filtro normal de Excel va perfecto cuando eliges entre pocos valores. Pero cuando te dan una lista de cincuenta albaranes y hay que sacar