Ist es besser, ProgressBar UserForms in VBA als modal oder modeless anzuzeigen? Was sind die besten Methoden zur Entwicklung von Fortschrittsanzeigen in VBA?
Modale UserForms erfordern die Verwendung von Application.Interactive = False
, während Modal UserForms von Natur aus jede Interaktion mit der Anwendung blockieren, bis die Kernprozedur beendet oder abgebrochen wurde.
Wenn Application.Interactive = False
verwendet wird, unterbricht der Esc-Schlüssel jedoch die Codeausführung, daher ist die Verwendung von Application.EnableCancelKey = xlErrorHandler
und die Fehlerbehandlung ( Err.Number = 18
) sowohl in der UserForm als auch in der aufrufenden Prozedur erforderlich.
Ressourcenintensive Aufrufverfahren können auch dazu führen, dass CommandButton_Click
und UserForm_Activate
Ereignisse in nicht modalen UserForms fehlschlagen.
Im Allgemeinen scheinen Fortschrittsanzeigen, die modale UserForms verwenden, einfacher zu sein, da der Code, der ausgeführt wird, vollständig im UserForm-Modul enthalten ist und die Übergabe von Variablen weniger erforderlich ist.
Das Problem bei der Verwendung von modalen UserForms für Fortschrittsindikatoren ist jedoch, dass für jede Prozedur, die eine Fortschrittsanzeige benötigt, ein separates UserForm-Modul erforderlich ist, da die aufrufende Prozedur innerhalb der UserForm_Activate-Prozedur sein muss.
Es ist zwar möglich, einen einzelnen wiederverwendbaren Fortschrittsanzeiger in einer nicht modalen UserForm zu haben, es ist jedoch weniger zuverlässig als die Ausführung des Codes innerhalb mehrerer modaler UserForms.
Welcher Weg ist besser?
Danke!
Ich werde das hier schließen und sagen, dass Modal der Gewinner ist. Ich habe beide Möglichkeiten ausprobiert, aber am Ende versuchst du zu viele Schlupflöcher mit modelosen Benutzerformen zu schließen. Modal ist schwieriger, weil es strenger ist, aber es ermutigt Sie, Ihren Code in kleinere Stücke aufzuteilen, was auf lange Sicht sowieso besser ist.
Definitiv Modal. Wenn Sie Modeleless betrachten, sollten Sie es auf einem separaten Out-of-Process-Thread und nicht auf dem Excel.exe-Hauptthread ausführen.
Ich denke, dass das anfängliche Thema der Antwort wert ist, da die Frage so gut formuliert wurde, dass Google sie zuerst findet.
Als Erstes zu sagen ist, dass die Übertragung der Variablen zwischen den Modulen überhaupt nicht schwierig ist.
Sie müssen nur ein separates Modul erstellen und dort alle globalen Variablen einfügen. Dann können Sie sie überall in allen Formen, Blättern, Modulen lesen.
Die zweite Sache ist, dass das Fenster MODELESS sein soll. Warum das? Die Antwort lautet , um die Mobilität des Codes zu erhalten , d. H.
Dies ist ein großer Vorteil, hier vielseitig einsetzbar zu sein.
1) Erstellen Sie ein Modul "Deklaration" mit den globalen Variablen:
Öffentlicher StopForce als Ganzzahl 'Diese Variable wird als Indikator dafür verwendet, dass der Benutzer die Abbrechen-Taste gedrückt hat
Öffentlicher PCTDone als Single "Dies ist der Prozentsatz der Arbeit, die bereits geleistet wurde
Öffentlicher CurrentFile als String 'Jeder andere Parameter, den wir in das Formular übertragen möchten.
2) Erstellen Sie das Formular mit der Schaltfläche. Im OnClick-Ereignis der Schaltfläche sollte ein Code sein, in dem wir auf die globale Variable StopForce im Deklaration -Modul
verweisen %Vor%3) Fügen Sie eine Prozedur hinzu, in der Sie die Fortschrittsanzeige aktualisieren
%Vor%4) In jedem anderen Modul müssen wir die Funktionen oder die Prozedur / Unterstelle haben, wo die Routine ausgeführt wird:
%Vor%Tags und Links vba modal-dialog userform progress-indicator modeless