Discussion:
Programmablauf unterbrechen
(zu alt für eine Antwort)
Wolfgang Kutsche
2007-06-11 09:50:01 UTC
Permalink
Hallo NG,

derzeit beschäftige ich mich mit einer Anwendung (Excel mit VBA), die
verschiedene Tabellenblätter mit Berechnungen aus unterschiedlichen
Parametern und Ergebnisblätter mit grafischen Darstellungen anzeigt.
Zwischen dem Wechsel der Tabellenblätter ist eine Wartezeit per VBA eingebaut.
Die Anwendung läuft als Endlosschleife ähnlich einer Dia-Show mit vielen
Beispielrechnungen ab.
Nun möchte ich dem Anwender Gelegenheit geben diese „Dia-Show“
(Endlosschleife) an jeder beliebigen Stelle zu unterbrechen.
Dazu habe ich folgende Frage:
Wie kann ich das laufende VBA-Programm durch Betätigen einer beliebigen
Taste oder Bewegung der Maus unterbrechen?
Derzeit kann ich dies nur durch Drücken der Esc-Taste.
Dabei stört mich in diesem Fall der Anwendung die VBA-Meldung „Die
Ausführung des Codes wurde unterbrochen“.

Ich freue mich über jeden Hinweis.
--
Gruß Wolfgang
WinXP Home SP2, Office 2003 SP2
http://www.wk-bau-edv.de
Martin Worm
2007-06-11 11:23:26 UTC
Permalink
Am Mon, 11 Jun 2007 02:50:01 -0700,schrieb Wolfgang Kutsche:

hallo Wolfgang,
Post by Wolfgang Kutsche
Wie kann ich das laufende VBA-Programm durch Betätigen einer beliebigen
Taste oder Bewegung der Maus unterbrechen?
Derzeit kann ich dies nur durch Drücken der Esc-Taste.
Dabei stört mich in diesem Fall der Anwendung die VBA-Meldung "Die
Ausführung des Codes wurde unterbrochen".
Ich freue mich über jeden Hinweis.
schau mal ob

Application.EnableCancelKey = xlErrorHandler

etwas für dich ist.

mit freundlichen Grüßen

Martin Worm
--
benutze XL 2000 und Win XP SpX
Wolfgang Kutsche
2007-06-11 13:50:01 UTC
Permalink
Post by Martin Worm
hallo Wolfgang,
schau mal ob
Application.EnableCancelKey = xlErrorHandler
etwas für dich ist.
mit freundlichen Grüßen
Martin Worm
--
benutze XL 2000 und Win XP SpX
Hallo Martin,

danke für Deinen Hinweis. Habe es gleich mal ausprobiert.
Mein Code:

Sub DiaShow()
On Error GoTo Unterbrechung
Application.EnableCancelKey = xlErrorHandler
For i = 1 To 1000
For t = 1 To 3
Sheets("Tabelle" & t).Select
WarteZeit = TimeSerial(Hour(Now()), Minute(Now()), Second(Now())
+ 1)
Application.Wait WarteZeit
Next t
Next i
Exit Sub

Unterbrechung:
If Err = 18 Then
Sheets("Tabelle1").Select
MsgBox "Sie haben die Dia-Show unterbrochen"
End If
End Sub

Wenn ich Esc drücke, wird nur der Wartezeit ignoriert … die Diashow beginnt
zu rasen und erst beim 2. Esc drücken erfolgt die Unterbrechnung mit der
Meldung.
Benutze ich statt Esc jedoch Strg + Pause erfolgt die Unterbrechung sofort.

Ich denke, dass eine Unterbrechung des VBA-Programms mit beliebigem
Tastendruck bzw. Mausbewegung nur über ein Script mit AutoHotkey möglich ist.
--
Gruß Wolfgang
WinXP Home SP2, Office 2003 SP2
http://www.wk-bau-edv.de
Martin Worm
2007-06-11 21:22:44 UTC
Permalink
Am Mon, 11 Jun 2007 06:50:01 -0700,schrieb Wolfgang Kutsche:

hallo Wolfgang,
Wenn ich Esc drücke, wird nur der Wartezeit ignoriert ... die Diashow beginnt
zu rasen und erst beim 2. Esc drücken erfolgt die Unterbrechnung mit der
Meldung.
Benutze ich statt Esc jedoch Strg + Pause erfolgt die Unterbrechung sofort.
tatsächlich, merkwürdig. Bug oder Feature?

ich benutze Wait nicht, sondern

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliSeconds As Long)

Sleep 1000

