在 Excel 中应用自动筛选时防止重新计算函数
Posted
技术标签:
【中文标题】在 Excel 中应用自动筛选时防止重新计算函数【英文标题】:Prevent Recalculating of Functions when applying autofilter in Excel 【发布时间】:2016-06-28 14:51:51 【问题描述】:我正在使用 excel 2013。我有一张大表,其中包含客户列表及其信息。当我将新客户添加到此电子表格时,它通过将 CustomerID 发布到我们的服务器来填充大部分信息,服务器以 Json 字符串返回客户信息,然后对其进行解析。特定函数返回所需的信息,即“=Json_get_email(Userid)”将返回电子邮件地址。所有这些工作都非常好,并且对于我公司的员工使用来说相对用户友好。
应用自动过滤器时会出现问题。即使其中没有任何函数是易失性的,应用自动过滤器也会导致电子表格重新计算所有函数,而对于一个客户或少数客户来说高效、快速的方法现在正疯狂地减慢电子表格的速度。
我正在向您咨询是否有任何方法可以阻止每次应用过滤器时计算我的函数。
最好的,
法比恩
【问题讨论】:
我觉得这个问题和你的差不多***.com/questions/12808009/…答案参考这篇文章experts-exchange.com/articles/2773/… 修改Json_get_email
函数以缓存每个输入值的返回值 - 如果存在,则重新使用缓存的值,而不是从服务器重新获取数据。应该非常安全,因为对于任何给定的输入,返回值应该是相当固定的。
【参考方案1】:
这样的事情会让你的工作表更快:
Function Json_get_email(arg)
Static dict As Object '<< persists between calls
If dict is nothing then set dict = Createobject("scripting.dictionary")
If not dict.exists(arg) Then
'have not seen this value of arg before
'...get the return "email" value for 'arg' here
dict.add arg, email
End If
Json_get_email = dict(arg) 'return the cached value
End Function
在使用相同参数值的调用之间缓存返回的电子邮件值应该没有问题。
【讨论】:
这是一个非常好的主意,我会尝试实施这个解决方案,然后回来告诉你是否可行。【参考方案2】:这是我实施的解决方案。我想分享它,因为我看到很多人对 UDF 有同样的问题。
它并不完美,但它的速度更快,因为它避免了每次连接到服务器并解析字符串。
我创建了一个由 User_ID 索引的公共布尔数组,
Public Names_in_List(100000000 To 104000000) As Boolean
Function JSon_CustomerName2(UserID As String) As String
If Names_in_List(UserID) = False Then
'The Function Has not yet been run for this ID
'... Do whatever
Names_in_List(UserID) = True 'Update the status
Else
JSon_CustomerName2 = Application.Caller.value 'Reuse the value that was in the cell.
End If
End Function
与往常一样,我不得不用内存换取速度,但对于布尔值,每个用户只有一位。
非常感谢@Tim 提供的有用见解。
【讨论】:
以上是关于在 Excel 中应用自动筛选时防止重新计算函数的主要内容,如果未能解决你的问题,请参考以下文章
求助:怎样在excel表格中查找后实现自动按照查找顺序排序?