如何获得工作簿的所有已用范围

柔音

给定一个工作簿,我想浏览其工作表并获取其使用范围。我写了下面的代码,可以正常工作:

function getUsedRanges () {
    Excel.run(function (ctx) { 
        var worksheets = ctx.workbook.worksheets;
        var sheetnames = [];
        worksheets.load('items');
        return ctx.sync().then(function() {
            for (var i = 0; i < worksheets.items.length; i++) {
                worksheets.items[i].load('name');
            };
            return ctx.sync().then(function() {
                for (var i = 0; i < worksheets.items.length; i++) {
                    sheetnames.push(worksheets.items[i].name);
                }       
            })
        }).then(function () {
            var usedRange = [];
            for (var i = 0; i < worksheets.items.length; i++) {
                var worksheet = ctx.workbook.worksheets.getItem(sheetnames[i]);
                usedRange[i] = worksheet.getUsedRange();
                usedRange[i].load('address');
            };
            return ctx.sync().then(function() {
                for (var i = 0; i < worksheets.items.length; i++) {
                console.log(usedRange[i].address);
                }
            });
        })
    })
}    

但是,代码对我来说看起来很沉重。例如,

1)我必须记录sheetnames才能访问每个工作表getItem

2)我必须先加载items然后加载name才能获得sheetnames

有谁知道是否有任何方法或属性可以使代码更轻便?此类任务的最佳代码结构是什么?

编辑1:按照Michael的回答,我仍然放置了一个同时获取usedRanges的版本sheet names,请注意,获取该版本sheet names不是强制性的usedRanges

function getUsedRanges () {
    Excel.run(function (ctx) { 
        var worksheets = ctx.workbook.worksheets;
        var usedRange = [];
        worksheets.load('name');
        return ctx.sync()
            .then(function () {
                for (var i = 0; i < worksheets.items.length; i++) {
                    usedRange[i] = worksheets.items[i].getUsedRange();
                    usedRange[i].load('address');
                };
            })
            .then(ctx.sync)
            .then(function() {
                for (var i = 0; i < worksheets.items.length; i++) {
                    console.log(worksheets.items[i].name);
                    console.log(usedRange[i].address);
                }
            })
      })
}
迈克尔·兹拉科夫斯基(Michael Zlatkovsky)-微软

几件事:

1)worksheets.load('items');什么都不做。集合上的负载应指定您关心的子项的属性名称是什么。因此,如果您想查找工作表名称,则应该这样做worksheet.load('name'),并且不需要worksheets.items[i].load('name');

2)您没有理由这样做ctx.workbook.worksheets.getItem(sheetnames[i]);,您可以简单地从ctx.workbook.worksheets刚刚加载集合中获取工作表(即ctx.workbook.worksheets.items[0])。

3)这意味着您的代码可以成为

function getUsedRanges () {
    Excel.run(function (ctx) { 
        var worksheets = ctx.workbook.worksheets;
        worksheets.load('name');
        return ctx.sync()
            .then(function () {
                var usedRange = [];
                for (var i = 0; i < worksheets.items.length; i++) {
                    usedRange[i] = worksheet.getUsedRange();
                    usedRange[i].load('address');
                };
            })
            .then(ctx.sync)
            .then(function() {
                for (var i = 0; i < worksheets.items.length; i++) {
                    console.log(usedRange[i].address);
                }
            })
    })
}

〜MSFT Office可扩展性团队的开发人员Michael Zlatkovsky

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何计算整个工作簿,而不是所有打开的工作簿?

如何同步工作簿中的所有 Textbox1?

如何遍历文件夹内所有工作簿中的所有工作表

如何从Libreoffice Calc工作簿的所有工作表中删除所有图像

如何使用OpenXML获取Excel工作表的已用范围?

删除分配给其他工作簿的所有命名范围

如何获取工作簿范围的名称?

删除工作簿中的所有查询

如何编写 VBA 代码以删除工作簿中所有工作表的特定列?

如何将VBA代码应用于工作簿中的所有工作表?

如何让我的 VBA 代码循环遍历工作簿中的所有工作表?

如何使用 VBA 将所有 Excel 工作簿工作表导入 Access。

Excel VBA-将范围从一个工作表粘贴复制到工作簿中的某些工作表之后的所有工作表

如何获得git工作副本上的所有等效分支?

对工作簿中的所有工作表进行排序

ClosedXML新工作簿样式所有工作表

解锁活动工作簿中的所有工作表

循环浏览工作簿中的所有工作表

将所有工作簿工作表复制到新的工作簿VBA

在新工作簿中列出当前工作簿中的所有工作表

如何在 Tableau 中获取项目中的所有工作簿

如何遍历 Excel Javascript API 中所有打开的工作簿?

Excel 如何使此宏适用于所有工作簿?

如何将所有Power Query工作簿连接批量导入到PowerPivot中?

如何从共享工作簿、Excel VBA 中删除所有其他用户?

excel-如何将所有工作表从一个工作簿复制到另一个工作簿

如何获得使用特定共享工作簿的用户列表?

如何使用OpenPyXl清除Excel工作簿中的值范围

如何在不同的工作簿范围内应用 vlookup?