VBA For Each Loop to Excel JavaScript API代码

问题描述 投票:1回答:1

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中重申这段代码,我想出了一个解决方案,但我不确定这是最有效的方式。我得到的答案是完全一样的,但是否有更有利的方式来循环一个范围?

  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);
    }
  };
javascript async-await office-js do-while office-js-helpers
1个回答
3
投票

如果你想打印范围内每个单元格的值,你可以使用 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.comen-usjavascriptapiexcelexcel.range?view=excel-js-preview#values。


1
投票

VBA允许你使用for循环访问迭代上的每个单元格。我在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
         }
      }
  };

这段代码可能不是最好的,但对我来说是有效的。

希望这对你有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.