Inhaltsverzeichnis
In diesem Artikel werden wir uns die Probleme ansehen, die bei der Verwendung von benutzerdefinierten Funktionen in Ihren Arbeitsmappen auftreten können, und ich werde versuchen, Ihnen zu zeigen, was die Ursachen dafür sind und wie sie leicht gelöst werden können.
Wir werden über Folgendes sprechen:
Wir haben bereits darüber gesprochen, was eine benutzerdefinierte Funktion ist und wie man sie erstellt und verwendet. Wenn Sie das Gefühl haben, dass Sie das Grundwissen über UDFs vorher auffrischen müssen, machen Sie eine Pause und lesen Sie meinen vorherigen Artikel.
Warum wird die Excel UDF nicht neu berechnet?
Wenn Sie Änderungen in Ihrer Arbeitsmappe vornehmen, berechnet Excel nicht jede einzelne Formel neu, sondern aktualisiert nur die Ergebnisse für die Formeln, die mit den geänderten Zellen verknüpft sind.
Dies betrifft jedoch die Excel-Standardfunktionen. Bei den benutzerdefinierten Funktionen kann Excel den VBA-Code nicht überprüfen und keine anderen Zellen identifizieren, die sich ebenfalls auf das Ergebnis der benutzerdefinierten Funktion auswirken könnten. Daher wird Ihre benutzerdefinierte Formel möglicherweise nicht geändert, wenn Sie Änderungen an der Arbeitsmappe vornehmen.
Um das Problem zu beheben, müssen Sie lediglich die Anwendung.flüchtig Im nächsten Kapitel finden Sie eine Schritt-für-Schritt-Anleitung für die Anwendung.
Flüchtige vs. nichtflüchtige benutzerdefinierte Funktionen
Standardmäßig sind benutzerdefinierte Funktionen in Excel nicht flüchtig. Das bedeutet, dass die UDF nur dann neu berechnet wird, wenn sich der Wert einer der Zellen, auf die sie sich bezieht, ändert. Ändert sich jedoch das Format der Zellen, der Name des Arbeitsblatts oder der Name der Datei, werden keine Änderungen in der UDF vorgenommen.
Wechseln wir von Worten zu Beispielen. Wenn Sie beispielsweise den Namen Ihrer Arbeitsmappe in eine Zelle schreiben möchten, erstellen Sie eine benutzerdefinierte Funktion:
Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function
Stellen Sie sich nun den folgenden Fall vor: Sie haben eine benutzerdefinierte Formel geschrieben =Arbeitsbuchname() in die Zelle eingegeben und dort den Dateinamen erhalten. Nach einer Weile haben Sie beschlossen, die Datei umzubenennen und sie unter einem anderen Namen zu speichern. Aber Sie schauen sich den Wert in der Zelle an und sehen, dass er sich nicht geändert hat. Es gibt immer noch einen alten Dateinamen, der nicht mehr stimmt.
Da diese Funktion keine Argumente enthält, wird sie nicht neu berechnet (auch wenn Sie den Namen der Arbeitsmappe ändern, sie schließen und dann wieder öffnen).
Hinweis: Um alle Funktionen in Ihrer Datei neu zu berechnen, können Sie die Tastenkombination Strg + Alt + F9 verwenden.
Gibt es einen einfacheren Weg? Damit die Formel bei jeder Änderung des Arbeitsblatts neu berechnet wird, benötigen Sie eine zusätzliche Codezeile. Fügen Sie das folgende Codestück am Anfang Ihrer Funktion ein:
Anwendung.flüchtig
Ihr Code wird also wie folgt aussehen:
Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function
Jetzt ist Ihre UDF flüchtig, d.h. sie wird automatisch neu berechnet, wenn eine Zelle im Arbeitsblatt neu berechnet wurde oder eine Änderung in der Arbeitsmappe stattgefunden hat. Sobald Sie den Namen der Datei ändern, werden Sie die Aktualisierung sofort sehen.
Bitte beachten Sie, dass zu viele flüchtige Funktionen Ihr Excel verlangsamen können. Schließlich gibt es zu viele benutzerdefinierte Funktionen, die komplexe Berechnungen durchführen und ständig mit großen Datenbereichen arbeiten.
Daher empfehle ich, die Volatilität nur dort einzusetzen, wo sie wirklich benötigt wird.
Warum benutzerdefinierte Funktionen nicht verfügbar sind
Wenn Sie die ersten Buchstaben des Namens einer benutzerdefinierten Funktion eingeben, wird diese in der Dropdown-Liste neben der Eingabezelle angezeigt, genau wie die Standard-Excel-Funktionen.
Doch das passiert nicht immer. Welche Fehler können dazu führen?
Wenn Sie Excel 2003-2007 verwenden, erscheint die UDF nicht in der Dropdown-Liste, sondern nur die Standardfunktionen.
Aber auch wenn Sie eine neuere Version von Excel verwenden, können Sie versehentlich einen weiteren Fehler machen.
Die benutzerdefinierte Funktion muss sich in einem Standard-VBA-Modul namens Modules befinden. Wenn Sie ein neues Modul hinzufügen, um den Funktionscode zu schreiben, wird automatisch ein Ordner Modules erstellt, in dem alle Module gespeichert werden.
Aber manchmal kommt es vor, dass ein neues Modul nicht erstellt wird. Auf dem nächsten Screenshot können Sie sehen, dass der benutzerdefinierte Funktionscode im Modul "Microsoft Excel Objects" zusammen mit ThisWorkbook enthalten ist.
Der Punkt ist, dass Sie eine benutzerdefinierte Funktion nicht im Codebereich eines Arbeitsblatts oder einer Arbeitsmappe platzieren können. In diesem Fall wird die Funktion nicht funktionieren. Außerdem wird sie nicht in der Dropdown-Liste der Funktionen erscheinen. Daher sollte sich der Code immer im Ordner Module .
Der Hilfetext für benutzerdefinierte Excel-Funktionen wird nicht angezeigt
Ein weiteres Problem kann der Hinweis sein, den Sie sehen, wenn Sie eine benutzerdefinierte Funktion einfügen. Wenn Sie eine Standardfunktion verwenden, sehen Sie immer einen Tooltip für die Funktion und ihre Argumente. Aber was ist mit UDFs?
Wenn Sie viele benutzerdefinierte Funktionen haben, wird es für Sie extrem schwierig sein, sich zu merken, welche Berechnungen jede einzelne Funktion durchführt. Noch schwieriger wird es sein, sich zu merken, welche Argumente zu verwenden sind. Ich denke, es wird eine gute Idee sein, eine Beschreibung Ihrer benutzerdefinierten Funktionen als Erinnerung zu haben.
Hierfür würde ich die Verwendung der Anwendung.MakroOptionen Sie hilft Ihnen, nicht nur die Beschreibung der Funktion, sondern auch die der einzelnen Argumente im Fenster des Funktionsassistenten anzuzeigen. Sie sehen dieses Fenster, wenn Sie in der Formelleiste auf die Schaltfläche Fx klicken.
Im vorigen Artikel haben wir uns die benutzerdefinierte Funktion GetMaxBetween angesehen. Sie findet die maximale Zahl im angegebenen Bereich und nimmt drei Argumente entgegen: einen Bereich numerischer Werte sowie einen Höchst- und Mindestwert, nach dem gesucht werden soll.
Nun fügen wir eine Beschreibung für diese benutzerdefinierte Funktion hinzu. Dazu erstellen Sie die Datei Anwendung.MakroOptionen Für den Befehl GetMaxBetween Funktion können Sie den folgenden Befehl ausführen:
Sub RegisterUDF () Dim strFuncName As String 'Name der Funktion, die Sie registrieren möchten Dim strDescr As String ' Beschreibung der Funktion selbst Dim strArgs () As String 'Beschreibung der Funktionsargumente ' Funktion GetMaxBetween registrieren ReDim strArgs (1 To 3) 'Anzahl der Argumente in Ihrer Funktion strFuncName = "GetMaxBetween" strDescr = "Maximale Anzahl im angegebenen Bereich" strArgs (1) ="Bereich numerischer Werte" strArgs (2) = "Untere Intervallgrenze " strArgs (3) = "Obere Intervallgrenze " Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " My Custom Functions " End Sub
oder
Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Maximale Zahl im angegebenen Bereich" , _ Category: = "My Custom Functions" , _ ArgumentDescriptions: = Array (_ "Bereich numerischer Werte" , _ "Untere Intervallgrenze" , _ "Obere Intervallgrenze" ) End SubVariabel str FuncName ist der Name der Funktion. strDescr - Funktionsbeschreibung: Die strArgs Variablen enthalten Hinweise für jedes Argument.
Sie fragen sich vielleicht, was das vierte Argument von Application.MacroOptions ist. Dieses optionale Argument heißt Kategorie und gibt die Klasse der Excel-Funktionen an, die unsere benutzerdefinierte GetMaxBetween () Sie können sie nach einer der vorhandenen Kategorien benennen: Mathematik & Trigonometrie, Statistik, Logik usw. Sie können einen Namen für die neue Kategorie angeben, in der Sie die von Ihnen erstellten Funktionen ablegen werden. Wenn Sie das Argument Kategorie nicht verwenden, wird die benutzerdefinierte Funktion automatisch in der Kategorie "Benutzerdefiniert" abgelegt.
Fügen Sie den Funktionscode in das Modulfenster ein:
Klicken Sie dann auf die Schaltfläche "Ausführen". Der Befehl führt alle Einstellungen für die Verwendung der Fx Taste mit Ihrem GetMaxBetween() Funktion.
Wenn Sie versuchen, eine Funktion in eine Zelle einzufügen, indem Sie die Funktion einfügen werden Sie sehen, dass dort Ihr GetMaxBetween befindet sich in der Kategorie "Meine benutzerdefinierten Funktionen":
Geben Sie einfach den Funktionsnamen in die Zelle ein, und Sie sehen Ihre benutzerdefinierte Funktion in der Dropdown-Liste der Funktionen, aus der Sie auswählen können.
Rufen Sie dann die Funktions-Assistent mit der Taste Fx.
Tipp: Sie können auch die Tastenkombination STRG + A verwenden, um den Funktionsassistenten zu öffnen.
In der Funktions-Assistent sehen Sie eine Beschreibung Ihrer Funktion sowie einen Hinweis auf das erste Argument. Wenn Sie den Mauszeiger auf das zweite oder dritte Argument setzen, erhalten Sie ebenfalls einen Hinweis auf diese Argumente.
Wenn Sie den Text dieser Hinweise ändern möchten, ändern Sie die Werte der Parameter strDescr und strArgs Variablen in der RegisterUDF () Führen Sie dann den Code RegisterUDF () Befehl wieder.
Wenn Sie alle vorgenommenen Einstellungen rückgängig machen und die Funktionsbeschreibung löschen möchten, führen Sie diesen Code aus:
Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub
Es gibt noch eine weitere Möglichkeit, einen Hinweis zu erhalten, wenn Sie eine benutzerdefinierte Funktion eingeben. Geben Sie den Namen der Funktion ein und drücken Sie dann die Tastenkombination Strg + Umschalt + A :
=GetMaxBetween(
+ Strg + Umschalt + A
Sie sehen eine Liste aller Argumente der Funktion:
Leider wird hier die Beschreibung der Funktion und ihrer Argumente nicht angezeigt. Aber wenn die Namen der Argumente recht informativ sind, könnten sie auch hilfreich sein. Immerhin besser als nichts :)
Es wird etwas mehr Arbeit erfordern, Intellisense für UDFs zu erstellen, die wie Standard-Excel-Funktionen funktionieren. Leider bietet Microsoft keine Optionen an. Die einzige verfügbare Lösung ist derzeit eine Excel-DNA IntelliSense-Erweiterung. Weitere Informationen finden Sie auf der Website des Entwicklers.
Wir hoffen, dass diese Richtlinien Ihnen helfen, Probleme zu lösen, wenn Ihre benutzerdefinierte Funktion nicht oder nicht so funktioniert, wie Sie es sich wünschen. Wenn Ihre UDF dennoch nicht funktioniert, beschreiben Sie Ihr Problem bitte genau im Kommentarbereich. Wir werden versuchen, es herauszufinden und die Lösung für Sie zu finden ;)