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

VBA ThisWorkbook in Excel — warum es nicht dasselbe ist wie ActiveWorkbook

|

VBA ThisWorkbook in Excel — warum es nicht dasselbe ist wie ActiveWorkbook

TL;DRThisWorkbook verweist immer auf die eine Arbeitsmappe, die den laufenden Code enthält, egal welches Fenster der Benutzer anklickt. ActiveWorkbook verweist auf das, was gerade jetzt oben liegt, und das kann sich unter Ihnen verschieben. Ein nacktes Range("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 an ThisWorkbook (oder einer Workbook-Variablen, die Sie selbst Setzen), 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