Excel Power查询、VBA和重新计算:It';这很复杂

Excel Power查询、VBA和重新计算:It';这很复杂,excel,vba,powerquery,Excel,Vba,Powerquery,我最近开始使用Excel Power Query,从SharePoint检索数据。在我注意到工作表中查找查询结果的某些单元格(都在同一工作簿中)没有得到计算之前,一切都很顺利。值刚刚显示为0。当我选择单元格并按enter键时,单元格重新计算并显示正确的值。计算方法是“除数据表外自动”(我希望翻译正确) 我将问题追溯到我在许多自定义项中使用的特定自定义项,该函数检查范围(或更精确的参数)是否已重新计算,如果未重新计算,则立即退出外部自定义项。这是许多网站上常见的提高性能的建议,我从来没有遇到过任何

我最近开始使用Excel Power Query,从SharePoint检索数据。在我注意到工作表中查找查询结果的某些单元格(都在同一工作簿中)没有得到计算之前,一切都很顺利。值刚刚显示为0。当我选择单元格并按enter键时,单元格重新计算并显示正确的值。计算方法是“除数据表外自动”(我希望翻译正确)

我将问题追溯到我在许多自定义项中使用的特定自定义项,该函数检查范围(或更精确的参数)是否已重新计算,如果未重新计算,则立即退出外部自定义项。这是许多网站上常见的提高性能的建议,我从来没有遇到过任何问题,直到power query出现

似乎有几个可能的解决方案可以追求:

  • 在执行查询后,以某种方式触发完全重新计算和重建。需要某种触发器或事件(我目前不知道)
  • 使检查参数是否脏的UDF更智能。根据观察到的行为,我的结论是,包含查询结果的表始终计为dirty(?)。如果是这样,向UDF教授这方面的知识将有所帮助
  • 确保查询结果在excel中始终计算为干净
我宁愿避免第一种解决办法。 第三种解决方案听起来似乎有不必要的副作用,因此我倾向于第二种解决方案:改进UDF检查参数是否脏

此处为其当前状态(导致上述行为):

它通常在UDF的第一行中调用,而不是直接从Excel单元格中调用。下面显示了如何从我的查找函数调用它:

Public Function searchKeyed(target As Range, rowKey As Variant, columnKey As Variant) As Variant
    If Not chkRngCalculated(target) Then Exit Function
...
我验证了,如果我注释掉if语句,那么在查询更新时,值确实得到了正确更新

查询的后台更新已关闭。从“除数据表外的自动”切换到“自动”重新计算不会更改所描述的行为


是否有人有过类似的经历并找到了解决方案

如果你让UDF不稳定呢?嗯,那有点用。但是,在点击F9时,并不是所有单元格都被重新计算,只有部分单元格在重新计算时最终计算出所有单元格。然而,将查找函数转换为易失性函数是错误的。这将大大降低性能。而且,这是一个严重的副作用。这意味着我必须将此“修复”应用于所有UDF,并且我维护了相当多的库。所以这不可能是最终的解决方案。如果你让UDF不稳定呢?嗯,那有点用。但是,在点击F9时,并不是所有单元格都被重新计算,只有部分单元格在重新计算时最终计算出所有单元格。然而,将查找函数转换为易失性函数是错误的。这将大大降低性能。而且,这是一个严重的副作用。这意味着我必须将此“修复”应用于所有UDF,并且我维护了相当多的库。所以这不可能是最终的解决办法。
Public Function searchKeyed(target As Range, rowKey As Variant, columnKey As Variant) As Variant
    If Not chkRngCalculated(target) Then Exit Function
...