VBA для каждого кода API от L oop до Excel JavaScript - PullRequest
3 голосов
/ 22 апреля 2020

enter image description here

В следующем коде VBA я debug.print для каждого значения ячейки. Используя данные на картинке, мой ответ выглядит следующим образом.

Sub loopAndDebugPrintEachCell()
Dim cl As Object
With Sheets("Sheet1")
    For Each cl In .Range("A1:D2")
        Debug.Print cl.Value
    Next cl
End With
End Sub

enter image description here

Я пытаюсь повторить этот код в JavaScript, и я разобрался с решением, но я не уверен, что это самый эффективный способ. Я получаю точно такой же ответ, но есть ли более выгодный способ для l oop через диапазон?

  loopAndConsoleLogEachCell = async () => {
    try {
      await Excel.run(async context => {
        const range = context.workbook.worksheets.getItem("Sheet1").getRange("A1:D2");
        range.load(["columnCount", "rowCount"]);
        await context.sync();
        let i = 0;
        let rowC = 0;
        do {
          let loopRng = range.getAbsoluteResizedRange(1, 1).getOffsetRange(rowC, i).load(["values"]);
          await context.sync();
          console.log(`${loopRng.values} `);
          let rangeColCount = Math.floor(((range.columnCount) / 2) + 1);
          if (rowC < (range.rowCount) && i == (rangeColCount)) {
            rowC++;
            i = 0;
          } else {
            i++;
          }
        }
        while (rowC < range.rowCount && i < range.columnCount);
      });
    } catch (error) {
      console.error(error);
    }
  };

Ответы [ 2 ]

3 голосов
/ 23 апреля 2020

Если вы хотите напечатать значение каждой ячейки в диапазоне, вы можете использовать range.values API

Вот пример кода для получения значений для диапазона

  await Excel.run(async (context) => {
    const sheet = context.workbook.worksheets.getItem("Sample");
    const range = sheet.getRange("B2:E6");
    range.load("text");
    range.load("values");

    await context.sync();
    console.log(range.values);
    //console.log(JSON.stringify(range.text, null, 4));
  });

Документ можно найти https://docs.microsoft.com/en-us/javascript/api/excel/excel.range?view=excel-js-preview#values

1 голос
/ 29 апреля 2020

VBA позволяет вам получить доступ к каждой ячейке на итерации, используя для l oop. То, что я сделал в TypeScript, чтобы воспроизвести это для диапазона, это загрузить свойства столбцов и строк и сохранить значения в переменных:

await Excel.run(async (context) => {
const sheet = context.workbook.worksheets.getActiveWorksheet();
const range = context.workbook.getSelectedRange();
range.load(["columnIndex", "columnCount", "rowCount", "rowIndex"]);
let col_1 = range.columnIndex; //first column index
let nc = range.columnCount; //number of columns
let row_1 = range.rowIndex; //first row
let nr = range.rowCount; //number of rows

Затем вы можете получить доступ к каждой ячейке с двумя циклами for:

for (let r = 0; r < nr; r++) {
      for (let c = 0; c < nc; c++) {
         cell = sheet.getCell(r + row_1, c + col_1);
         cell.load(["address", "values", "formulasR1C1", "format"]);
         await context.sync();
         let cell_add = cell.address;
         let cell_val = cell.values[0][0]; //values of a cell/range is always a matrix
         if (cell_val <= 5) {
         //do something
         }
      }
  };

Код, возможно, не самый лучший, но он работал для меня.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...