【发布时间】:2012-11-12 22:47:32
【问题描述】:
我有一个作为 VBA 模块实现的函数,它以一个单元格作为参数并查询 Web 服务以返回结果。由于数据来源较远,此函数可能需要几秒钟才能返回。
问题在于,某些操作(例如删除任何列)似乎会导致每个公式都重新计算,即使不需要更改也是如此。当我的工作表有数百行时,这可能需要几分钟,在此期间 Excel 没有响应。
我想找到一些方法来检测不需要更改并跳过此步骤。我尝试过的一些事情:
- 确定要更改的单元格的当前值,我可以从中确定是否需要更新。但是 ActiveCell.Value 是空白的,并且尝试将单元格本身作为第二个参数传递会遇到循环引用警告。
- 创建了第二列来保存旧输入值,然后将其传递给函数并与新值进行比较。但是,函数无法在成功时更新此旧值,并且尝试仅使用公式进行更新总是会遇到循环引用警告。此外,函数似乎不能返回“无变化”,所以我需要存储和使用旧结果。
有什么方法可以防止某些操作更新工作表上的每个公式?
其他要求:
- 可能有一种方法可以禁用所有公式自动计算,但我绝对希望在输入参数单元格后立即更新每一行。我也不想强迫用户按下按钮来更新功能。
- 我尝试在 Visual Studio 中制作自定义电子表格,但发现部署对于我的用户群来说太难维护了。解决方案必须完全包含在启用宏的工作簿中。
- 使用工作表的 Excel 版本将是 2007 和 2010。
【问题讨论】:
-
对于一个固定的输入值,返回值是随时间变化的,还是会固定?如果它会改变,在什么样的时间范围内?
-
您可以使用 worksheet_change 事件来捕获输入范围中的更改,并直接填充输出单元格,而无需使用工作表公式。
-
所以您是说模块中的函数不能直接更新单元格,但是该特定工作表上的覆盖 worksheet_change 事件可以?我理解对了吗?
-
是的。通常,从工作表调用的函数不能直接更改工作表 - 它只能返回一个值。尽管有解决此限制的方法,但我认为最好避免使用它们。您的特定工作簿的最佳解决方案是什么将取决于其他因素(例如,远程调用是否应该在重新打开工作簿时全部更新?,完整的远程数据集是否足够小,您可以在本地缓存整个集合?),但是基于事件的更新可能是一个不错的方法。
-
不,它们不应该在打开表单时更新,是的,结果足够小,可以在本地缓存,我已经在这样做了。听起来这会奏效,非常感谢!
标签: vba excel excel-formula excel-2010