Notwendig, die Neuberechnung von UDFs zu stoppen, wenn nicht verwandte Zellen gelöscht wurden

Ich habe festgestellt, dass meine UDFs jedes Mal neu berechnet werden, wenn ich Zellen lösche. Dies führt zu erheblichen Verzögerungen beim Löschen ganzer Spalten, da die UDF für jede Zelle aufgerufen wird, in der sie verwendet wird. Wenn Sie also 1000 UDFS verwenden, wird sie beim Löschen einer Spalte oder Zelle 1000 Mal aufgerufen.

Zum Beispiel: Fügen Sie die folgende UDF in ein Modul ein und rufen Sie sie dann einige Male vom Arbeitsblatt aus mit = HelloWorld () @ au

Function HelloWorld()
HelloWorld = "HelloWorld"
Debug.Print Now()
End Function

Dann löschen Sie eine Zeile. Wenn Ihre Erfahrung meiner entspricht, werden Sie feststellen, dass sie bei jeder Verwendung einmal aufgerufen wird.

Hat jemand eine Idee, ob dieses Verhalten gestoppt werden kann? Mich würde auch interessieren, warum es aufgerufen werden soll. Scheint für mich ein Fehler im Abhängigkeitsbaum von Excel zu sein, aber es kann durchaus einen guten Grund geben.

Bearbeiten: Nach dem Experimentieren habe ich weitere Aktionen gefunden, die UDFS auslösen:

Jede Änderung der Anzahl vonSäule dass sich ein ListObject (d. h. eine Excel-Tabelle) über die Größenänderung erstreckt (abernich Reihen). Auch wenn die UDFs selbst nicht im betreffenden ListObject oder in @ enthalten sinirgendei ListObject überhaupt.Hinzufügen neuer Zellen oder Spalten an einer beliebigen Stelle im Blatt (jedoch nicht in Zeilen).

Beachten Sie, dass der manuelle Berechnungsmodus an mehreren Fronten keine Option ist.

Zuerst stellt dies ein zu großes Risiko dar, da es sich um eine Einstellung auf Anwendungsebene handelt, bei der jemand die Ausgabe einer der Tabellenkalkulationen verwendet, die er gerade geöffnet hat, ohne zu bemerken, dass er sich im manuellen Berechnungsmodus befindet.

Zweitens entwerfe ich eigentlich keine bestimmte Tabelle, sondern schreibe ein Buch darüber, wie Nicht-Entwickler gut geschriebenen Standardcode wie UDFs verwenden können, um Dinge zu tun, die sonst über sie hinausgehen. Beispiele hierfür sind das dynamische Verketten oder Teilen von Text oder die UDF für die binäre Suche mit exakter Übereinstimmung, die Charles Williams unter @ skizzierhttps: //fastexcel.wordpress.com/2011/07/22/developing-faster-lookups-part-2-how-to-build-a-faster-vba-lookup (Und ja, ich warne sie sehr, dass eine native formelbasierte Lösung in der Regel eine UDF übertrifft. Wie Sie jedoch aus dem oben erwähnten Thread ersehen können, können sorgfältig geschriebene Funktionen eine gute Leistung erbringen.)

Ich weiß nicht, wie Benutzer diese einsetzen werden.

Da es keine Programmierlösung gibt, muss ich in diesem Buch lediglich darauf hinweisen, dass es bei Benutzern zu erheblichen Verzögerungen beim Hinzufügen oder Löschen von Zellen oder beim Ändern der Größe von ListObjects kommen kann, wenn ressourcenintensive UDFS verwendet werden. Auch wenn diese UDFs effizient geschrieben sind.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage