TL;DR —
ThisWorkbookverweist immer auf die eine Arbeitsmappe, die den laufenden Code enthält, egal welches Fenster der Benutzer anklickt.ActiveWorkbookverweist auf das, was gerade jetzt oben liegt, und das kann sich unter Ihnen verschieben. Ein nacktesRange("A1")ist noch schlimmer: Es benennt weder eine Arbeitsmappe noch ein Blatt, landet also in genau diesem Augenblick auf der aktiven. Verankern Sie Schreibvorgänge anThisWorkbook(oder einer Workbook-Variablen, die Sie selbstSetzen), und das Makro hängt nicht mehr davon ab, wohin die Maus zuletzt geklickt hat.
Sub WhereDoesItLand()
' ThisWorkbook = die Datei, in der dieser Code lebt - fuer immer fest
ThisWorkbook.Worksheets("Summary").Range("A1").Value = "Report"
' ActiveWorkbook = was oben liegt, wenn diese Zeile laeuft - wankelmuetig
Debug.Print ThisWorkbook.Name ' z. B. Macros.xlsm - immer
Debug.Print ActiveWorkbook.Name ' was der Benutzer zuletzt angeklickt hat
End Sub
Was Sie lernen
- Das mentale Modell — ThisWorkbook ist eine feste Adresse, ActiveWorkbook eine bewegliche
- Die drei Werkzeuge, um zu sagen, welches Objekt Sie meinen, und warum eine nicht qualifizierte Referenz gefährlich ist
- ThisWorkbook gegenüber ActiveWorkbook, die mit Abstand wichtigste Unterscheidung in zuverlässigem VBA
- Die stumme Falle — warum ein Makro, das an Ihrem Platz funktioniert, die offene Datei einer Kollegin beschädigt
- Wie Sie eine andere offene Arbeitsmappe per Namen ansprechen und wie Sie eine öffnen und einen Handle behalten
- Die Meinung — qualifizieren Sie jede Referenz und nehmen Sie standardmäßig ThisWorkbook
Das mentale Modell: eine feste Adresse, keine bewegliche
Jede Referenz in VBA beantwortet eine Frage: welche Arbeitsmappe, welches Blatt, welche Zelle.
ThisWorkbook beantwortet die erste und ändert seine Antwort nie. Es ist die Arbeitsmappe, die den Code
enthält, den Sie gerade ausführen — die Datei, in der Ihre Module und Makros leben. Öffnen Sie zehn andere
Arbeitsmappen, klicken Sie sich durch alle, und ThisWorkbook zeigt weiterhin auf dieselbe Datei wie zu dem
Zeitpunkt, als das Makro startete.
ActiveWorkbook beantwortet dieselbe Frage mit was auch immer in diesem Augenblick oben liegt. Es ist ein
bewegliches Ziel, so gewollt: In dem Moment, in dem der Benutzer ein anderes Fenster anklickt oder Ihr
eigener Code eine neue Datei öffnet, wechselt die aktive Arbeitsmappe. Beide sind nützlich — aber sie sind
nicht austauschbar, und das eine als das andere zu behandeln ist die Wurzel einer ganzen Familie von
„mein-Makro-hat-die-falsche-Datei-bearbeitet"-Fehlern.
Drei Wege zu sagen, welches Objekt Sie meinen
ThisWorkbook ist eines von drei Werkzeugen, die VBA Ihnen gibt, um das gewünschte Objekt zu benennen,
statt den Code raten zu lassen. Sie prägen, ob Ihr Makro zuverlässig oder fragil ist, und sie sind das
Rückgrat dieses kurzen Clusters.
| Werkzeug | Worauf es zeigt | Wann Sie dazu greifen |
|---|---|---|
ThisWorkbook |
Die Arbeitsmappe, die diesen Code enthält — fest | Einstellungen lesen oder Ausgaben schreiben, die zum Makro gehören |
| ActiveWorkbook / ActiveSheet | Was gerade jetzt oben liegt — wankelmütig | Ein generisches Werkzeug, das auf „was der Benutzer gerade offen hat" wirkt |
| Worksheets(...) | Ein benanntes Blatt in einer Arbeitsmappe — die Sammlung | Ein bestimmtes Register per Name, Index oder CodeName ansprechen |
Die Regel, die sie zusammenhält: Eine nicht qualifizierte Referenz greift nach dem, was aktiv ist.
Schreiben Sie Range("A1") = 1 ohne eine Arbeitsmappe und ein Blatt davor, füllt VBA die Lücken mit der
aktiven Arbeitsmappe und dem aktiven Blatt in diesem Moment. Das ist bequem im Direktfenster und
katastrophal in einem gespeicherten Makro.
ThisWorkbook gegenüber ActiveWorkbook: fest gegenüber wankelmütig
Das ist die Unterscheidung, die Sie sich einprägen müssen. Stellen Sie sich vor, Ihr Makro lebt in
Macros.xlsm, und der Benutzer hat außerdem Sales.xlsx geöffnet und schaut sie an, wenn er auf Ihren
Button drückt.
Sub FixedVsFickle()
ThisWorkbook.Worksheets(1).Range("A1").Value = "written by the macro"
' ^ landet immer in Macros.xlsm, der Datei, in der dieser Code lebt
ActiveWorkbook.Worksheets(1).Range("A1").Value = "written by the macro"
' ^ landet in Sales.xlsx - weil der Benutzer genau die angesehen hat
End Sub
Gleich aussehender Code, zwei verschiedene Dateien. ThisWorkbook ist die ehrliche Wahl, wenn das Ziel „die
Datei, zu der mein Makro gehört" ist — ein Einstellungsblatt, ein Protokoll, ein Ausgabe-Tab, der mit dem
Werkzeug ausgeliefert wird. ActiveWorkbook ist nur dann richtig, wenn Sie wirklich „was auch immer der
Benutzer in den Vordergrund geholt hat" meinen. Sind Sie sich je unsicher, welches Sie meinten, meinten Sie
ThisWorkbook: Es ist das, das Sie nicht überraschen kann.
Ein Verwandter, den man kennen sollte: ThisWorkbook ist nicht immer die aktive, und es ist nicht immer die
zuerst geöffnete. Es ist schlicht die mit dem Code. Wenn ein Makro in Macros.xlsm die Datei Report.xlsx
öffnet, wird die neue Datei zu ActiveWorkbook, aber ThisWorkbook rührt sich nicht.
Die stumme Falle: an Ihrem Platz funktioniert es, auf ihrem bricht es
So wird der Bug tatsächlich ausgeliefert. Sie schreiben und testen das Makro mit nur einer offenen
Arbeitsmappe — Ihrer eigenen. Bei einer einzigen Arbeitsmappe ist die aktive Arbeitsmappe Ihre
Arbeitsmappe, also verhalten sich ein nicht qualifiziertes Range("A1") und ein mit ThisWorkbook
qualifiziertes identisch. Jeder Test besteht.
Dann führt eine Kollegin es mit drei offenen Arbeitsmappen aus. Jetzt ist „aktiv" das, was sie gerade
ansah, die nicht qualifizierten Schreibvorgänge landen in ihrer Datei, und Ihr Makro überschreibt still
eine Zelle in einem Bericht, den es nie berühren sollte. Kein Fehler wird ausgelöst — der Code hat genau
das getan, was er sagte, nämlich „schreibe in das, was aktiv ist". Die Lösung ist kein On Error-Handler;
sie ist, die Arbeitsmappe nicht länger unbenannt zu lassen.
' FRAGIL - haengt davon ab, was der Benutzer zuletzt angeklickt hat
Range("A1").Value = total
' ZUVERLAESSIG - benennt jedes Mal die Arbeitsmappe und das Blatt
ThisWorkbook.Worksheets("Summary").Range("A1").Value = total
Qualifizieren Sie die Referenz, und das Makro verhält sich auf jedem Platz gleich, bei beliebig vielen
offenen Dateien. Deshalb lautet die wertvollste Gewohnheit in VBA auf Arbeitsmappen-Ebene: Lassen Sie nie
einen Range- oder Cells-Aufruf schweben, ohne eine Arbeitsmappe und ein Blatt davor.
Eine andere offene Arbeitsmappe per Namen ansprechen
Manchmal brauchen Sie wirklich eine andere Arbeitsmappe — eine Datendatei, die der Benutzer geöffnet hat,
oder eine, die Sie selbst öffnen. Gehen Sie nicht über ActiveWorkbook und hoffen. Benennen Sie sie oder
halten Sie einen Handle darauf.
Sub TalkToAnotherFile()
Dim src As Workbook
' Schon offen? Per Dateinamen greifen (mit Endung)
Set src = Workbooks("Sales.xlsx")
' Noch nicht offen? Oeffnen und den Handle behalten, den Open zurueckgibt
Set src = Workbooks.Open("C:\Data\Sales.xlsx")
' Jetzt ist jede Referenz explizit - kein Raten, welche Datei
Debug.Print src.Worksheets("Jan").Range("A1").Value
ThisWorkbook.Worksheets("Summary").Range("A1").Value = _
src.Worksheets("Jan").Range("A1").Value
End Sub
Zwei Regeln machen das sicher. Erstens braucht Workbooks("Sales.xlsx") den Dateinamen mit seiner
Endung, und die Datei muss bereits offen sein, sonst löst sie Subscript out of range aus. Zweitens
liefert Workbooks.Open die Arbeitsmappe zurück, die es geöffnet hat — fangen Sie sie in derselben
Zeile in eine Set-Variable, damit Sie nie fragen müssen „welche ist jetzt aktiv". Eine Workbook-Variable,
die Sie selbst Setzen, ist sogar besser als ThisWorkbook: Sie ist fest und explizit darüber, welche
Datei Sie meinen.
Die Meinung: alles qualifizieren, standardmäßig ThisWorkbook
Jede Referenz in einem Makro sollte ihre Arbeitsmappe und ihr Blatt benennen, und die Standard-Arbeitsmappe
sollte ThisWorkbook sein. Nicht qualifizierte Referenzen sind kein kürzerer Code, der es wert wäre — sie
sind eine Wette darauf, dass genau in dem Augenblick, in dem die Zeile läuft, die richtige Datei aktiv sein
wird, und diese Wette verlieren Sie an dem Tag, an dem jemand anders Ihr Makro mit mehr als einer offenen
Datei ausführt.
Die Disziplin ist klein und sie zahlt sich für immer aus: Greifen Sie zu ThisWorkbook, wenn das Ziel zu
Ihrem Werkzeug gehört, Setzen Sie eine Workbook-Variable, wenn Sie eine bestimmte andere Datei meinen,
und reservieren Sie ActiveWorkbook für den seltenen Fall, in dem „was der Benutzer im Vordergrund hat"
wirklich das richtige Ziel ist. Behandeln Sie ein nacktes Range ohne Arbeitsmappe davor als unfertige
Zeile, genau so, wie Sie eine nicht deklarierte Variable behandeln würden.
Wenn die eigentliche Aufgabe größer ist als die Wahl der richtigen Arbeitsmappe
Die Referenz richtig zu treffen, ist das Mindeste; die eigentliche Arbeit ist meist die Logik darüber — diese zwei Dateien abgleichen, die Zeilen des letzten Monats ziehen, nach Region in die Zusammenfassung summieren. Das von Hand zu schreiben heißt, die Arbeitsmappen-Referenz und die Schleife und die Randfälle jedes Mal richtig zu treffen. ExcelMaster lässt Sie das Ergebnis in normaler Sprache beschreiben — „vergleiche Sales.xlsx mit dem Zusammenfassungs-Tab in dieser Datei und markiere Zeilen, die nicht übereinstimmen" — und es schreibt den Code, führt ihn aus, sichert vorher Ihre Arbeitsmappe und qualifiziert jede Referenz für Sie. Sie sagen, welche Dateien Sie meinen; es kümmert sich um die Verrohrung, um die es in diesem Artikel geht.
Häufig gestellte Fragen
Was ist der Unterschied zwischen ThisWorkbook und ActiveWorkbook in VBA?
ThisWorkbook verweist immer auf die Arbeitsmappe, die den laufenden Code enthält, und ändert sich nie.
ActiveWorkbook verweist auf die Arbeitsmappe, die im Moment des Zeilenlaufs oben liegt, und die wechselt,
sobald der Benutzer ein anderes Fenster anklickt oder Ihr Code eine neue Datei öffnet. Nutzen Sie
ThisWorkbook, wenn Sie die eigene Datei des Makros meinen, und ActiveWorkbook nur, wenn Sie wirklich
„was der Benutzer im Vordergrund hat" meinen.
Ist ThisWorkbook immer die aktive Arbeitsmappe?
Nein. ThisWorkbook ist die Datei, die den Code enthält; die aktive Arbeitsmappe ist das, was oben liegt.
Sie stimmen nur überein, wenn zufällig die eigene Datei des Makros die vorderste ist. Sobald eine andere
Arbeitsmappe aktiv ist — der Benutzer hat sie angeklickt oder Ihr Makro hat sie geöffnet —, zeigen die
beiden auf verschiedene Dateien.
Wie spreche ich in VBA eine andere Arbeitsmappe an?
Ist sie bereits offen, nutzen Sie Workbooks("Name.xlsx") mit Dateinamen und Endung. Ist sie nicht offen,
nutzen Sie Set wb = Workbooks.Open("C:\Pfad\Name.xlsx"), das die Arbeitsmappe zurückgibt, sodass Sie einen
Handle darauf halten können. Qualifizieren Sie danach jede Referenz über diese Variable, statt sich auf die
aktive Arbeitsmappe zu verlassen.
Warum schreibt mein Makro in die falsche Arbeitsmappe?
Fast immer, weil ein Range- oder Cells-Aufruf keine Arbeitsmappe davor hat und deshalb auf dem landet,
was beim Zeilenlauf aktiv ist. Es funktioniert, solange Sie mit einer offenen Datei testen, und schreibt
dann in die Datei einer Kollegin, wenn mehrere offen sind. Qualifizieren Sie die Referenz mit ThisWorkbook
oder einer Workbook-Variablen, und sie landet jedes Mal in der richtigen Datei.
Funktioniert ThisWorkbook in einem Add-In?
Ja, und genau dort verdient es sich seinen Wert. In einem Add-In verweist ThisWorkbook auf die Add-In-
Datei selbst, während die Daten des Benutzers in einer anderen Arbeitsmappe liegen. Nutzen Sie
ThisWorkbook für die eigenen Ressourcen des Add-Ins und eine Set-Workbook-Variable (oder bewusst
ActiveWorkbook) für die Daten des Benutzers.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 07.09.2026.
Verwandte Anleitungen: VBA ActiveWorkbook · VBA Worksheets · VBA Workbook · VBA Range · VBA Dim
