HERBERS Excel-Forum - das Archiv
Speicheraufforderung nach Aktivierung aktiver Inhalte
StefanoFereri
Hallo Forum,

beim Schließen einer Excel-Datei mit VBA-Code werde ich zum Speichern aufgefordert, obwohl ich keinerlei Änderungen vorgenommen habe. Konkret: Es gibt eine Workbook_open-Prozedur, und deren letzte Anweisung lautet: ThisWorkbook.saved = True. Damit führen die speicherrelevanten Änderungen, die in dieser Prozedur vorgenommen werden, zunächst beim Schließen nicht zu einer Speicheranfrage, wie erwartet.

Ändere ich anschließend den Dateinamen und öffne die Datei erneut, kommt es zunächst zum obligatorischen Sicherheitshinweis auf aktive Inhalte. Ebenfalls noch wie erwartet. Wenn ich dann aber die Aktivierung der Inhalte zulasse und die Datei nach dem Öffnen sofort ohne weitere Änderung wieder schließe, gibt es die unerwartete Speicheraufforderung.

Um sicherzustellen, dass es nach der WB_Open-Prozedur keine offenen Änderungen gibt, habt ich zum Debuggen als letzte Zeile der Prozedur eine Msgbox eingefügt, die in allen Fällen den Status "True" zurückgibt:

Private Sub Workbook_Open()

Dim Delim as Integer, ReNr As Integer
MsgBox ThisWorkbook.Saved
Application.ScreenUpdating = False
.
.
.
Application.ScreenUpdating = True
Application.OnKey "~", "EnterTaste"
Application.OnKey "{Enter}", "EnterTaste"
ThisWorkbook.Saved = True
MsgBox ThisWorkbook.Saved
End Sub

Hat jemand eine Idee, woran das liegen könnte?

Vielleicht noch ein Hinweis: Auch am Anfang steht eine MsgBox, und die wirft tatsächlich nach einer Änderung des Dateinamens ein "False" aus. Aber das wird dann am Ende der Prozedur korrekt wieder zurückgesetzt. Anscheinend wird irgendwo an einer für mich nicht erkennbaren Stelle im Projekt noch eine Änderung durchgeführt, die durch ThisWorkbook.Saved nicht zurückgesetzt werden kann.

Vielen Dank schon mal für einen Tipp,
Stefano
AW: Speicheraufforderung nach Aktivierung aktiver Inhalte
Onur
Warum verrätst du nicht, was zwischen
Application.ScreenUpdating = False
und
Application.ScreenUpdating = True
steht ? Geheim?
AW: Speicheraufforderung nach Aktivierung aktiver Inhalte
Onur
Das
MsgBox ThisWorkbook.Saved

solltest du in Workbook_BeforeClose einbauen.
Und in
Workbook_SheetChange

ein
Stop
AW: Speicheraufforderung nach Aktivierung aktiver Inhalte
StefanoFereri
Hi Onur,

ich dachte, der Rest ist nicht wichtig, weil ja eh ein Saved=True am Ende steht. Aber hier ist er:



Private Sub Workbook_Open()
Dim Delim As Integer, ReNr As Integer, LetzteReNr As Integer, StartAktion As Integer
Dim File As String, LocPath As String
ActiveWindow.DisplayHeadings = True
ActiveWindow.DisplayGridlines = True
Application.DisplayFormulaBar = True
ActiveWindow.ScrollRow = 1
Application.ScreenUpdating = False
Sheets("Rechnung").Protect Password:="", UserInterFaceOnly:=True
Sheets("Vorgaben").Protect Password:="", UserInterFaceOnly:=True
Sheets("Adressaten").Protect Password:="", UserInterFaceOnly:=True
Sheets("Rechnung").EnableSelection = xlUnlockedCells
Sheets("Vorgaben").EnableSelection = xlUnlockedCells

ActiveWorkbook.AutoSaveOn = False

Cells(23, 13).Value = ThisWorkbook.Path & "\"
LocPath = Cells(23, 13).Value

If InStr(1, LocPath, "my.sharepoint.com") <> 0 Or InStr(1, LocPath, "d.docs.live.net") <> 0 Then
LocPath = OneDriveLocalFilePath() & "\"
Cells(23, 13).Value = LocPath
End If

