Nicht-modales Formular, das immer noch Pausen, die code-Ausführung
Ist es eh schon ein Benutzerformular, das wirkt ungebunden, während die immer noch anhalten-Ausführung von code, wie Sie ein Formular modal?
Ich würde gerne die userform zu zeigen, aber immer noch erlauben, die Interaktion mit dem übergeordneten Programm. Modale Formulare block Interaktion mit dem übergeordneten Programm. Ein nicht modales Formular funktionieren würde, aber ich möchte die Ausführung von code zu pausieren, während die form liegt.
Ich habe gearbeitet, um dieses durch die Schaffung einer unendlichen Schleife, die prüft ob das Formular sichtbar ist, aber das scheint mir ein bisschen hacky.
Public Sub GetFormInfoAndDoStuff
ufForm.show vbModeless
Do while ufForm.Visible
DoEvents
Loop
' Do other stuff dependent on form
End Sub
BEARBEITET, um zu klären, dass der code nach .Karte existiert, die muss ausgeführt werden, nachdem das Formular fertig ist
UserForm_Terminate event.
InformationsquelleAutor lfrandom | 2013-05-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie in der Lage sein, die form anzuzeigen, wie
vbModeless
und nur code ausführen, wenn Sie speziell gefordert, d.h., aus einerCommandButton
oder andere Steuern.Dann lassen Sie das Formular sichtbar/angezeigt, bis Sie explizit geschlossen, über die "X" - Taste oder über ein anderes Steuerelement, die fordert, die
UserForm_Terminate
Veranstaltung.Um dies zu erreichen, müssen Sie möglicherweise verschieben Sie einige Ihrer ausführbaren code in einem anderen Unterprogramm und/oder Modul, und diese Unterroutine aufrufen zum Beispiel von einer
CommandButton_Click
Veranstaltung.Haben Sie schon ein Unterprogramm, dass irgendwo eine Zeile enthält wie:
Damit das Formular korrekt angezeigt wird, um Benutzer zu erlauben-input für die übergeordnete Anwendung.
Die Sie nicht wirklich brauchen, um beliebigen code in die oben genannten Modul. Wir werden uns mit den anderen code in anderen Modulen/subs, und dann nennen Sie es von der Benutzer-Steuerelemente wie Befehlsschaltflächen.
Beispiel:
Nehmen Sie alle Ihre ausführbaren code, und legen Sie es in einem anderen Unterprogramm (und wenn es für Ihre organisatorische Präferenz, einem anderen Modul), wie:
Auf die UserForm, fügen Sie eine command-Schaltfläche, und weisen Sie den folgenden code:
Nun, die form wird so lange angezeigt, bis der Benutzer klickt auf die Schaltfläche "X". Code wird nur ausgeführt, wenn der Aufruf von der Kommando-Taste.
EDIT ZUR KLARSTELLUNG
Brauchen Sie nicht, um "pause" die Ausführung dieser Methode. Ausführung endet, wenn das Formular angezeigt wird modelessly, und die form bleibt bestehen. Das Objekt verfügt über einige Ereignisse, die Sie möglicherweise verwenden, um trigger die weitere Ausführung von code.
Ich glaube, Sie brauchen, um reoganize code. Ich habe derzeit eine Anwendung mit über 50 code-Module, die mehrere hundert Unterroutinen und Funktionen 6 Benutzer Formulare mit Hunderten von form-Feldern, verteilt auf jene Formen, und ein Klasse-Modul für Events. Alles, was in meiner Anwendung ist abhängig von der form Eingänge zur Ausführung anderer Subroutinen und Funktionen. Die Philosophie ist es, lassen Sie das Formular um ein Formular, und verwenden Sie andere Subroutinen und Funktionen, um Vorgänge auf Ihre Arbeitsmappe, etc.
Wenn ich einfach ein nicht-modales Formular, das code unter der .zeigen Sie führt direkt nach anzeigen des Formulars. Dies ist genau, warum Sie benötigen, senden Sie Ihre executable - code in anderen Modulen und Subroutinen, und nur rufen die Unterprogramme werden, wenn angemessen.
Sie könnten sogar rufen Sie Ihren ausführbaren code aus der
UserForm_Terminate
event-handler.Ich bekomme, was Sie sagen, aber vom flow Standpunkt aus, muss ich den code in mein Hauptprogramm. Grundsätzlich ist die user-form ermöglicht dem Benutzer zu wählen, eine Anwendung, aber in einigen Fällen, wir geben Ihnen eine neue Anwendung. Der main sieht aus wie, Wenn nicht NewPerson dann Set Anwendung = GetPersonApplication wo GetPersonApplication ist diese form.
InformationsquelleAutor David Zemens
Hier ist, was ich Tue.
Dieses Beispiel ist für eine form, die ich rief "Finden-Header". Der code versucht zu finden, mehrere Spaltenüberschriften, aber die Marker sind ein paar von Ihnen kann fehlen (und die header-text kann überschrieben worden mit etwas Zufall), so dass ich vielleicht eine pause benötigen, und bitten Sie den Benutzer suchen (klicken Sie auf) einige der überschriften für mich:
Zuerst, setzen Sie diese Deklaration in einem standard-Modul:
Dann, setzen Sie diese in der event-Prozedur für jede Schaltfläche oder einem anderen Steuerelement, das entlässt nicht modale Dialogfeld, wie die Click-Ereignisse für das Formular die Schaltflächen OK und Abbrechen:
Dann setzen Sie diese überall in Ihrem code, den Sie möchten, um zu zeigen, das nicht-modale Formular bei Pause für die Benutzer-Interaktivität:
Ja, es dreht sich um die CPU, so dass Sie vielleicht nicht wollen, es zu tun, wenn Sie auf einem single-core-Prozessor und es sind äußerst wichtige Prozesse im hintergrund laufen. Es funktioniert aber; der Benutzer ist in der Lage, um leicht und problemlos mit Excel interagieren, während das nicht-modale Formular angezeigt. Der Benutzer fühlt sich nicht wie Sie kämpfen einen endlosen loop.
InformationsquelleAutor Greg Lovern