dabei passiert es nicht.
Ich denke, dass eine Unterbrechung des VBA-Programms mit beliebigem
Tastendruck bzw. Mausbewegung nur über ein Script mit AutoHotkey möglich ist.
ich hab mich zu ESC erzogen( hab aber zur Zeit aber keine
langdauernden Makros mehr)

mfG
mit freundlichen Grüßen

Martin Worm
--
benutze XL 2000 und Win XP SpX
stefan onken
2007-06-11 12:46:44 UTC
Permalink
On 11 Jun., 11:50, Wolfgang Kutsche
Post by Wolfgang Kutsche
Hallo NG,
derzeit beschäftige ich mich mit einer Anwendung (Excel mit VBA), die
verschiedene Tabellenblätter mit Berechnungen aus unterschiedlichen
Parametern und Ergebnisblätter mit grafischen Darstellungen anzeigt.
Zwischen dem Wechsel der Tabellenblätter ist eine Wartezeit per VBA eingebaut.
Die Anwendung läuft als Endlosschleife ähnlich einer Dia-Show mit vielen
Beispielrechnungen ab.
Nun möchte ich dem Anwender Gelegenheit geben diese ,,Dia-Show"
(Endlosschleife) an jeder beliebigen Stelle zu unterbrechen.
Wie kann ich das laufende VBA-Programm durch Betätigen einer beliebigen
Taste oder Bewegung der Maus unterbrechen?
Derzeit kann ich dies nur durch Drücken der Esc-Taste.
Dabei stört mich in diesem Fall der Anwendung die VBA-Meldung ,,Die
Ausführung des Codes wurde unterbrochen".
Ich freue mich über jeden Hinweis.
--
Gruß Wolfgang
WinXP Home SP2, Office 2003 SP2http://www.wk-bau-edv.de
hallo Wolfgang,
dummerweise haben Tabellen nicht solche Ereignisse wie die UserForms
(Mousemove, KeyPress usw). Man kann sich mit API GetAsyncKeyState
behelfen.
Hier ein Bsp, um das drücken von Return abzufangen:

Private Declare Function GetAsyncKeyState Lib "user32" _
(ByVal vKey As Long) As Integer
Sub Makro1()
For i = 1 To 100000
Range("A1") = i
If GetAsyncKeyState(vbKeyReturn) <> 0 Then
DoEvents
MsgBox "beendet!"
Exit For
End If
Next
End Sub

Statt Return geht auch linkeMaustaste vbKeyLButton usw (Cursor ins
Wort stellen, F1). Für eine komplette Tastaturüberwachung geht evtl
auch GetKeyboardState, bei Bedarf danach googlen. Die Mausbewegung zu
überwachen ist dann noch aufwändiger und fehlerträchtig, dazu muss man
die Windows-Nachrichten nach WM_MOUSEMOVE "abhören" (nennt sich
subclassing http://www.activevb.de/tutorials/tut_subcls/subcls.html).
Etwas leichter geht es evtl mit einem Trick, wie hier bei Michael zu
finden http://michael-schwimmer.de/vba088.htm

Gruß
stefan
Wolfgang Kutsche
2007-06-11 14:23:00 UTC
Permalink
Hallo Stefan,

vielen Dank für die umfangreichen Hinweise.
Wenn ich damit eine Lösung gefunden habe melde ich mich hier noch einmal.
--
Gruß Wolfgang
WinXP Home SP2, Office 2003 SP2
http://www.wk-bau-edv.de
Post by Martin Worm
hallo Wolfgang,
dummerweise haben Tabellen nicht solche Ereignisse wie die UserForms
(Mousemove, KeyPress usw). Man kann sich mit API GetAsyncKeyState
behelfen.
Private Declare Function GetAsyncKeyState Lib "user32" _
(ByVal vKey As Long) As Integer
Sub Makro1()
For i = 1 To 100000
Range("A1") = i
If GetAsyncKeyState(vbKeyReturn) <> 0 Then
DoEvents
MsgBox "beendet!"
Exit For
End If
Next
End Sub
Statt Return geht auch linkeMaustaste vbKeyLButton usw (Cursor ins
Wort stellen, F1). Für eine komplette Tastaturüberwachung geht evtl
auch GetKeyboardState, bei Bedarf danach googlen. Die Mausbewegung zu
überwachen ist dann noch aufwändiger und fehlerträchtig, dazu muss man
die Windows-Nachrichten nach WM_MOUSEMOVE "abhören" (nennt sich
subclassing http://www.activevb.de/tutorials/tut_subcls/subcls.html).
Etwas leichter geht es evtl mit einem Trick, wie hier bei Michael zu
finden http://michael-schwimmer.de/vba088.htm
Gruß
stefan
Lesen Sie weiter auf narkive:
Loading...