Inhaltsverzeichnis
Da Sie bereits wissen, wie man UDFs erstellt (und hoffentlich auch schon ausprobiert haben, wie man sie in Excel anwendet), wollen wir nun ein wenig tiefer gehen und sehen, was man tun kann, wenn die benutzerdefinierte Funktion nicht funktioniert.
Um einige Probleme bei der Erstellung einer benutzerdefinierten Funktion zu lösen, müssen Sie höchstwahrscheinlich ein Debugging durchführen, damit Sie sicher sein können, dass die Funktion korrekt funktioniert.
Wir werden die folgenden Debugging-Techniken untersuchen:
Wenn Sie eine benutzerdefinierte Funktion erstellen, besteht immer die Möglichkeit, dass Ihnen ein Fehler unterläuft. Benutzerdefinierte Funktionen sind in der Regel recht komplex und funktionieren nicht immer auf Anhieb richtig. Die Formel kann ein falsches Ergebnis oder den Fehler #VALUE! zurückgeben. Im Gegensatz zu Standard-Excel-Funktionen werden Ihnen keine anderen Meldungen angezeigt.
Gibt es eine Möglichkeit, eine benutzerdefinierte Funktion Schritt für Schritt durchzugehen, um zu prüfen, wie jede ihrer Anweisungen funktioniert? Sicher! Dazu dient das Debugging.
Ich biete Ihnen mehrere Möglichkeiten, Ihre benutzerdefinierte Funktion zu debuggen, damit Sie die für Sie geeignete auswählen können.
Als Beispiel verwenden wir die benutzerdefinierte Funktion GetMaxBetween aus einem unserer früheren Artikel, das die maximale Zahl im angegebenen Wertebereich berechnet:
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End FunctionDie Funktionsargumente sind der Bereich der Zellen, in den die Zahlen geschrieben werden, sowie die Ober- und Untergrenze der Werte.
Platzieren Sie die Funktion MsgBox an wichtigen Stellen
Um die Ausführung von Berechnungen zu überwachen, können Sie die Werte der wichtigsten Variablen an den richtigen Stellen auf dem Bildschirm anzeigen lassen, z.B. in Popup-Dialogfeldern.
MsgBox ist ein Dialogfeld, das Sie verwenden können, um dem Benutzer eine Nachricht anzuzeigen.
Die Syntax von MsgBox ist ähnlich wie bei anderen VBA-Funktionen:
MsgBox(prompt [, buttons] [, title] [, helpfile, context])Aufforderung ist ein erforderliches Argument. Es enthält die Meldung, die Sie im Dialogfenster sehen. Es kann auch verwendet werden, um die Werte einzelner Variablen anzuzeigen.
Alle anderen Argumente sind optional.
[ Tasten ] - bestimmt, welche Schaltflächen und Symbole in der MsgBox Wenn wir zum Beispiel die Option vbOkOnly dann wird nur die OK Auch wenn Sie dieses Argument nicht angegeben haben, wird diese Schaltfläche standardmäßig verwendet.
[ Titel ] - hier können Sie den Titel des Nachrichtenfeldes angeben.
Wechseln wir von den Worten zur Praxis und beginnen wir mit der Fehlersuche. Um die Meldung anzuzeigen, fügen Sie die folgende Zeile in den Code der Datei GetMaxBetween benutzerdefinierte Funktion vor der Fall Else Betreiber:
MsgBox vMax,, "Anzahl -" & iDas Ergebnis sieht folgendermaßen aus:
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 MsgBox vMax,, "Count -" & i Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween =WorksheetFunction.Max(arrNums) End FunctionDie Verwendung des vMax im Dialogfenster sehen wir, welche Zahlen die Auswahlkriterien erfüllen, so dass wir die größte davon auswählen können. Mit dem Ausdruck "Count -" & I in der Titelleiste geben wir an, wie viele Zahlen wir bereits ausgewählt haben, um den Maximalwert zu bestimmen. Der Zähler wird mit jedem neuen Wert erhöht.
Sobald wir unsere UDF festgelegt haben, wenden wir die folgende Formel auf den Datumsbereich an:
= GetMaxBetween (A1:A6,10,50)
Nachdem Sie die Eingabetaste gedrückt haben, sehen Sie eine Meldung wie in der folgenden Abbildung:
Dies ist die erste Zahl im Bereich A1: A6, die die Kriterien erfüllt: größer als 10, aber kleiner als 50.
Nachdem Sie auf OK geklickt haben, erscheint eine zweite Meldung mit der Zahl 14. Die übrigen Zahlen entsprechen nicht den Auswahlkriterien. Daher beendet sich die Funktion und gibt den größten der beiden Werte, 17, zurück.
Die MsgBox Funktion kann an den wichtigsten Stellen in Ihrer benutzerdefinierten Funktion verwendet werden, um zu steuern, wie sich die Werte einzelner Variablen ändern. Meldungsboxen können sehr nützlich sein, wenn Sie eine große Funktion und viele Berechnungen haben. In diesem Fall können Sie leicht feststellen, in welchem Teil des Codes der Fehler auftritt.
Haltepunkte festlegen und Schritt für Schritt durchführen
Sie können Haltepunkte in den Code Ihrer Funktion einfügen, an denen die Codeausführung angehalten wird. So können Sie den Berechnungsprozess Schritt für Schritt verfolgen. Dabei können Sie sehen, wie sich die Werte der Variablen ändern.
Um einen Haltepunkt hinzuzufügen, setzen Sie den Cursor auf die Zeile mit der Anweisung, in der Sie eine Pause einlegen möchten. Klicken Sie dann mit der rechten Maustaste und wählen Sie Debuggen -> Haltepunkt umschalten oder drücken Sie einfach F9. Sie können auch an der gewünschten Stelle auf den vertikalen grauen Bereich links neben dem Funktionscode klicken.
Es erscheint ein roter Kreis, wie in der Abbildung unten zu sehen ist. Die Codezeile, in der die Berechnung gestoppt wird, ist rot hervorgehoben.
Jetzt wird das VBA-Editor-Fenster geöffnet, wenn die Funktion ausgeführt wird. Der Cursor wird an der Stelle positioniert, an der Sie angehalten haben.
Wenn Sie mit dem Mauszeiger über eine der Variablen im Funktionscode fahren, sehen Sie deren aktuellen Wert:
Drücken Sie F5, um die Berechnung fortzusetzen.
Hinweis: Nach dem Haltepunkt können Sie den Fortschritt der Berechnungen Schritt für Schritt verfolgen. Wenn Sie die Taste F8 drücken, wird nur eine weitere Zeile des VBA-Codes ausgeführt. Die gelbe Linie mit einem Pfeil bewegt sich ebenfalls zur zuletzt ausgeführten Codeposition.
Da die Ausführung der Funktion wieder unterbrochen ist, können Sie die aktuellen Werte aller Variablen der Funktion mit dem Mauszeiger anzeigen.
Das nächste Drücken von F8 bringt uns einen Schritt weiter. Sie können also F8 bis zum Ende der Berechnung drücken. Oder Sie drücken F5, um die Berechnung bis zum nächsten Haltepunkt fortzusetzen.
Tritt ein Fehler auf, wird der Cursor an der Stelle im Code angehalten, an der der Fehler aufgetreten ist. Außerdem wird eine Popup-Fehlermeldung angezeigt. So lässt sich die Ursache des Problems leicht ermitteln.
Die von Ihnen festgelegten Haltepunkte gelten, bis Sie die Datei schließen. Wenn Sie sie wieder öffnen, müssen Sie sie erneut setzen. Nicht gerade die bequemste Methode, meinen Sie nicht?
Dieses Problem kann jedoch gelöst werden: Fügen Sie eine Stopp Anweisung an den erforderlichen Stellen in den Funktionscode einfügen, und Sie können die Programmausführung auf dieselbe Weise anhalten wie bei der Verwendung von Haltepunkten.
Wenn VBA auf eine Stopp Anweisung wird die Programmausführung angehalten und auf Ihre Aktion gewartet. Überprüfen Sie die Werte der Variablen und drücken Sie dann F5, um fortzufahren.
Oder drücken Sie F8, um die Funktion schrittweise wie oben beschrieben auszuführen.
Die Stopp Anweisung ist Teil des Programms und wird daher nicht gelöscht, wie es bei einem Haltepunkt der Fall ist. Wenn Sie mit dem Debuggen fertig sind, entfernen Sie sie selbst. Oder verwandeln Sie sie in einen Kommentar, indem Sie ihr ein einfaches Anführungszeichen (') voranstellen.
Debugging mit dem Operator Debug.Print
Sie können die Debug.Drucken Dies ist nützlich, um die Werte von Variablen zu überprüfen, die sich zyklisch ändern.
Ein Beispiel für die Leistung von Debug.Print sehen Sie auf dem nachstehenden Bildschirmfoto.
Erklärung Debug.Print i, vMax gibt Werte und ihre Ordnungszahlen aus.
Im Sofort-Fenster sehen Sie zwei Zahlen (17 und 14) aus dem gewählten Bereich, der den eingestellten Grenzen entspricht und unter denen das Maximum ausgewählt wird. Die Ziffern 1 und 2 bedeuten, dass die Funktion 2 Zyklen durchlaufen hat, in denen die Zahlen ausgewählt wurden. Wir sehen die Werte der wichtigsten Variablen, wie wir es zuvor mit MsgBox Doch das tat der Funktion keinen Abbruch.
Aufruf einer Funktion aus einer Prozedur
Sie können eine benutzerdefinierte Funktion nicht von einer Zelle im Arbeitsblatt, sondern von einer Prozedur aus aufrufen. In diesem Fall werden alle Fehler im Visual Basic-Editorfenster angezeigt.
So können Sie die benutzerdefinierte Funktion GetMaxBerween aus einer Prozedur heraus aufrufen:
Sub Test() Dim x x = GetMaxBetween(Range ( "A1:A6" ), 10, 50) MsgBox(x) End SubPositionieren Sie den Cursor an einer beliebigen Stelle im Code und drücken Sie F5. Wenn die Funktion keinen Fehler enthält, wird ein Popup-Fenster mit dem Berechnungsergebnis angezeigt.
Im Falle eines Fehlers wird eine entsprechende Meldung im VBA-Editor angezeigt. Die Berechnung wird angehalten und die Codezeile, in der der Fehler aufgetreten ist, wird gelb hervorgehoben. Sie können leicht feststellen, wo und warum der Fehler aufgetreten ist.
Das war's. Jetzt haben Sie Ihr eigenes Add-in erstellt, es zu Excel hinzugefügt und können die UDF darin verwenden. Wenn Sie weitere UDFs verwenden möchten, schreiben Sie den Code einfach im Add-in-Modul im VBA-Editor und speichern Sie ihn.
Das war's für heute. Wir haben verschiedene Möglichkeiten zum Debuggen benutzerdefinierter Funktionen behandelt und gelernt, wie Sie diese in Ihrer Arbeitsmappe verwenden können. Wir hoffen, dass Sie diese Richtlinien hilfreich finden. Wenn Sie Fragen haben, schreiben Sie in die Kommentare zu diesem Artikel.