Excel VBA函数仅在更改时更新

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

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

我想find一些方法来检测,不需要改变,跳过这一步。 有些事情我已经尝试过了:

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

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

其他需求:

  • 可能有一种方法来禁用所有公式自动计算,但我一定要每一行更新一旦参数单元格input。 我也不想强迫用户按下button来更新function。
  • 我试图在Visual Studio中做一个自定义的电子表格,但发现部署太难以维护我的用户群。 解决scheme必须完全包含在启用macros的工作簿中。
  • 使用该表格的Excel版本将是2007年和2010年。

我会

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

  2. 创build一个Private Sub Worksheet_Change(ByVal Target As Range)并确定在哪些条件下应该进行重新计算( Target.Worksheet.Calculate ) – 例如确定目标的Target.Column (使用Target.ColumnTarget.Row ),以及从Worksheet_Change触发器中调用查询。

  3. 最后,我会把重新计算指令放在一个Sub中,并在表单中设置一个button,这样用户可以根据他/她的意愿手动触发重新计算(以防万一F9键不为用户所知)

  4. 使用由Worksheet_Change触发器设置的全局布尔variablesneed_Query也是need_Query If Target.Row = X And Target.Column = Y (=参数)并且使查询函数检查(并重置)该布尔值,并且去在查询中只有If need_Query Then ,否则退出不动作。 确保need_Query在工作表加载时也设置为FALSE。

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