2016-06-28 13 views
0

Ich benutze Excel 2013. Ich habe ein großes Blatt, die aus einer Liste von Kunden und deren Informationen bestehen. Wenn ich neue Kunden zu dieser Tabelle hinzufüge, füllt sie die meisten Informationen, indem sie die CustomerID an unseren Server sendet. Der Server gibt die Kundeninformationen in einer JSON-Zeichenfolge zurück, die dann analysiert wird. Eine bestimmte Funktion gibt die erforderlichen Informationen zurück, d. H. "= Json_get_email (Userid)" gibt die E-Mail-Adresse zurück. All dies funktioniert sehr gut und ist relativ benutzerfreundlich für die Mitarbeiter in meiner Firma zu verwenden.Prevent Neuberechnung von Funktionen beim Anwenden von Autofilter in Excel

Das Problem tritt auf, wenn ein Autofilter angewendet wird. Auch wenn keine Funktion flüchtig ist, führt die Anwendung eines Autofilters dazu, dass die Tabelle alle Funktionen neu berechnet und was für einen Kunden oder einige Kunden effizient und schnell war, verlangsamt jetzt die Tabellenkalkulation wie verrückt.

Ich wende mich an Sie, um zu wissen, ob es irgendeinen Weg gibt zu verhindern, dass meine Funktionen jedes Mal berechnet werden, wenn ein Filter angewendet wird.

mein Bestes,

Fabien

+0

Ich denke, diese Frage ist ziemlich ähnlich wie Ihre http://stackoverflow.com/questions/12808009/run-vba-code-automatica-after-running-a-filter Die Antwort verweist auf diesen Artikel https: // www. execute-exchange.com/articles/2773/Trapping-a-change-to-a-filtered-list-with-VBA.html – jcarroll

+0

Ändern Sie Ihre 'Json_get_email' -Funktion, um den Rückgabewert für jeden Eingabewert zwischenzuspeichern - verwenden Sie die Cache-Wert, wenn vorhanden, anstatt die Daten vom Server erneut abzurufen. Sollte ziemlich sicher sein, da der Rückgabewert für jeden gegebenen Eingang ziemlich fest sein sollte. –

Antwort

0

Hier ist die Lösung, die ich implementiert habe. Ich möchte es teilen, wie ich gesehen habe, dass viele Leute das gleiche Problem mit UDFs hatten.

Es ist nicht perfekt, aber es macht es viel schneller, da es die Verbindung zum Server vermeidet und die Zeichenfolge jedes Mal analysiert.

habe ich eine öffentliche Array von booleans von User_ID indiziert,

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 

Wie immer, ich Speicher für Geschwindigkeit handeln musste aber mit booleans sein nur einem Bit pro Benutzer.

Vielen Dank @Tim für Ihre hilfreiche Einsicht.

2

So etwas wird Ihr Blatt machen viel schneller:

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 

sollte kein Problem sein Cachen der Rückkehr E-Mail-Werte zwischen den Anrufen, die den gleichen Argument Wert verwenden .

+0

Das ist eine sehr gute Idee, ich werde versuchen, diese Lösung zu implementieren und zurück zu sagen, wenn sie funktionstüchtig ist. – Fabien