ich m�chte eine Sub A in ThisWorkbook WB ausf�hren, und zwar nur dann,
bevor das WB manuell gespeichert und geschlossen wurde, unabh�ngig
davon, wie und in welcher Reihenfolge der Nutzer den Schlie�en- und
Speichernbefehl ausf�hrt (Symbolleiste, Men�, Kreuz rechts oben ...).
Wenn WB nur gespeichert wird und offen bleibt
ODER
wenn WB geschlossen wird ohne es zu speichern,
dann soll die Sub A nicht ausgef�hrt werden.
Sub A nimmt keine �nderungen am Workbook vor, macht ein vorheriges
Speichern also nicht zunichte.
Ich habe mit BeforeSave und BeforeClose experimentiert und bin zu keinem
vern�nftigen Ergebnis gekommen.
- Erfolgt der Aufruf von A in BeforeSave, wird A auch ausgef�hrt, wenn
WB hinterher nicht geschlossen wird.
- Erfolgt der Aufruf von A in BeforeClose, wird A auch ausgef�hrt, wenn
WB vorher nicht gespeichert wurde. Die Abfrage 'If ThisWorkbook.Saved =
False' in BeforeClose brachte auch nichts, da BeforeClose offensichtlich
schon nach Bet�tigung des Schlie�en-Befehls ausgef�hrt wird. Die Frage
nach Speichern kommt evtl. erst danach.
Mit anderen Worten: A soll erst ausgef�hrt werden, wenn der User dem
Programm bereits gesagt hat: "CloseFile Save=Yes". Wie finde ich diesen
Moment?
Gru�
J�rg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
activeworkbook.before_close
nochmal:
speichern = inputbox ("speichern? ja/nein eingeben. leer für abbruch")
' initial ja. weis gerade nicht, an welche stelle es muss.
' Speichern nein
if lcase(speichern) = "nein" then ' lcase, falls einer groß
schreibt...
workbook.close savechanges=false
goto ende
end if
' wenn leer = abbruch
if speichern <> "" then
exit sub
end if
' wenn nicht ja, nein oder leer...
if lcase(speichern) <> "nein" then
goto nochmal
end if
' sonst normaler ablauf
workbook.save
ende:
end sub
und das in die before close. dann sollte er nicht nach speichern
fragen, da er gerade gespeichert hat (oder aber abgebrochen bei leer
und zugemacht ohne speichern bei nein.
achtung. nicht getestet. sag mal bitte bescheid, ob es geklappt hat.
grüße aus münchen.
> ich m�chte eine Sub A in ThisWorkbook WB ausf�hren, und zwar nur dann,
>
> bevor das WB manuell gespeichert und geschlossen wurde, unabh�ngig
> davon, wie und in welcher Reihenfolge der Nutzer den Schlie�en- und
> Speichernbefehl ausf�hrt (Symbolleiste, Men�, Kreuz rechts oben ...).
Dann ist BeforeClose das einzig m�gliche Ereignis.
> Mit anderen Worten: A soll erst ausgef�hrt werden, wenn der User dem
> Programm bereits gesagt hat: "CloseFile Save=Yes". Wie finde ich diesen
> Moment?
Indem Du �nderungen-Speichern-Abfrage von Excel immitierst und die
Kontrolle �bernimmst.
Andreas.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Antwort As VbMsgBoxResult
If Not ThisWorkbook.Saved Then
Antwort = MsgBox("Sollen Ihre �nderungen in '" & _
ThisWorkbook.Name & "' gespeichert werden?", _
vbYesNoCancel + vbExclamation)
Select Case Antwort
Case vbYes
'Hier die Sub ausf�hren
ThisWorkbook.Save
Case vbNo
ThisWorkbook.Saved = True
Case vbCancel
Cancel = True
End Select
End If
End Sub
Andreas und Michlchen,
Ihr habt mir sehr geholfen. Vielen Dank.
Das Problem, was bei Euren L�sungen noch auftrat, war, dass der User ja
erst auf Speichern und dann auf Schlie�en klicken kann. In diesem Fall
soll nat�rlich nicht noch einmal nach Speichern gefragt werden (wird bei
Andreas abgefangen), die Sub A soll aber ausgef�hrt werden.
Wenn die Datei nur ge�ffnet und unver�ndert geschlossen wird, soll nicht
abgefragt, nicht gespeichert und Sub A nicht ausgef�hrt werden. Ich
musste also ermitteln, ob der _User_ die Datei nach dem �ffnen noch
einmal gespeichert hat.
Das habe ich mit einer Public Variablen gemacht, die in BeforeSave
gesetzt wird:
Public blSavedByUser As Boolean
Private Sub Workbook_BeforeSave(...)
blSavedByUser = True
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Antwort As VbMsgBoxResult
'Wenn vor dem Schlie�en durch _User_ gespeichert wurde
If ThisWorkbook.Saved = True And blSavedByUser = True Then
'Hier die Sub ausf�hren
MsgBox "Sub A"
Else 'wenn nicht durch User gespeichert wurde
If Not ThisWorkbook.Saved Then
Antwort = MsgBox("Sollen Ihre �nderungen in '" & _
ThisWorkbook.Name & "' gespeichert werden?", _
vbYesNoCancel + vbExclamation)
Select Case Antwort
Case vbYes
'Hier die Sub ausf�hren
MsgBox "Sub A"
ThisWorkbook.Save
Case vbNo
ThisWorkbook.Saved = True
Case vbCancel
Cancel = True
End Select
End If
End If
End Sub
So funktioniert es f�r mich perfekt. Nochmals Danke.