gpt4 book ai didi

excel - 查找表与选择相交

转载 作者:行者123 更新时间:2023-12-04 12:50:24 25 4
gpt4 key购买 nike

我正在寻找与 Excel VBA Intersect 方法等效的 Javascript。我需要找到事件单元格表。基本上我对表格所做的一切都是基于用户当前选择的表格。 IIRC,目前没有办法直接做到这一点。所以我想做的基本上是这样的:

  • 获取所选范围(仍然不完美,因为我真的只想要 ActiveCell,而不是Selection)。
  • 获取工作表。
  • 遍历工作表上的所有表格。
  • 检查每个表格,查看所选范围是否在表格范围内。

我胡闹了一下,这是我目前所拥有的,但它不起作用......

Excel.run(function(ctx) {

var Selection = ctx.workbook.getSelectedRange();
var Tables = ctx.workbook.tables;
var TableNames = ctx.workbook.tables.load("name");

for (var i = 0; i < TableNames.items.length; i++)
{
var Table = ctx.workbook.tables.getItem(TableNames.items[i].name);
Table.getRange().load('address');
var Intersect = Selection.getBoundingRect(Table.getRange().address);
if (Intersect != null) {return ctx.sync().then(function() {
TableNames.items[i].name;
})};
}

return ctx.sync();
}).catch(function(error) {
console.log(error);
if (error instanceof OfficeExtension.Error) {
console.log("Debug info: " + JSON.stringify(error.debugInfo));
}
});

如果 API 是原生的,这将是它向前迈出的重要一步。 ;)

谢谢,扎克

最佳答案

有几种方法可以检查当前选择是否与表格相交。这个片段展示了其中的两个。

下面的两个示例都是使用 TypeScript 2.1+ 的 async/await 语法编写的。第二种方法通过使用“await”变得非常简单,但是这两种方法也可以通过常规的 promise 链来实现。

  1. ExcelApi 1.4+ 的效率要高得多,但它只能在较新版本的 Excel 上运行(基于订阅,而不是在 2016 MSI/RTM 上)。它同时进行所有交叉检查。
  2. 如果您有数百个表,或者如果您在 Excel Online 上运行,则 ExcelApi 1.1 版本的效率较低。它需要更多往返服务器,因为它会逐一检查每个表交集,并依靠抛出的错误来通知它没有找到交集。

ExcelApi 1.4+ 方法:

$('#check-intersection-preview').click(function() {
// Note: this function uses a "Preview" API ("range.getIntersectionOrNull"),
// which is only available on the Beta CDN right now, and is subject to change.
// Do not rely on this for production. Instead, use the alternate
// (albeit less neat) version.

Excel.run(async function(context) {
var selection = context.workbook.getSelectedRange();
var tables = context.workbook.tables.load("name");
await context.sync();

var intersections: { [email: string]: Excel.Range } = { };
tables.items.forEach((table) => {
intersections[table.name] = table.getRange().
getIntersectionOrNullObject(selection).load("address");
});
await context.sync();

var found = false;
for (var tableName in intersections) {
var rangeOrNull = intersections[tableName];
if (!rangeOrNull.isNullObject) {
found = true;
console.log(`Intersection found with table "${tableName}". ` +
`Intersection range: "${rangeOrNull.address}".`);
}
}
if (!found) {
console.log("Selection does not intersect any table");
}
}).catch(errorHandler);
});

ExcelApi 1.1 方法:

$('#check-intersection-prod').click(function() {
Excel.run(async function(context) {
var selection = context.workbook.getSelectedRange();
var tables = context.workbook.tables.load("name");
await context.sync();

var found = false;
for (var i = 0; i < tables.items.length; i++) {
try {
var table = tables.items[i];
var intersectionRange = table.getRange()
.getIntersection(selection).load("address");
await context.sync();

// If reached past the sync, it means that "getIntersection"
// did not throw an error, and so the intersection must be valid.
found = true;
console.log(`Intersection found with table "${table.name}". ` +
`Intersection range: "${intersectionRange.address}".`);

} catch (e) {
var isExpectedError = e instanceof OfficeExtension.Error &&
(<OfficeExtension.Error>e).code === Excel.ErrorCodes.itemNotFound;

if (!isExpectedError) {
throw e;
}
}
}

if (!found) {
console.log("Selection does not intersect any table");
}
}).catch(errorHandler);
});

常见的 errorHandler 助手:

function errorHandler(error) {
console.log(error);
if (error instanceof OfficeExtension.Error) {
console.log("Debug info: " + JSON.stringify(error.debugInfo));
}
}


实时试用:您可以在新的 Script Lab (https://aka.ms/getscriptlab) 中通过五次点击实时试用 Excel 1.4+ 方法。只需安装 Script Lab 插件(免费),然后在导航菜单中选择“导入”,并使用以下 GIST URL:https://gist.github.com/Zlatkovsky/3ebdf5587cdc56d23b289fb6a5645030 .参见 more info about importing snippets to Script Lab .

关于excel - 查找表与选择相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39729658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com