【发布时间】:2016-07-12 12:49:48
【问题描述】:
选择一个有公式的单元格后,我们可以在Excel公式栏中选择其公式的一部分并计算它(按F9)。我需要通过 JavaScript API 重现这种对子公式的评估。
例如,假设单元格A1、B1、C1 的值分别为1、2、3,并且单元格D1 包含一个公式=A1+B1+C1。我希望能够快速评估A1+B1、B1+C1 等子公式,并得到结果3 和5。
在VBA中,manual计算模式下,我们可以将D1的初始公式存储在一个变量中,然后将一个子公式(如=A1+B1)赋值给D1得到结果@ 987654337@,然后将初始公式恢复为D1,就像什么都没发生一样;此评估不会引发对 D1 后代的任何其他单元格的计算(感谢 manual 模式)。
但是,对于 JavaScript API,重新计算仅适用于 automatic 模式。如果我们为D1分配一个子公式(例如=A1+B1),那么所有D1的后代单元格都会被ctx.sync重新计算,这可能会很昂贵。
那么有没有办法或解决方法来优化它?
一种可能的解决方法是在工作簿中找到一个没有单元格依赖的孤立单元格(例如,工作表的 usedRange 之外的单元格,但我们仍然需要确保没有单元格依赖它,因为性质usedRange...),然后将子公式分配给该单元格并获取值。这种方法的缺点是
1) 它仍然是一个 hack,并且会修改工作表的区域。
2) 用户定义的函数(如果编程不当)可能依赖于工作表的尺寸或保存它的单元格的位置。在这种情况下,在孤立的单元格中评估用户定义的函数可能会导致与原始单元格中的评估不同的结果(或副作用)。
有人可以帮忙吗?
【问题讨论】:
-
我有兴趣详细了解您正在构建的这个加载项,它使用了如此多的功能和 API 特性。如果您想演示或分享您的想法,请通过 exceladdins@outlook.com 与我联系,我将提供我的工作电子邮件地址。谢谢!
-
感谢您的关注,感谢@MichaelZlatkovsky 不断回答我的问题。我认为能够直接向 Microsoft 团队发表讲话并非常感激,这是一种荣幸。其实我之前在OCaml中开发过一个“引擎”,1个月来一直在开发Excel JavaScript插件作为“接口”;我已经提交了 2 个,并且正在开发第三个(因此并非所有功能都在一个插件中)。当我认为我的外接程序看起来不错时,我会尽快与您联系,并且很高兴与你们继续密切(和远程)合作......