Excel Javascript(Office.js) - LastRow / LastColumn - 更好的选择吗?

时间:2018-06-16 18:29:39

标签: excel office365 office-js office-addins

在过去的几年里,我一直是StackOverflow的热心读者,我能够通过搜索和一些调整来解决VBA Excel中的所有内容。我之前从未觉得有必要发布任何问题,所以如果这个问题与其他问题重复,我会道歉,或者已经有了答案,我无法找到它。 现在我正在考虑使用Excel-JS来创建AddIn(或更多),但不得不说Javascript并不是我的面包和黄油。在使用VBA的过程中,我发现最简单和最常见的需求之一是获取工作表或给定范围中的最后一行,并且最后一列可能更少。

我已经设法在Javascript中将一些代码放在一起以获得类似的功能,因为它是......它的工作原理。我发布这个

有两个原因
  • 希望改进代码和我的知识
  • 也许其他人可以同时使用代码

所以...为了获得我的lastrow / lastcolumn,我使用全局变量:

var globalLastRow = 0;            //Get the last row in used range
var globalLastCol = 0;            //Get the last column in used range

使用函数填充全局变量以返回lastrow / lastcolumn:

function lastRC(wsName) {
    return Excel.run(function (context) {
        var wsTarget = context.workbook.worksheets.getItem(wsName);
        //Get last row/column from used range
        var uRange = wsTarget.getUsedRange();
        uRange.load(['rowCount', 'columnCount']);

        return context.sync()
            .then(function () {
                globalLastRow = uRange.rowCount;
                globalLastCol = uRange.columnCount;         
            });
    });
}

最后在其他函数中得到我需要的值:

var lRow = 0; var lCol = 0;

await lastRC("randomSheetName");
lRow = globalLastRow; lCol = globalLastCol;

我主要感兴趣的是我是否可以直接从函数lastRC返回值(以及如何...),而不是使用此解决方案。

非常感谢任何建议(理想情况下,如果他们没有附上石头)。

修改 我现在放弃使用额外的功能,因为它使用了额外的context.sync,并且自从这篇文章以来我已经阅读了,同步越少越好

此外,上述方法只是好的,只要你的使用范围在单元格中开始" A1" (或者,至少在第一行/列中),否则当您需要索引时,行/列计数不是很有用。

幸运的是,还有另一种获取最后一行/列的方法:

var uRowsIndex = ws.getCell(0, 0).getEntireColumn().getUsedRange().getLastCell().load(['rowIndex']);
var uColsIndex = ws.getCell(0, 0).getEntireRow().getUsedRange().getLastCell().load(['columnIndex']);

要打破其中一个例子,你是:

  • 从小区开始" A1" getCell(0, 0)
  • 选择整个列" A:A" getEntireColumn()
  • 选择该列getUsedRange()中的usedrange(即:" A1:A12")
  • 选择使用范围getLastCell()中的最后一个单元格(即:" A12")
  • 加载行索引load(['rowIndex'])(对于" A12" rowIndex = 11)

如果您的数据不变,并且您不需要检查特定列(或特定行的最后一列)的lastrow,那么上面的较短版本是:

uIndex = ws.getUsedRange().getLastCell().load(['rowIndex', 'columnIndex']);

最后,请记住,usedrange也会考虑格式化,而不仅仅是值,因此如果您在数据下格式化了行,则会出现意外情况。

我非常感谢 Michael Zlatkovsky ,他在很多文档中投入了大量的工作,而我还远未完成阅读。

0 个答案:

没有答案