我有一个我已经实现为VBA模块的函数,它将一个单元格作为参数并查询Web服务以返回结果.由于数据源是远程的,此功能可能需要几秒钟才能返回.
问题是某些操作(例如删除任何列)似乎会导致每个公式重新计算,即使不需要更改也是如此.当我的工作表有几百行时,这可能需要几分钟,在此期间Excel没有响应.
我想找到一些方法来检测不需要进行任何更改并跳过此步骤.我试过的一些事情:
>确定要更改的单元格的当前值,我可以从中确定是否需要更新.但是ActiveCell.Value是空白的,并且尝试将单元格本身作为第二个参数传递会遇到循环引用警告.
>创建第二列以保存旧的输入值,然后将其传递给函数并与新值进行比较.但是,函数无法在成功时更新此旧值,并且始终只使用循环引用警告来尝试仅使用公式进行更新.此外,似乎函数不能返回“无变化”,因此我需要存储并使用旧结果.
有没有办法阻止某些操作更新工作表上的每个公式?
其他需求:
>可能有一种方法可以禁用所有公式自动计算,但我确实希望在输入参数单元格后立即更新每一行.我也不想强迫用户按下按钮来更新功能.
>我尝试在Visual Studio中执行自定义电子表格,但发现部署对我的用户群来说太难维护了.解决方案必须完全包含在启用宏的工作簿中.
>使用该表的Excel版本将是2007年和2010年.
最佳答案 我会
>通过将文件/选项/公式/工作簿计算设置为“手动”系统地阻止重新计算,并关闭“保存时重新计算”
>创建一个Private Sub Worksheet_Change(ByVal Target As Range)并确定应在何种条件下重新计算(Target.Worksheet.Calculate) – 例如确定目标的坐标(使用Target.Column和Target.Row),并从Worksheet_Change触发器内部调用查询.
>最后我将重新计算指令放在它自己的Sub中,并在工作表中创建一个按钮,以便用户可以 – 按照他/她的意愿 – 手动触发重新计算(以防万一用户不知道F9键)
>使用全局布尔变量need_Query也是可以想象的,该变量由Worksheet_Change触发器设置如果Target.Row = X并且Target.Column = Y(=参数)并且让查询函数检查(并重置)该布尔值,并且只进入查询如果need_Query那么,否则退出而不采取行动.确保在工作表加载时将need_Query设置为FALSE.
>最后,您可以将查询函数转换为Sub并在Worksheet_Change触发器中制定一些更复杂的条件来触发它(例如,如果某个列发生更改等).