es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilizando la última fila con GetRangeByIndexes – Excel

Estoy tratando de aprender las mejores prácticas para crear un rango en JS. Estoy tratando de evitar el error que cometí al aprender VBA, que fue usar el formato Range("A1:A2") durante mucho tiempo antes de darme cuenta de que era mejor usar Range(Cells(1,1),Cells(2,1)) porque los enteros generalmente son más fáciles de trabajar.

Encontré getRangeByIndexes para JS, pero no es perfecto ya que tengo que hacer cálculos sobre el número de filas si la primera fila no es 0. Preferiría usar enteros para establecer la primera y última celda en el rango, pero eso es otra historia.

Actualmente puedo seleccionar el rango si codifico los números, pero ahora estoy trabajando en agregar la función “LastRow” para hacer que el rango sea dinámico y no puedo hacer que funcione. También tuve dificultades para imprimirlo en console.log, pero decidí intentar trabajar con el rango en lugar de imprimirlo. Actualmente estoy editando taskpane.js y soy muy nuevo en esto.

Aquí está mi código hasta ahora:

/*
 * Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 * See LICENSE in the project root for license information.
 */

/* global console, document, Excel, Office */

// La función de inicialización debe ejecutarse cada vez que se carga una nueva página
Office.initialize = () => {
  document.getElementById("sideload-msg").style.display = "none";
  document.getElementById("app-body").style.display = "flex";
  document.getElementById("run").onclick = run;
};

export async function run() {
  try {
    await Excel.run(async (context) => {
      var ws = context.workbook.worksheets.getItem("Sheet1");
      ws.activate();

      var lrow = ws.getUsedRange().getLastRow();
      lrow.load("rowindex");
      context.sync();
      var range = ws.getRangeByIndexes(0, 0, 4, 5); //Esto funciona
      //var range = ws.getRangeByIndexes(0, 0, lrow.rowIndex, 5); //Esto no hace nada, pero tampoco muestra errores, simplemente no hace nada.
      range.select();
      await context.sync();
      console.log("FIN");
    });
  } catch (error) {
    console.error(error);
  }
}

Si reemplazo lrow.rowindex con 4, funciona como se espera. ¿Alguien puede aconsejarme qué estoy haciendo mal y si esta es la mejor forma de generar un rango con números (¿hay alguna forma de hacerlo con la primera/última celda)?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear un rango en JS, es recomendable utilizar el método getRangeByIndexes. Sin embargo, si la primera fila no es 0, se deberá hacer algo de cálculo matemático para calcular los índices correctos.

    Para hacer que el rango sea dinámico, se puede utilizar el método getLastRow() para obtener la última fila del rango utilizado. Para utilizar el índice de fila devuelto por este método en getRangeByIndexes, se debe utilizar el método load para cargar la propiedad rowindex, y luego se debe llamar al método context.sync() para sincronizar la solicitud con Excel.

    En el código proporcionado, reemplazar 4 por lrow.rowIndex debería funcionar para generar un rango dinámico basado en la última fila utilizada en la hoja de cálculo.

    Para crear un rango utilizando las primeras y últimas celdas, en su lugar se puede utilizar el método getRange. Este método toma cuatro argumentos: el índice de fila de la primera celda, el índice de columna de la primera celda, el número de filas a incluir en el rango y el número de columnas a incluir en el rango. Por ejemplo, ws.getRange(1,2,3,4) crearía un rango que comienza en la celda B1 e incluye 3 filas y 4 columnas. Sin embargo, este método no es tan flexible como getRangeByIndexes, ya que requiere argumentos más específicos.

Comments are closed.