VBA: BeforeClose-Event bei SaveAs/Speichern unter

08/10/2008 - 13:37 von Martin Schell | Report spam
Hallo,

habe eine .XLT und daraus erstellte .XLS-Dateien. In beiden Fàllen müssen
beim Schließen unbedingt Bereinigungen durchgeführt werden.

Das geht normalerweise per BeforeClose-Ereignis. Wird jedoch der Befehl
Speichern unter bzw. in VBA SaveAs aufgerufen, wird die ursprüngliche Datei
sofort geschlossen, offenbar ohne dass BeforeClose oder ein anderes Event
feuert, und bleibt so unbereinigt und inkonsistent auf der Festplatte.

Wie könnte ich erreichen, dass auch bei Speichern unter/SaveAs die
Bereinigung der ursprünglichen Datei durchgeführt wird?

Danke im Voraus

Martin
 

Lesen sie die antworten

#1 Martin Schell
09/10/2008 - 15:00 | Warnen spam
Hallo,

ok, hab's kapiert: Auf den zweiten Blick wirklich ein bißchen wenig Info.
(Bin kein geübter NG-User)

habe eine .XLT und daraus erstellte .XLS-Dateien. In beiden Fàllen müssen
beim Schließen unbedingt Bereinigungen durchgeführt werden.

Das geht normalerweise per BeforeClose-Ereignis. Wird jedoch der Befehl
Speichern unter bzw. in VBA SaveAs aufgerufen, wird die ursprüngliche
Datei sofort geschlossen, offenbar ohne dass BeforeClose oder ein anderes
Event feuert, und bleibt so unbereinigt und inkonsistent auf der
Festplatte.

Wie könnte ich erreichen, dass auch bei Speichern unter/SaveAs die
Bereinigung der ursprünglichen Datei durchgeführt wird?



Also: Excel 00/02. Ich will die Save-Events und die zugehörigen Dialoge
abfangen, um beim Schließen abschließende Bereinigungen durchzuführen.
Probleme bereitet mir SaveAs, wenn die Datei zuvor schon gespeichert war.
Code (ifClose führt die Bereinigung durch; closeFlag wird in BeforeClose
gesetzt):

Private Sub Workbook_BeforeSave( _
ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True
If SaveAsUI Then
Dim v As Variant, s As String, i As Long
If isXlt Then
v = Application.GetSaveAsFilename(Me.FullName, _
"Mustervorlage(*.xlt),*.xlt", , TITEL)
Else
If Me.Path = "" Then 'neue .xls
v = Application.GetSaveAsFilename(CurDir & _
Application.PathSeparator & Me.Name & ".xls", _
"Microsoft Excel-Arbeitsmappe(*.xls),*.xls", , TITEL)
Else
v = Application.GetSaveAsFilename(Me.FullName, _
"Microsoft Excel-Arbeitsmappe(*.xls),*.xls", , TITEL)
End If
End If
If v = False Then Exit Sub 'Abbrechen
If Dir(v) <> "" Then 'gibt es die Datei schon?
i = MsgBox(v & " gibt es schon!" & vbCrLf & vbCrLf & _
"Soll die Datei überschrieben werden?", _
vbExclamation + vbOKCancel, TITEL)
If i = vbCancel Then Exit Sub
On Error Resume Next
If v <> Me.FullName Then Kill v
If Err Then
MsgBox v & " kann nicht überschrieben werden!" & _
vbCrLf & vbCrLf & _
"Sie wird möglicherweise gerade bearbeitet.", _
vbCritical, TITEL
Exit Sub
End If
On Error GoTo 0
End If
If Me.Path = "" Then 'neue .xls
If closeFlag Then ifClose 'Bereinigung
Application.EnableEvents = False
On Error GoTo Workbook_BeforeSave_end
Me.SaveAs Filename:=v, AddToMru:=True
Application.EnableEvents = True
isDirty = 0
Exit Sub
ElseIf v <> Me.FullName Then 'SaveAs / alte Datei bereinigen
s = Me.FullName
Application.EnableEvents = False
On Error GoTo Workbook_BeforeSave_end
'HIER BEGINNT MEIN PROBLEM

ifClose
Me.Save
Me.SaveAs Filename:=v, AddToMru:=True

'HIER ENDET MEIN PROBLEM
Application.EnableEvents = True
isDirty = 0
Exit Sub
End If
End If
'normales Speichern
If closeFlag Then ifClose 'Bereinigung
Application.EnableEvents = False
On Error GoTo Workbook_BeforeSave_end
Me.Save
isDirty = 0
Workbook_BeforeSave_end:
Application.EnableEvents = True
End Sub

Das board-eigene SaveAs speichert unter neuem Namen mit allen Änderungen und
schließt die ursprüngliche Datei OHNE die Änderungen und OHNE
Event-Verarbeitung. Das will ich nachbilden, jedoch MIT den notwendigen
Bereinigungen (Passwort setzen; Sheets und Controlbars ausblenden etc.) beim
Schließen.

Beim obigen Code werden erstens leider auch die erfolgten Änderungen
mitgespeichert, und zweitens sind in der neuen Datei die Bereinigungen
ebenfalls erfolgt, so dass der User vor einem völlig anderen Bildschirm ohne
Initialierung der Anwendung (per Workbook_Open) sitzt. Das ist das Problem.

Die Idee, vor dem Speichern der Ursprungsdatei eine Art Reopen per
ChangeFileAccess durchzuführen, nimmt die Änderungen auch in der neuen Datei
zurück, und das Problem der erfolgten Bereinigung bleibt bestehen. Die
anschließende Idee, vor dem Speichern der Ursprungsdatei SaveCopyAs
auszuführen, führt zu einem Schließen-Problem, da die Anwendung wegen
Variablen- und Symbolleistenkonflikten keine weitere Instanz neben sich
duldet, so dass die neue Datei nicht geöffnet werden kann, solange die alte
noch offen ist.

Was kann ich noch probieren, das ist meine Frage.

Danke

Martin

Ähnliche fragen