Sheets("Rechnung").Select
SpeichernMitButton = 0
If Not Left(ThisWorkbook.Name, 11) = "Rechnung_Nr" Then '...dann ist es eine neue Rechnung
Cells(5, 13).Value = Format(Date, "D. MMMM YYYY")
File = Dir(LocPath & "Rechnung_Nr*.xlsm")
If File = "" Then
MsgBox "Finde keine Rechnungen. Ich gehe davon aus," & Chr(10) & "dass dies die erste Rechnung wird."
Cells(4, 13).Value = 1
Else
ReNr = 1
LetzteReNr = 1
Do Until File = ""
Delim = InStr(13, File, "_")
LetzteReNr = CInt(Mid(File, 13, Delim - 13))
If LetzteReNr > ReNr Then ReNr = LetzteReNr
File = Dir()
Loop
Cells(4, 13).Value = ReNr + 1
End If
End If

Cells(Cells(2, 13).Value, 3).Select
Application.ScreenUpdating = True
Application.OnKey "~", "EnterTaste"
Application.OnKey "{Enter}", "EnterTaste"
ThisWorkbook.Saved = True
MsgBox ThisWorkbook.VBProject.Name
End Sub


Die MsgBox habe ich jetzt auch in BeforeClose eingebaut, dort zeigt sie "False", sobald ich die Datei nach einer Umbenennung öffne und ohne weitere Änderung wieder schließe. Das Workbook_SheetChange-Ereignis kannte ich noch gar nicht, werde ich gleich morgen ebenfalls testen. Besten Dank erstmal!
AW: Speicheraufforderung nach Aktivierung aktiver Inhalte
Onur
Sind die Berechnungsoptionen auf automatisch oder manuell?
AW: Speicheraufforderung nach Aktivierung aktiver Inhalte
StefanoFereri
Die automatische Berechnung ist eingeschaltet. Und das SheetChange-Ereignis habe ich eingebaut. Erwartungsgemäß stoppt der Code im Workbook_Open-Modul zweimal, an den Stellen, wo ein Zellinhalt geschrieben wird. Da gibt es jedoch keinen Unterschied im Verhalten. Auch wenn ich die Datei umbenenne und den Hinweis auf aktive Inhalte bestätige, stoppt das Workbook_Open-Modul an der gleichen Stelle. Die ominöse Speicherabfrage nach Umbenennung der Datei hat also nach meiner Interpretation keine Änderungen an Tabellenblättern zur Ursache.
AW: Speicheraufforderung nach Aktivierung aktiver Inhalte
Onur
Aber die Dateieigenschaften, schätze ich. Sag mal nein und schaue sie dir mal genau an, vor llem im Vergleich zur Originalversion.
AW: Speicheraufforderung nach Aktivierung aktiver Inhalte
StefanoFereri
Ich kann in den Dateieigenschaften keine Unterschiede erkennen.

Gibt es vielleicht die Option, das abzufangen, indem man im VBA-Code prüft, ob es nach dem Abarbeiten der Workbook_Open-Prozedur irgendeine Änderung an einem der Tabellenblätter gegeben hat (die dann ja vom Anwender durchgeführt worden sein müssen)? Vielleicht indem man über das SheetChange-Ereignis einen Schalter und im Workbook_BeforeClose-Ereignis wiederum in Abhängigkeit von diesem Schalter Workbook.Saved auf True oder False setzt?
AW: Speicheraufforderung nach Aktivierung aktiver Inhalte
Onur
Ohne die Datei kann ich nix überprüfen ...
Hast du denn mal bei "Aktivieren" auf "Nein" geklickt?
AW: Speicheraufforderung nach Aktivierung aktiver Inhalte
StefanoFereri
Habe ich gerade gemacht - keine sichtbaren Unterschiede.

Habe gerade in der SheetChange-Routine einen Schalter "MustSave" eingebaut, der auf 1 gesetzt wird, sofern der Aufruf nicht aus dem Workbook_Open-Modul kommt. In BeforeClose wird MustSave dann abgefragt. So scheint es auf den ersten Blick zu funktionieren. Aber vermutlich kräuseln sich dem Profi dabei die Nackenhaare...

Private Sub Workbook_Open()

OpenModul = 1
.
[diverse Änderungen, die ein ChangeSheet-Ereignis auslösen]
.
OpenModul = 0
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If OpenModul = 0 Then MustSave = 1
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If MustSave = 0 Then
ThisWorkbook.Saved = True
Else
Ret = MsgBox("Die Änderungen sind noch nicht als neue Rechnung gespeichert und gehen verloren!", vbOKCancel)
If Ret = vbCancel Then Cancel = True
End If
If Not Ret = vbCancel Then
Application.OnKey "~"
ThisWorkbook.Saved = True
Application.ScreenUpdating = True
End If
End Sub
AW: Speicheraufforderung nach Aktivierung aktiver Inhalte
Onur
Wenn da nix relevantes steht - warum überhaupt Bildschirmaktualisierung ausschalten?