Wie können Benutzer aus lang laufenden VBA-Aufgaben austreten?

8

Ich habe eine Routine, die Tausende von Datensätzen auf Diskrepanzen untersucht. Dies kann bis zu 5 Minuten dauern und obwohl ich einen Fortschrittsbalken und eine verstrichene Zeitanzahl bereitstelle, bin ich mir nicht sicher, ob ich die Leute ermutigen will, den Ctrl-Break zu drücken, um den Bericht zu beenden, sollte es länger dauern als erwartet.

>

Eine Schaltfläche in der Fortschrittsanzeige funktioniert nicht, da das Formular nicht modal ist. Gibt es also eine nette Möglichkeit, Benutzern das Beenden in dieser Situation zu erlauben?

    
Lunatik 03.07.2009, 10:39
quelle

2 Antworten

11

Sie benötigen DoEvents und eine Variable, deren Umfang größer ist als der Umfang dessen, was Sie ausführen. Das heißt, wenn es sich nur um eine Prozedur handelt, benötigen Sie eine Modulebenevariable. Wenn es mehr als ein Modul ist, benötigen Sie eine globale Variable. Siehe hier

Stoppuhr bei DDoE

Normalerweise wird die VB-Engine den Prozessor binden, bis es fertig ist. Mit DoEvents ermöglicht VB jedoch, dass der Prozessor an dem weiter arbeitet, was als nächstes in der Warteschlange ist, und dann zu VB zurückkehrt.

    
Dick Kusleika 06.07.2009, 14:25
quelle
0

Ich glaube nicht, dass es einen Weg gibt, es so zu machen, als ob es funktionieren würde. VBA ist eine Skriptsprache. Wenn Sie Ihre Prozedur starten, wird sie ausgeführt, bis sie fertig ist. Wenn Sie irgendwo eine andere Taste hätten, die Sie sogar während der Ausführung der ursprünglichen Prozedur anklicken würde, bin ich mir nicht sicher, wie Sie diese Prozedur referenzieren und stoppen würden.

Sie könnten etwas wie den Benutzer fragen, ob sie fortfahren möchten, aber das würde es noch länger laufen lassen.

Sie könnten auch Ihre Prozedur nach einem Zustand außerhalb von Excel suchen lassen und so lange weiter laufen, wie es wahr ist. Etwas Einfaches könnte prüfen, ob sich eine bestimmte Textdatei in einem Ordner befindet. Wenn Sie möchten, dass die Prozedur beendet wird, öffnen Sie den Ordner und verschieben Sie die Datei. In der nächsten Iteration Ihrer Schleife wird die Datei nicht mehr angezeigt und nicht mehr ausgeführt. Cludgy, ineffizient und nicht elegant, aber es würde funktionieren. Sie können auch eine Zelle, ein Kontrollkästchen, Radiobutton, im Grunde jedes Steuerelement in einem anderen Excel-Arbeitsblatt, das in einer anderen Excel-Instanz ausgeführt wird, aktivieren. Wieder Cluddy.

STRG + Pause funktioniert. Akzeptiere es und gehe weiter. Ein schöner Trick dabei ist, dass, wenn Sie Ihren Code mit einem Passwort schützen und STRG + Pause drücken, die Debug-Option nicht verfügbar ist und sie nur Continue oder End erhalten.

Wenn es sich um Code handelt, der häufig ausgeführt wird, haben Sie in Betracht gezogen, Skripts zu erstellen, die diesen Code in Zeiten ausführen, in denen ein Benutzer den Computer nicht verwendet? Ich habe Telnet Screen Scraping Makros ausgeführt, die Stunden dauern würden, um durch unsere Widgets zu gehen, aber ich hatte sie immer entweder auf einem separaten Computer laufen lassen oder wenn ich nicht da war (Nächte / Wochenenden).

    
mandroid 03.07.2009 17:06
quelle