VBA (xl 00/02): Abfangen des Speicherns beim Schließen

04/09/2008 - 13:09 von Martin Schell | Report spam
Hi,

habe diesen Workbook-Modul-Code (und leeres Blatt Tabelle1):


Dim saveF As Boolean

1 Private Sub Workbook_BeforeClose(Cancel As Boolean)
2 'weiterer Code [im Test ohne]
3 Me.Save
3a 'Me.Saved = True
4 End Sub

5 Private Sub Workbook_BeforeSave( _
ByVal SaveAsUI As Boolean, Cancel As Boolean)
6 If saveF Then Exit Sub
7 Cancel = True
8 speichern SaveAsUI
9 End Sub

10 Private Sub speichern(ByVal SaveAsF As Boolean)
11 saveF = True
12 Tabelle1.Range("A1") = Tabelle1.Range("A1") + 1
13 'weiterer Code
14 Me.Save
15 saveF = False
16 End Sub

Wenn ich den normalen Speichernbefehl in Excel anklicke, geht alles
wunderbar: In Zelle A1 wird gezàhlt, und es wird korrekt gespeichert.
Anweisungsfolge dabei (per Debug):

A: Zeilen 5-6-7-8-10-11-12-14-5-6-15-16-9

ABER:

Wenn ich im Code (BeforeClose) Me.Save aufrufe, passiert beim Ausführen des
Schließenbefehls dieses:

B: Zeilen 1-3-5-6-7-8-10-11-12 -14- 15-16-9-4

Er springt also nicht wie zuvor beim Speichern bei 14 wieder zu BeforeSafe!

Nach 4 erscheint der Exceldialog 'Soll gepeichert werden'.

Klicke ich hier auf Ja, durchlàuft er exakt die Zeilenfolge A und hat danach
korrekt gespeichert. Allerdings erscheint der Seichern-Dialog danach erneut,
und so geht es immer weiter, wenn ich Ja klicke.

Klicke ich auf Nein, wird die Mappe sofort geschlossen. Wenn ich zuvor nicht
wenigstens ein Mal auf Ja geklickt hatte, wurde auch nicht gespeichert.

Aktiviere ich Zeile 3a, erscheint der Dialog nicht, und die Mappe wird
sofort geschlossen. Allerdings wurde sie NICHT gespeichert, da er ja in
Zeilenfolge B nicht wieder zu BeforeSave zurückspringt.

Wie kann ich das Problem lösen? Was mache ich falsch, was weiß ich nicht?

Danke für jede Hilfe

Gruß Martin
 

Lesen sie die antworten

#1 Martin Schell
04/09/2008 - 14:14 | Warnen spam
Nachtrag: Zum besseren Testen den Code nochmal ohne Zahlen:

Dim saveF As Boolean

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Me.Save
'Me.Saved = True
End Sub

Private Sub Workbook_BeforeSave(_
ByVal SaveAsUI As Boolean, Cancel As Boolean)
If saveF Then Exit Sub
Cancel = True
speichern SaveAsUI
End Sub

Private Sub speichern(ByVal SaveAsF As Boolean)
saveF = True
Tabelle1.Range("A1") = Tabelle1.Range("A1") + 1
Me.Save
saveF = False
End Sub

Ähnliche fragen