🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Arbeitsmappe speichern in Excel — Save vs. SaveAs, die FileFormat-Falle und warum Ihre Makros verschwinden

|

VBA Arbeitsmappe speichern in Excel — Save vs. SaveAs, die FileFormat-Falle und warum Ihre Makros verschwinden

TL;DR.Save überschreibt die Datei, die Sie bereits haben. .SaveAs schreibt eine neue Datei oder einen neuen Typ, und Sie müssen ihm die richtige FileFormat-Nummer geben, sonst streifen Sie die Makros aus der Arbeitsmappe. Eine makrofähige .xlsm braucht xlOpenXMLWorkbookMacroEnabled (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 — Save schreibt an Ort und Stelle fest; SaveAs schreibt eine neue Datei und braucht ein FileFormat
  • Die Falle, die Ihre Makros frisst — eine .xlsm mit der .xlsx-Formatnummer zu speichern streift das gesamte VBA ab
  • Warum .Save auf einer nie gespeicherten Arbeitsmappe das Dialogfeld Speichern unter aufwirft und ein unbeaufsichtigtes Makro aufhängt
  • Wie DisplayAlerts die Überschreib-Aufforderung in eine Vorabgenehmigung verwandelt, keinen Stummschalter
  • Was wb.Saved = True wirklich tut (als sauber markieren) gegenüber dem, was es nicht tut (die Datei schreiben)
  • Wann Sie stattdessen zu SaveCopyAs und ExportAsFixedFormat greifen

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 ist Strg+S. Es funktioniert nur, wenn die Arbeitsmappe bereits eine Datei auf der Festplatte hat.
  • .SaveAs schreibt die Arbeitsmappe an einen neuen Pfad oder in einen neuen Dateityp. Es ist Datei > 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:

  • SaveCopyAs schreibt 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 unberuehrt
    
  • PDF 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ückliches FileFormat und lassen Sie es zur Erweiterung passen: 52 für .xlsm, 51 für .xlsx, 6 fü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