Manchmal gibt Excel einfach die folgende Meldung aus: „Excel funktioniert nicht mehr. Wir entschuldigen uns für jegliche Unannehmlichkeiten."
Wenn Sie eine solche Nachricht erhalten, drücken Sie möglicherweise Strg + Alt = "" + Löschen und öffnen Sie die Arbeitsmappe erneut (hoffentlich nachdem Sie die von Ihnen geleistete Arbeit gespeichert haben!), Um den Code zu durchlaufen und die fehlerhafte Anweisung zu finden. Wenn Sie den Code in einem Schritt durchlaufen, funktioniert möglicherweise alles einwandfrei. Wenn Sie ihn jedoch mit voller Geschwindigkeit ausführen, kann er erneut abstürzen. Wie können Sie die beleidigende Aussage finden?
Sie können eine einfache Codezeile zwischen jede Codezeile schreiben, die der Schuldige sein könnte. Der VBA-Code könnte also ursprünglich ungefähr so aussehen:
Sub UICreation() Dim x As String On Error Resume Next x = Sheets("Scenario").Name If Err.Number 0 Then MsgBox "Current workbook needs to have a Scenario sheet!", vbCritical Exit Sub End If ActiveWorkbook.Unprotect WorkbookPassword Err.Clear ActiveWorkbook.Unprotect SheetPassword If Err.Number 0 Then MsgBox "Workbook cannot be unprotected by the macro.", vbCritical Exit Sub End If Application.OnTime Now, "More" ThisWorkbook.Sheets("FastPricer").Copy Before:=ActiveWorkbook.Sheets(1) End Sub
Diese Prozedur stürzt zwar nicht ab, zeigt jedoch, was Sie tun können, wenn Sie feststellen, dass der Code abstürzt, wenn er mit voller Geschwindigkeit ausgeführt wird, aber nicht, wenn Sie ihn durchlaufen.
Sie ändern den obigen Code in diesen Code mit den eingefügten Anweisungen Bug 1, Bug 2 usw.:
Sub UICreation() Dim x As String On Error Resume Next Bug 1 x = Sheets("Scenario").Name Bug 2 If Err.Number 0 Then MsgBox "Current workbook needs to have a Scenario sheet!", vbCritical Exit Sub End If Bug 3 ActiveWorkbook.Unprotect WorkbookPassword Err.Clear Bug 4 ActiveWorkbook.Unprotect SheetPassword If Err.Number 0 Then MsgBox "Workbook cannot be unprotected by the macro.", vbCritical Exit Sub End If Bug 5 Application.OnTime Now, "More" Bug 6 ThisWorkbook.Sheets("FastPricer").Copy Before:=ActiveWorkbook.Sheets(1) End Sub
Hier ist die Fehlerprozedur:
Sub Bug(num As Integer) SaveSetting "EOTB2", "EOTB2", "EOTB2", num End Sub
Diese Prozedur speichert einen Wert in der Registrierung. Die Syntax für SaveSetting lautet:

Angenommen, Sie verwenden für die ersten drei Parameter EOTB2 (für Excel außerhalb der Box 2) - eine zufällige Auswahl. Sie können stattdessen SaveSetting "X", "X", "X", num verwenden. Wenn Sie dies häufig verwenden, können Sie die drei Ebenen AppName, Section und Key nutzen. Auf diese Weise können Sie, wenn Sie viele Abschnitte im AppName haben, die Registrierung für alle Ihre Einstellungen mit der einfachen DeleteSetting "EOTB2" (oder was auch immer Sie für AppName festlegen) bereinigen. Alle Abschnitte und Schlüssel werden ebenfalls gelöscht.
Jetzt führen Sie die Prozedur mit voller Geschwindigkeit aus und sie stürzt ab. Sie starten Excel neu, rufen die VBE auf, öffnen das Sofortfenster (durch Drücken von Strg + G) und geben Folgendes ein:
? GetSetting(“EOTB2”,”EOTB2”,”EOTB2”)
Wenn diese Prozedur beispielsweise 4 zurückgibt, stürzte sie irgendwann nach Fehler 4 ab. Es ist unwahrscheinlich, dass der If / End If-Abschnitt der Schuldige war. Wahrscheinlicher war es ActiveWorkbook.Unprotect SheetPassword. (Denken Sie daran, dass dies nur ein Beispiel ist und nicht das, was tatsächlich passiert ist.)
Wenn Ihre erste Ausführung von Bug 1, Bug 2 usw. zeigt, dass die Prozedur in einem großen Codeabschnitt nach Bug x abgestürzt ist, können Sie weitere Bug-Aufrufe einfügen, um sie weiter einzugrenzen. Sie führen eine binäre Suche in einem langen Verfahren durch, um den Schuldigen zu finden.

Dieser Gastartikel stammt von Excel MVP Bob Umlas. Es ist aus dem Buch More Excel Outside the Box. Klicken Sie hier, um die anderen Themen im Buch anzuzeigen.