4

我有一个作为 VBA 模块实现的函数,它将一个单元格作为参数并查询 Web 服务以返回结果。由于数据的来源是远程的,这个函数可能需要几秒钟才能返回。

问题是某些操作,例如删除任何列,似乎会导致每个公式重新计算,即使不需要更改。当我的工作表有数百行时,这可能需要几分钟,在此期间 Excel 没有响应。

我想找到一些方法来检测不需要更改并跳过此步骤。我尝试过的一些事情:

  • 确定要更改的单元格的当前值,我可以从中确定是否需要更新。但是 ActiveCell.Value 是空白的,并且尝试将单元格本身作为第二个参数传递会遇到循环引用警告。
  • 创建第二列来保存旧输入值,然后将其传递给函数并与新值进行比较。但是,函数无法在成功时更新此旧值,并且尝试仅使用公式进行更新总是会遇到循环引用警告。此外,函数似乎不能返回“无变化”,所以我需要存储和使用旧结果。

有什么方法可以防止某些操作更新工作表上的每个公式?

其他需求:

  • 可能有一种方法可以禁用所有公式自动计算,但我绝对希望在输入参数单元格后立即更新每一行。我也不想强迫用户按下按钮来更新功能。
  • 我尝试在 Visual Studio 中制作自定义电子表格,但发现部署对于我的用户群来说难以维护。解决方案必须完全包含在启用宏的工作簿中。
  • 使用工作表的 Excel 版本将是 2007 和 2010。
4

1 回答 1

2

我会

  1. 通过将文件/选项/公式/工作簿计算设置为“手动”并关闭“保存时重新计算”来系统地阻止重新计算

  2. 创建一个Private Sub Worksheet_Change(ByVal Target As Range)并确定在什么条件下应该进行重新计算(Target.Worksheet.Calculate) - 例如确定目标的坐标(使用Target.Columnand Target.Row),并从 Worksheet_Change 触发器内部调用查询。

  3. 最终,我会将重新计算指令放在它自己的 Sub 中,并在工作表中制作一个按钮,以便用户可以 - 根据他/她的意愿 - 手动触发重新计算(以防用户不知道 F9 键)

  4. 也可以考虑使用need_Query由 Worksheet_Change 触发器If Target.Row = X And Target.Column = Y(= 参数)设置的全局布尔变量,并让查询函数检查(并重置)该布尔变量,然后仅进入查询If need_Query Then,否则不执行任何操作退出。确保在工作表加载时也将 need_Query 设置为 FALSE。

  5. 最后,您可以将查询函数转换为 aSub并在 Worksheet_Change 触发器中制定一些更复杂的条件来触发它(例如,如果某个列发生更改等)。

于 2012-11-13T08:00:45.527 回答