我正在使用excel 2013.我有一张大表,其中包含一系列客户及其信息。当我向该电子表格添加新客户时,它通过将CustomerID发布到我们的服务器来填充大多数信息,服务器将客户信息返回到Json字符串中,然后对其进行解析。特定函数返回所需信息,即“= Json_get_email(Userid)”将返回电子邮件地址。所有这些工作都非常好,并且对我公司的员工来说相对用户友好。
应用自动过滤器时会出现问题。即使在此没有任何功能易变,应用自动过滤器会导致电子表格重新计算所有功能,对于客户或少数客户而言,有效且快速的功能现在会像疯了一样放慢电子表格的速度。
我转向你,知道是否有任何方法可以防止每次应用过滤器时计算我的函数。
我最好的,
法比安
答案 0 :(得分:2)
这样的事情会使你的表更快:
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
在使用相同参数值的调用之间缓存返回电子邮件值应该没有问题。
答案 1 :(得分:0)
这是我实施的解决方案。我想分享它,因为我看到许多人对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的有益见解。