TL;DR —
.Saveüberschreibt die Datei, die Sie bereits haben..SaveAsschreibt eine neue Datei oder einen neuen Typ, und Sie müssen ihm die richtigeFileFormat-Nummer geben, sonst streifen Sie die Makros aus der Arbeitsmappe. Eine makrofähige.xlsmbrauchtxlOpenXMLWorkbookMacroEnabled(52), nicht das.xlsx-Format (51):
Sub SaveAsMacroWorkbook()
Application.DisplayAlerts = False ' die Ueberschreib-Aufforderung vorab genehmigen
ThisWorkbook.SaveAs _
Filename:="C:\Reports\Q1.xlsm", _
FileFormat:=xlOpenXMLWorkbookMacroEnabled ' 52 = .xlsm, behaelt das VBA
Application.DisplayAlerts = True ' sofort wiederherstellen
End Sub
Speichern sieht aus wie das Einfachste, was ein Makro tun kann, und es verbirgt die schärfste
Datenverlust-Falle im gesamten Workbook-Objektmodell: das falsche FileFormat löscht Ihren Code ohne
ein Wort der Warnung. Diese Anleitung ruht auf der einen Unterscheidung, die das verhindert — Save
behält die Datei, die Sie haben, SaveAs erstellt eine neue, und die neue ist nur dann korrekt, wenn
das Format zur Erweiterung passt.
Was Sie lernen
- Das mentale Modell —
Saveschreibt an Ort und Stelle fest;SaveAsschreibt eine neue Datei und braucht einFileFormat - Die Falle, die Ihre Makros frisst — eine
.xlsmmit der.xlsx-Formatnummer zu speichern streift das gesamte VBA ab - Warum
.Saveauf einer nie gespeicherten Arbeitsmappe das Dialogfeld Speichern unter aufwirft und ein unbeaufsichtigtes Makro aufhängt - Wie
DisplayAlertsdie Überschreib-Aufforderung in eine Vorabgenehmigung verwandelt, keinen Stummschalter - Was
wb.Saved = Truewirklich tut (als sauber markieren) gegenüber dem, was es nicht tut (die Datei schreiben) - Wann Sie stattdessen zu
SaveCopyAsundExportAsFixedFormatgreifen
Das mentale Modell: Save schreibt fest, SaveAs erstellt
Zwei Verben, zwei Aufgaben:
.Saveüberschreibt die bestehende Datei der Arbeitsmappe, an Ort und Stelle, still. Kein Dialog, kein neuer Name. Es istStrg+S. Es funktioniert nur, wenn die Arbeitsmappe bereits eine Datei auf der Festplatte hat..SaveAsschreibt die Arbeitsmappe an einen neuen Pfad oder in einen neuen Dateityp. Es istDatei > Speichern unter. Weil es eine Datei erstellt, muss es das Format kennen — und da lauert die Falle.
ThisWorkbook.Save ' die aktuelle Datei ueberschreiben
ThisWorkbook.SaveAs "C:\Reports\Copy.xlsx", xlOpenXMLWorkbook ' eine neue .xlsx schreiben
Alles Weitere ist eine Folge dieser einen Aufspaltung.
Die Falle, die Ihre Makros frisst: FileFormat muss zur Erweiterung passen
Das ist der Fehler, der Menschen glauben lässt, Excel habe ihren Code „verloren“. Sie speichern eine Arbeitsmappe, die Makros enthält, aber mit der Formatnummer der einfachen Arbeitsmappe:
ThisWorkbook.SaveAs "C:\Reports\Q1.xlsm", xlOpenXMLWorkbook ' 51 = .xlsx = KEINE Makros
xlOpenXMLWorkbook (51) ist das .xlsx-Format, und .xlsx kann kein VBA aufnehmen. Excel schreibt
die Datei und verwirft still jedes Modul und Makro — obwohl Sie die Datei .xlsm genannt haben.
Jetzt sagt die Erweiterung „makrofähig“ und der Inhalt sagt „keine Makros“, also warnt Excel oder
weigert sich, sie sauber zu öffnen, und Ihr Code ist weg.
Die Regel ist einfach: die FileFormat-Nummer muss mit der Erweiterung übereinstimmen. Die vier,
die Sie tatsächlich verwenden:
' FileFormat-Konstanten (und ihre Zahlenwerte):
' xlOpenXMLWorkbook = 51 .xlsx (keine Makros)
' xlOpenXMLWorkbookMacroEnabled = 52 .xlsm (behaelt Makros)
' xlExcel8 = 56 .xls (alt 97-2003)
' xlCSV = 6 .csv (ein Blatt, nur Werte)
Hat die Arbeitsmappe Code, muss es .xlsm mit 52 sein. Im Zweifel verwenden Sie die benannte
Konstante, nicht die rohe Zahl — xlOpenXMLWorkbookMacroEnabled kann man sich nicht so vertippen wie
52.
Save auf einer nie gespeicherten Arbeitsmappe wirft einen Dialog auf
.Save überschreibt die bestehende Datei — aber eine mit Workbooks.Add erstellte Arbeitsmappe hat
noch keine Datei. Ein .Save darauf kann nicht wissen, wohin geschrieben werden soll, also greift Excel
auf das Dialogfeld Speichern unter zurück — das jedes unbeaufsichtigt laufende Makro aufhängt. Wenn
Sie eine neue Arbeitsmappe zum ersten Mal schreiben, verwenden Sie stets .SaveAs mit einem
ausdrücklichen Pfad und Format:
Dim wb As Workbook
Set wb = Workbooks.Add
' wb.Save ' FALSCH bei einer neuen Mappe - wirft Dialog Speichern unter auf
wb.SaveAs "C:\Reports\New.xlsx", xlOpenXMLWorkbook ' richtig - beim ersten Mal einen Pfad geben
wb.Save ' jetzt funktioniert .Save - die Datei existiert
Die Überschreib-Aufforderung ist eine Vorabgenehmigung, kein Stummschalter
SaveAs auf einen bereits existierenden Pfad wirft die modale Aufforderung „Es existiert bereits eine
Datei — ersetzen?“ auf. Um unbeaufsichtigt zu laufen, unterdrücken Sie sie:
Application.DisplayAlerts = False
wb.SaveAs "C:\Reports\Q1.xlsm", xlOpenXMLWorkbookMacroEnabled
Application.DisplayAlerts = True
Lesen Sie das ehrlich: DisplayAlerts = False zu setzen bringt die Frage nicht zum Schweigen, es
beantwortet sie mit dem Standard — ja, ersetzen. Sie haben vorab genehmigt, was auch immer bereits
an diesem Pfad lag, zu überschreiben. Genau das ist der Punkt in
VBA DisplayAlerts: Sie verbergen keine Warnung, Sie stimmen dem
destruktiven Standard im Voraus zu. Stellen Sie DisplayAlerts = True in der allernächsten Zeile wieder
her, damit die nächste Aufforderung nicht ebenfalls still automatisch bestätigt wird.
Saved = True markiert als sauber; es speichert nicht
wb.Saved ist das „Dirty“-Flag — False bedeutet „es gibt ungespeicherte Änderungen“. Sie werden
diesen Trick sehen, um die Schließen-Aufforderung zu unterdrücken:
wb.Saved = True ' Excel "keine ungespeicherten Aenderungen" mitteilen - schreibt die Datei NICHT
wb.Close ' schliesst ohne die "save changes?"-Aufforderung
Das ist nützlich, aber wissen Sie genau, was es tut: es belügt Excel über den Dirty-Zustand, sodass
die Schließen-Aufforderung nicht erscheint. Es schreibt nichts auf die Festplatte. Wenn Sie die
Änderungen eigentlich behalten wollten, wirft wb.Saved = True sie weg. Als-sauber-markieren und
Speichern sind verschiedene Operationen — verwechseln Sie sie nicht.
SaveCopyAs und PDF: die zwei SaveAs-Doppelgänger
Zwei Aufgaben sehen aus wie SaveAs, sind es aber nicht:
SaveCopyAsschreibt eine Sicherungskopie auf die Festplatte, ohne den eigenen Pfad oder Dirty-Zustand der Arbeitsmappe zu ändern. Es ist das richtige Werkzeug für „die Datei per Schnappschuss sichern, bevor ich sie verändere“, denn die aktive Arbeitsmappe behält ihren ursprünglichen Namen und bleibt geöffnet:ThisWorkbook.SaveCopyAs "C:\Backups\before-run.xlsm" ' Kopie heraus; Original unberuehrtPDF ist kein
SaveAs-Format. Es gibt kein „SaveAs PDF“ — der Export nach PDF ist eine andere Methode,ExportAsFixedFormat:ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Reports\Q1.pdf"
Das ehrliche Fazit: welches Speichern Sie verwenden
.Save— Änderungen an einer Arbeitsmappe festschreiben, die bereits eine Datei hat. Der Alltagsfall..SaveAs path, FileFormat— eine neue Datei schreiben oder den Typ konvertieren. Übergeben Sie stets ein ausdrücklichesFileFormatund lassen Sie es zur Erweiterung passen:52für.xlsm,51für.xlsx,6für.csv..SaveCopyAs— ein Sicherungs-Schnappschuss, der die aktive Arbeitsmappe in Ruhe lässt.ExportAsFixedFormat— PDF/XPS-Ausgabe, kein Speicherformat.
Das eine Nicht-Verhandelbare: Hält die Arbeitsmappe Code, ist es .xlsm mit
xlOpenXMLWorkbookMacroEnabled. Jedes „wo sind meine Makros hin?“-Ticket ist diese falsche Nummer. Und
jedes SaveAs in einem automatisierten Lauf braucht DisplayAlerts = False darum herum — mit sofortiger
Wiederherstellung —, damit die Überschreib-Aufforderung den Job nicht aufhängt oder, schlimmer, für die
nächste Datei still beantwortet wird.
Wie ExcelMaster hilft
Der Speicherschritt ist der Punkt, an dem ein funktionierendes Makro still Arbeit zerstört: das falsche
FileFormat löscht das VBA, .Save auf einer neuen Mappe hängt an einem Dialog, ein nicht
wiederhergestelltes DisplayAlerts bestätigt die nächste Aufforderung automatisch, und Saved = True
wirft Änderungen weg, die Sie behalten wollten. Jedes ist ein kleines Detail; jedes verliert Daten.
ExcelMaster bekommt das
Speichern von Grund auf richtig. Bitten Sie es, „das Blatt jeder Region als eigene makrofähige
Arbeitsmappe zu speichern“, und es schreibt .SaveAs mit xlOpenXMLWorkbookMacroEnabled, umschließt das
Überschreiben mit einem DisplayAlerts-Aus/Ein-Paar, verwendet SaveCopyAs, wenn Sie eine Sicherung
statt einer Umbenennung wollen, und .Save nur bei Arbeitsmappen, die bereits einen Pfad haben. Sie
beschreiben die Datei, die Sie wollen; es wählt das Format, das Ihren Code und Ihre Daten behält.
Häufig gestellte Fragen
Was ist der Unterschied zwischen Save und SaveAs in VBA?
.Save überschreibt die bestehende Datei der Arbeitsmappe an Ort und Stelle, still, ohne Dialog — das
Äquivalent zu Strg+S. .SaveAs schreibt die Arbeitsmappe an einen neuen Pfad oder in einen neuen
Dateityp und verlangt ein FileFormat-Argument. Verwenden Sie .Save, um Änderungen an einer bereits
existierenden Datei festzuschreiben, und .SaveAs, um eine neue Datei zu erstellen oder das Format zu
konvertieren.
Warum hat VBA meine Makros gelöscht, als ich die Arbeitsmappe speicherte?
Sie haben eine Makro-Arbeitsmappe mit der .xlsx-Formatnummer xlOpenXMLWorkbook (51) gespeichert. Das
.xlsx-Format kann kein VBA speichern, also verwirft Excel still jedes Modul, obwohl die Datei .xlsm
heißt. Speichern Sie makrofähige Arbeitsmappen mit xlOpenXMLWorkbookMacroEnabled (52), damit der Code
erhalten bleibt.
Wie speichere ich in VBA eine Arbeitsmappe ohne die Überschreib-Aufforderung?
Setzen Sie Application.DisplayAlerts = False vor dem SaveAs und stellen Sie es unmittelbar danach auf
True wieder her. Das beantwortet die Aufforderung „Datei existiert bereits, ersetzen?“ mit ihrem
Standard (ja, ersetzen), sodass sie nicht erscheint. Denken Sie daran, dass Sie das Überschreiben der
bestehenden Datei vorab genehmigt haben — vergewissern Sie sich also, dass Sie das wollen.
Was macht wb.Saved = True in VBA?
Es setzt das Dirty-Flag der Arbeitsmappe auf „keine ungespeicherten Änderungen“, sodass Excel beim
Schließen nicht die Aufforderung „Änderungen speichern?“ zeigt. Es schreibt nichts auf die Festplatte.
Gab es tatsächlich ungespeicherte Änderungen, verwirft Saved = True sie. Um die Änderungen zu behalten,
rufen Sie .Save auf oder schließen Sie mit SaveChanges:=True.
Wie speichere ich in VBA eine Arbeitsmappe als PDF?
PDF ist kein SaveAs-Format. Verwenden Sie ExportAsFixedFormat:
ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Reports\Q1.pdf". Um eine schlichte
Sicherungskopie der Arbeitsmappe selbst ohne Namensänderung zu schreiben, verwenden Sie stattdessen
SaveCopyAs.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 20.08.2026.
Verwandte Anleitungen: VBA Open Workbook · VBA Close Workbook · VBA DisplayAlerts · VBA Workbook_BeforeSave Event · VBA ScreenUpdating
