2009-07-03 8 views
8

Ich habe eine Routine, die tausende Datensätze auf Diskrepanzen untersucht. Dies kann bis zu 5 Minuten dauern, und obwohl ich einen Fortschrittsbalken und eine verstrichene Zeit angegeben habe, bin ich mir nicht sicher, ob ich die Leute dazu ermutigen möchte, den Bericht zu beenden, sollte es länger als erwartet dauern.Wie können Benutzer aus lang laufenden VBA-Aufgaben beendet werden?

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?

Antwort

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. Sehen Sie hier

Stopwatch at DDoE

Normalerweise wird die VB-Motor den Prozessor binden, bis es fertig ist. Mit DoEvents ermöglicht VB jedoch, dass der Prozessor an der nächsten Warteschlange in der Warteschlange arbeitet, und kehrt dann zu VB zurück.

+0

Große Antwort! Wusste nicht, dass du das kannst! – mandroid

+0

Brilliant. Danke Dick. – Lunatik

+0

+1 nette Antwort. Viel Spaß beim Abzeichen :) – brettdj

0

Ich glaube nicht, dass es einen Weg gibt, es so zu machen, als würde es funktionieren wollen. 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önnen auch Ihre Prozedur nach einem Zustand außerhalb von Excel suchen lassen und so lange laufen lassen, wie es stimmt. 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 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 Cludgy.

STRG + Pause funktioniert. Akzeptiere es und gehe weiter. Ein guter 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 dies Code ist, der häufig ausgeführt wird, haben Sie in Betracht gezogen, etwas zu scripten, das es in Zeiten ausführt, in denen ein Mensch den Computer nicht benutzt? 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).

Verwandte Themen