2017-05-20 4 views
1

Ich habe mich gefragt, ob es eine klügere/genauere Methode zum Debuggen von Benutzerform-Initialisierungen in VBA gibt, die von einem bestimmten Modul aufgerufen werden.Genaues Debuggen eines aufgerufenen Benutzerformulars in VBA Excel 2016

Da, wenn ich ein fehlerhaftes Stück Code in der Userform_initialisize, schreibe ich den Fehler, den ich einen Fehler angibt, aber nicht wo es auftritt, das markierte Stück Code ist einfach call Userform_intitialize und ich bin raten, welches Stück Code in Sub Userform_intitialize enthält den Fehler.

Inkrementelles Erstellen eines Benutzerformulars mit Testläufen nach jeder kleinen Codeerweiterung funktioniert effektiv, um einen stabilen Initialisierungscode für die Benutzerform zu erstellen. Weil ich weiß, was ich seit dem letzten erfolgreichen Lauf geändert habe, aber es würde eine Menge Zeit sparen, wenn ich sofort weiß, wo der Fehler auftritt, besonders in Fällen, in denen Probedurchläufe viel Zeit verbrauchen.

So gibt es Möglichkeiten zu extrahieren, in welcher Zeile der genaue Fehler innerhalb einer aufgerufenen Sub Userform_intitialize in VBA Excel 2016 auftritt?

+1

Sie können einen Haltepunkt am Anfang von 'Userform_initialize' platzieren und Schritt für Schritt mit' F8' ausführen. Allerdings bin ich ein wenig verwirrt, warum nennst du explizit 'Userform_intialisieren'; Dieser Code wird automatisch aufgerufen (wie ein Konstruktor oder Initialisierer des Formulars), wenn das Benutzerformular geladen wird. Sie sollten es nicht explizit (nach Regeln guter Praxis) nennen. –

+0

Wow, danke! Ich fühle mich wie ein Radfahrer, der endlich ziehen kann; anstatt den versteckten Code intuitiv zu verbessern, kann ich einfach sehen, was passiert! So ein Augenöffner :) Ich muss zuerst Berechnungen basierend auf Sheet-Eingabe, die Form (die Anzahl der Textfelder z. B. in) das Benutzerformular, so dass es eine dynamische Benutzerform ist. Ich hatte Schwierigkeiten mit der gesamten dynamischen Ladung und Initialisierung, also endete ich mit dieser Konstruktion. Aber ich verstehe den Punkt, ich muss mit der exakten Hierarchie/Reihenfolge der (Erstellung der) Benutzerform mehr üben. Danke für das Teilen @ A.S.H! –

+1

Ich verstehe deinen Standpunkt. In diesem Fall würde ich eine separate Routine machen, die das Formular dynamisch "neu initialisiert/neu berechnet", und diese Routine kann von jedem Ort sowie von "Userform_initialize" aufgerufen werden. Letzterer sollte zuerst eine anfängliche Konstruktion durchführen und dann die separate Routine aufrufen. Diese Art der Trennung von Verantwortlichkeiten ist sehr vorteilhaft. –

Antwort

1

Als @ A.S.H bereits erwähnt, sollte der Handler von Initialize Ereignis private bleiben. Das ist, weil das Ereignis Initialize selbst privat ist, so dass es von den Instanzen selbst und nicht von jemand anderem behandelt werden soll.

So gibt es Möglichkeiten , in der Linie die genaue Fehler tritt innerhalb eines genannten Sub Userform_intitialize in vba Excel 2016 zu extrahieren?

Zu Ihrer Frage, ja, es ist noch möglich, die Zeilennummer, wo der Fehler aufgetreten ist zu extrahieren. Die Zeilen müssen jedoch Teil des Quellcodes sein. Dann kann die Funktion VBA.Information.Erl verwendet werden, um die Zeilennummer zu erhalten. Beispiel:

Userform Modul

Option Explicit 

Private Const MODULE_NAME As String = "MyUserForm." 

Private Sub UserForm_Initialize() 
    On Error GoTo Error_In_UserForm_Initialize 

1 Const procName As String = "UserForm_Initialize" 

    ' Some code here 
2 Dim d As Date 
3 d = Now 
4 MsgBox "Hi from my userform! 'Now' is '" & d & "'", vbInformation, "Info" 

    ' Here error occures, max. value of Integer is 32.767 
5 Dim i As Integer 
6 i = 40000 

7 Exit Sub 

Error_In_UserForm_Initialize: 
8 Dim errorDescription As String 
9 With Err 
10  errorDescription = "Error '" & .Number & "'" & _ 
          " with description '" & .Description & "'" & _ 
          " occured in procedure '" & MODULE_NAME & procName & "'" & _ 
          IIf(Erl <> 0, " on line '" & CStr(Erl) & "'.", ".") 
11 End With 
12 MsgBox errorDescription, vbCritical, "Error" 
End Sub 

Einige zusätzliche Messwerte über Erlhere oder here.

Verwandte Themen