计算公式的子公式

2024-03-17

选择有公式的单元格后,我们可以在Excel公式栏中选择其公式的一部分并进行计算(按F9)。我需要通过 JavaScript API 重现子公式的计算。

例如,假设 Cell 的值A1, B1, C1分别是1, 2, 3,和细胞D1包含一个公式=A1+B1+C1。我希望能够快速评估子公式,例如A1+B1, B1+C1,并得到结果3 and 5.

在 VBA 中,在manual计算模式,我们可以存储初始公式D1在变量中,然后分配一个子公式(例如,=A1+B1) to D1得到结果3,然后将初始公式恢复为D1就像什么都没发生一样;此评估不会引发任何其他细胞后代的计算D1(感谢manual mode).

然而,使用 JavaScript API,重新计算仅在以下情况下有效automatic模式。如果我们分配一个子公式(例如,=A1+B1) to D1,所有的后代细胞D1重新计算为ctx.sync,这可能会很昂贵。

那么有没有办法或解决方法来优化它呢?

一种可能的解决方法是在工作簿中找到一个没有单元依赖的隔离单元(例如,外部的单元)usedRange工作表的一部分,但由于其性质,我们仍然需要确保没有单元依赖于它usedRange...),然后为该单元格分配一个子公式并获取值。这种方法的缺点是

1)它仍然是一个黑客,并修改了工作表的区域。

2) 用户定义的函数(如果编程不当)可能依赖于工作表的尺寸或容纳工作表的单元格的位置。在这种情况下,在孤立的单元中评估用户定义的函数可能会导致与原始单元中的评估不同的结果(或副作用)。

有人可以帮忙吗?


我认为您列出的第一种方法可能是最简单的。即,重新读取单元格的公式并将其保存为 JavaScript 变量(字符串)。接下来修改适当的公式,对值发出负载,然后将公式恢复为保存字符串。这种方法唯一真正的缺点是你会弄乱某人的公式,这意味着如果步骤 1 和步骤 2 之间出现问题,你会使文档处于脏状态。而且,正如您所说,它可能会对计算产生下游影响(性能方面)。

或者,如果你实际上know有哪些公式,您可以使用“工作表函数”功能。例如,此处您要计算 20 的总和 + 两个工作表范围的总和。

Excel.run(function (ctx) {
    var result = ctx.workbook.functions.sum(
        20,
        ctx.workbook.worksheets.getItem("Sheet1").getRange("F3:F5"),
        ctx.workbook.worksheets.getItem("Sheet1").getRange("H3:H5")
    ).load();

    return ctx.sync();
}).catch(function(e) {
    console.log(e);
});

这是“最干净”的计算方式,因为它不会影响工作表状态,您甚至可以链接计算:

Excel.run(function (ctx) {
    var range = ctx.workbook.worksheets.getItem("Sheet1").getRange("E2:H5");

    var sumOfTwoLookups = ctx.workbook.functions.sum(
        ctx.workbook.functions.vlookup("Wrench", range, 2, false),
        ctx.workbook.functions.vlookup("Wrench", range, 3, false)
        );
    sumOfTwoLookups.load();

    return ctx.sync();
}).catch(function(e) {
    console.log(e);
});

缺点是这不适用于 UDF(以及数组公式),并且您需要预先知道单元格由哪种公式组成。但是,如果您正在谈论计算公式的子公式,我假设您已经了解了其中公式的一些信息,因此后者可能不是问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算公式的子公式 的相关文章

随机推荐