Ist es besser, ProgressBar UserForms in VBA als modal oder modeless zu zeigen?

8

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!

    
Kuyenda 30.01.2010, 23:47
quelle

4 Antworten

1

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.

    
Kuyenda 02.02.2010, 16:53
quelle
3

Es gibt auch eine dritte Möglichkeit, die Application.StatusBar zu verwenden. Sie können sogar einen echten Fortschrittsbalken simulieren, indem Sie eine Folge von U + 25A0- und U + 25A1-Zeichen verwenden.

    
GSerg 31.01.2010 00:29
quelle
1

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.

    
Anonymous Type 29.11.2010 00:24
quelle
1

Ich denke, dass das anfängliche Thema der Antwort wert ist, da die Frage so gut formuliert wurde, dass Google sie zuerst findet.

Abschnitt 1 - Theorie

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.

  1. Die Funktion, in der der routinemäßigste Prozess ausgeführt wird, befindet sich nicht im UserForm-Modul
  2. Sie können das Fenster mit Fortschrittsbalken von überall und
  3. aufrufen
  4. Die einzige Verbindung zwischen der Routinefunktion / Prozedur sind die globalen Variablen

Dies ist ein großer Vorteil, hier vielseitig einsetzbar zu sein.

Abschnitt 2 - Praxis

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%     
user2664434 08.08.2013 15:31
quelle