Anzeige
Archiv - Navigation
1352to1356
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

EnableCancelKey

EnableCancelKey
25.03.2014 08:58:52
Berny
Hallo Excel-Speziallisten,
Hintergrund:
Ich habe ein Modul geschrieben zum Durchsuchen von Mappen welche ich ggf. abbrechen möchte wenn ich glaube das gewünschte gefunden zu haben. Ich darf das Modul aber nicht zu jeder Zeit abbrechen, da sonst eine der Mappen unzulässiger Weise Manipuliert werden könnte. Deshalb soll bei Abbruch eine bestimmte Routine ablaufen.
Da dieses Modul viel zu komplex ist um es ins Forum zu stellen habe ich versucht mein Problem auf ein einfaches Demo zu reduziere. (s.u.)
Problem:
Wenn ich nun dieses Demo laufen lasse und dabei die ESC-Taste betätige wird nicht wie ich erwartet habe zur Fehlerroutine gesprungen sondern das Modul beschleunigt abgearbeitet.
Was ist hier falsch?
Sub AbbruchTest()
On Error GoTo fehler
Application.EnableCancelKey = xlErrorHandler
For I = 1 To 10
Application.Wait (Now + TimeValue("0:00:01"))
Cells(1, 1) = I
Application.StatusBar = I
Next
'On Error GoTo fehler
'Application.EnableCancelKey = xlErrorHandler
For I = 1 To 10
Application.Wait (Now + TimeValue("0:00:01"))
Cells(1, 2) = I & " zweite Schleife"
Application.StatusBar = I & "zweite Schleife"
Next
Cells(1, 1).Interior.ColorIndex = 4
Application.StatusBar = ""
Exit Sub
fehler:
'Application.EnableCancelKey = 0
Application.Wait (Now + TimeValue("0:00:01"))
MsgBox "Abbruch"
Application.StatusBar = ""
End Sub
M.f.G.
Berny

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: EnableCancelKey
25.03.2014 17:36:57
fcs
Hallo Berny,
ich hab jetzt einiges ausprobiert und rumgesucht.
Das Problemkind in deiner Testprozedur sind die Application.Wait-Anweisungen.
Sie harmonieren nicht mit den Änderungen zu den Einstellungen für die ESC-Taste.
Auch andere Ereignismakros, wie z.B. WorkSheet_Change sind schwierig mit zu erfassen.
Deshalb sollten während der Umschaltung der ESC-Taste auf Fehlerroutine die Ereignismakros auch deaktiviert werden.
Ich hab jetzt mal mit dem folgenden Konstrukt getestet.
Die 1. Schleife kann nicht unterbrochen werden.
Die 2. Schleife endet bei ESC in der Fehlerbehandlung.
Dabei ist wichtig, dass ggf. aufgerufene Untermakros/Functions bei ESC-Taste einen Wert an die Hauptprozedur zurückgeben, so dass nach Prüfung in die Fehlerbehandlung verzweigt wird.
Noch ein Hinweis:
Wenn Dateien durchsucht und nicht unzulässig geändert werden dürfen, dann sollte man diese im Code wenn möglich schreibgeschützt öffnen und nach Benutzung ggf. schließen ohne zu speichern.
Gruß
Franz
Sub AbbruchTest()
Dim I, strMsg As String
'  MsgBox "EnableCancelKey = " & Application.EnableCancelKey _
& " = Status zu Beginn des Makros, sollte sein : 1 = xlInterrupt"
On Error GoTo Fehler
Application.EnableEvents = False 'Ereignismakros deaktivieren
Application.EnableCancelKey = xlDisabled 'ESC-Taste wird deaktiviert
Cells(1, 1).Interior.ColorIndex = xlColorIndexNone
Cells(1, 2).Interior.ColorIndex = xlColorIndexNone
Cells(1, 2).ClearContents
strMsg = " - erste Schleife"
For I = 1 To 3000
Cells(1, 1) = I
Application.StatusBar = I & strMsg
Next
Cells(1, 1).Interior.ColorIndex = 6
Application.EnableCancelKey = xlErrorHandler 'ESC-Taste löst Fehlerbehandlung aus
strMsg = " - zweite Schleife"
For I = 1 To 5000
Cells(1, 2) = I
Application.StatusBar = I & strMsg
'Aufuf einer weiteren Function
Select Case fncTest(Zelle:=Cells(1, 2))
Case 0
'Alles OK
Case 18
strMsg = " - User-Abbruch in Function ""fncTest"""
Err.Raise 18
Case Else
strMsg = "Sonstiger Fehler-Nr. in Function ""fncTest"""
Err.Raise 9999, Description:=strMsg
End Select
Next
Cells(1, 2).Interior.ColorIndex = 4
Fehler:
With Err
Select Case .Number
Case 0 'Alles ok
Case 18 'ESC-Taste wurde gedrückt
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description & vbLf & vbLf & "Abbruch" &  _
strMsg, _
vbOKOnly, "Makro: Abbruch"
'hier dann die Routine zur Bearbeitung der speziellen Mappe(n)
Case 9999
MsgBox "Fehler-Nr.: " & vbLf & .Number & .Description, , "Makro: Abbruch"
Case Else 'Sonstiger Fehler
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description, , "Makro: Abbruch"
End Select
End With
'!!!!! Wichtig: Anwendungseinstellungen zurücksetzen !!!!
Application.EnableCancelKey = xlInterrupt 'ESC wird wieder aktiviert
Application.StatusBar = False
Application.EnableEvents = True 'Ereignismakros wieder aktivieren
'MsgBox "EnableCancelKey = " & Application.EnableCancelKey & " =  xlInterrupt"
End Sub
Private Function fncTest(Zelle As Range) As Long
On Error GoTo Fehler
Dim I As Long
'Warte-Schleife
For I = 1 To 80000
Next
Err.Clear
Fehler:
fncTest = Err.Number
End Function

Anzeige
AW: EnableCancelKey
26.03.2014 08:25:56
Berny
Hallo Franz,
vielen Dank für deine Arbeit.
Hier sind viele nützliche Informationen enthalten, die ich erst einmal in meinem "echten Modul" verarbeiten muss. Ich vermute nun das diverse Ereignisse wie SelectionChange; Change; Workbook Activate bei mir die Probleme verursachen. Auch die Fehlerbehandlung in Functions und deren Rückgabe zum Hauptmodul finde ich sehr interessant. Hier muss ich noch viel lernen.
M.f.G.
Berny

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige