2016-06-28 68 views
0

我正在使用Excel 2013.我有一張大型工作表,其中包含客戶及其信息列表。當我向該電子表格添加新客戶時,它會通過將客戶ID發佈到我們的服務器來填充大部分信息,服務器將以Json字符串的形式返回客戶信息,然後解析該字符串。一個特定的函數返回所需的信息,即「= Json_get_email(Userid)」將返回電子郵件地址。所有這些工作都非常好,對我公司的員工來說相對用戶友好。防止在Excel中應用自動篩選器時重新計算函數

應用自動過濾器時出現問題。即使沒有函數是易變的,應用自動過濾器會導致電子表格重新計算所有函數,而對於客戶或少數客戶而言,效率和快速的功能現在正在放慢電子表格的瘋狂程度。

我正在轉向您,以瞭解是否有任何方法可以防止每次應用過濾器時計算我的函數。

我最好的,

法比安斯基

+0

我認爲這個問題是非常類似於你的http://stackoverflow.com/questions/12808009/run-vba-code-automatically-after-running-a-filter答案引用本文https:// www。 experts-exchange.com/articles/2773/Trapping-a-change-to-a-filtered-list-with-VBA.html – jcarroll

+0

修改您的'Json_get_email'函數以緩存每個輸入值的返回值 - 重新使用緩存值(如果存在),而不是從服務器重新獲取數據。應該是相當安全的,因爲對於任何給定的輸入,返回值應該是相當固定的。 –

回答

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爲您提供有益的見解。

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 

應該緩存使用相同的參數值調用的返回電子郵件值沒有問題。

+0

這是一個非常好的主意,我會嘗試實施這個解決方案,並回來告訴你,如果功能。 – Fabien

相關問題