TL;DR —
Intersectgibt nur die Zellen zurück, die sich zwei Bereiche teilen. Berühren sie sich nicht, gibt esNothingzurück — keinen leeren Bereich, keinen Fehler — und diesesNothingist der ganze Sinn. Sein wichtigster Einsatz ist, einWorksheet_Change-Ereignis so abzusichern, dass es nur auf Bearbeitungen in der Spalte reagiert, die Sie interessiert. Die wichtigste Regel: keine Überschneidung bedeutetNothing, sodass jeder Zugriff auf eine Eigenschaft ohneIs Nothing-Prüfung miterror 91abstürzt:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Me.Range("B:B")) Is Nothing Then Exit Sub ' Bearbeitung war nicht in Spalte B
Application.EnableEvents = False ' unser eigenes Schreiben soll dies nicht erneut ausloesen
Target.Offset(0, 1).Value = Now ' die Zeit daneben eintragen
Application.EnableEvents = True
End Sub
Union verbindet Bereiche; Intersect ist sein Gegenteil — es schrumpft auf den gemeinsamen
Teil. Und anders als jeder Bezug davor kann Intersect mit gutem Grund gar nichts zurückgeben,
denn zwei Bereiche, die sich nicht überschneiden, haben keine gemeinsamen Zellen. Diese Anleitung ruht
auf einer Idee — Intersect beantwortet eine Ja/Nein-Frage („überschneiden die sich?“), indem es
entweder die Überschneidung oder Nothing zurückgibt, und Sie müssen prüfen, was von beidem, bevor
Sie es anfassen. Genau diese eine Gewohnheit unterscheidet einen robusten Ereignishandler von einem,
der beim falschen Klick abstürzt.
Was Sie lernen
- Das mentale Modell —
Intersectgibt die Überschneidung zweier Bereiche zurück, oderNothing, wenn sie sich verfehlen - Die wichtigste Regel — keine Überschneidung ist
Nothing, also mitIs Nothingabsichern, sonst gibt eserror 91 - Der entscheidende Einsatz — der
Worksheet_Change-Schutz und dieEnableEvents-Falle, die dazugehört - Ein Makro mit
Intersect(Selection, ...)auf einen Zielbereich beschränken - Warum
Intersect(∩, überschneiden) das Gegenteil von Union (∪, verbinden) ist - Mehrfach-Überschneidungen und die Regel des gleichen Blatts
Das mentale Modell: Intersect ist die Überschneidung zweier Bereiche
Geben Sie Intersect zwei Bereiche, und es gibt einen Bezug auf nur die Zellen zurück, die in
beiden liegen:
Dim shared As Range
Set shared = Intersect(Range("A1:D10"), Range("C5:F20"))
' shared ist C5:D10 - das Rechteck, das die beiden Bereiche gemeinsam haben
Teilen sich die beiden Bereiche nichts, gibt es kein gemeinsames Rechteck zurückzugeben, also gibt
Intersect Nothing zurück. Genau dieses Verhalten macht es nützlich: die Überschneidungszellen
selbst interessieren Sie selten — Sie interessiert, ob es überhaupt eine Überschneidung gibt. Aus
„liegt diese Zelle in jenem Bereich?“ wird „ist Intersect(cell, region) etwas statt Nothing?“
Intersect verwandelt eine Geometriefrage in einen einfachen Vorhandenseinstest.
Die wichtigste Regel: keine Überschneidung gibt Nothing zurück
Weil ein Fehlschlag Nothing zurückgibt, ist der Zugriff auf irgendeine Eigenschaft oder Methode
des Ergebnisses ohne vorherige Prüfung ein programmierter Absturz:
' FRAGIL - error 91, sobald sich die Bereiche nicht ueberschneiden:
MsgBox Intersect(Selection, Range("B:B")).Address
Wenn Selection nicht in Spalte B liegt, ist Intersect gleich Nothing, und .Address auf
Nothing löst den error 91, „Objektvariable oder With-Blockvariable nicht festgelegt.“ aus. Die
Lösung ist immer, zuerst mit Is Nothing zu prüfen, und die idiomatische Formulierung nutzt
If Not ... Is Nothing im Sinne von „wenn es eine Überschneidung gibt“:
If Not Intersect(Selection, Range("B:B")) Is Nothing Then
MsgBox "Your selection touches column B."
End If
Lesen Sie If Not (overlap) Is Nothing als „wenn die Überschneidung nicht nichts ist“ — also,
wenn sie existiert. Die zwei Fehler hier sind, das Not wegzulassen (was die Logik umkehrt) und die
Is Nothing-Prüfung wegzulassen (was bei einem Fehlschlag abstürzt). Prägen Sie sich die ganze
Formulierung ein; sie ist eine der meistgetippten Zeilen in ganz VBA.
Der entscheidende Einsatz: der Worksheet_Change-Schutz
Hier verdient sich Intersect seinen Platz. Ein Worksheet_Change-Ereignis feuert bei jeder
Bearbeitung irgendwo auf dem Blatt, und in 99 % der Fälle wollen Sie nur auf Änderungen in einer Spalte
oder einem Bereich reagieren. Ohne Schutz läuft Ihr Handler bei jedem Tastendruck über das ganze Blatt
— langsam und aufdringlich. Intersect ist der Schutz: Es fragt, ob die geänderte Zelle (Target) den
Bereich überschneidet, den Sie beobachten.
Private Sub Worksheet_Change(ByVal Target As Range)
' Nur handeln, wenn die Bearbeitung in den Datenbereich B2:B1000 faellt:
If Intersect(Target, Me.Range("B2:B1000")) Is Nothing Then Exit Sub
Application.EnableEvents = False ' KRITISCH - siehe unten
On Error GoTo CleanExit
Dim c As Range
For Each c In Intersect(Target, Me.Range("B2:B1000")).Cells
c.Offset(0, 1).Value = "edited " & Format(Now, "yyyy-mm-dd hh:nn")
Next c
CleanExit:
Application.EnableEvents = True ' immer wiederherstellen, auch nach einem Fehler
End Sub
Zwei Dinge machen das zum richtigen Muster. Erstens steigt die Schutzzeile If Intersect(...) Is Nothing Then Exit Sub bei jeder Bearbeitung außerhalb des Ziels früh aus, sodass der Rumpf nur läuft,
wenn er soll. Zweitens — und das ist die Falle, die jeden erwischt — schreibt der Handler in eine
Zelle, und in eine Zelle zu schreiben feuert Worksheet_Change erneut, was wieder schreibt, und
so weiter. Application.EnableEvents = False bricht diese Rekursion, und es muss in einem
CleanExit-Label wiederhergestellt werden, damit ein Fehler mitten im Handler Ereignisse nicht für den
Rest der Sitzung abgeschaltet lässt (siehe VBA On Error und
Worksheet_Change). Der Intersect-Schutz und der
EnableEvents-Schutz sind Geschwister — Sie wollen fast nie das eine ohne das andere.
Ein Makro auf einen Zielbereich beschränken
Derselbe Überschneidungstest grenzt ein gewöhnliches Makro auf einen Bereich ein. Angenommen, ein Formatierungsmakro soll nur Zellen anfassen, die der Benutzer innerhalb des Druckbereichs ausgewählt hat — überschneiden Sie die Auswahl mit dem Bereich und arbeiten Sie auf dem Ergebnis:
Dim scope As Range
Set scope = Intersect(Selection, Range("PrintArea"))
If scope Is Nothing Then
MsgBox "Select cells inside the print area first."
Exit Sub
End If
scope.Font.Bold = True ' nur die ausgewaehlten Zellen, die in PrintArea liegen
Das ist ein sauberes Muster, sauberer als jede ausgewählte Zellenadresse von Hand zu prüfen:
Intersect berechnet die Teilmenge innerhalb der Grenzen in einem Aufruf, und der Is Nothing-Zweig
behandelt den Fall „die Auswahl hat den Bereich ganz verfehlt“.
Intersect gegen Union: überschneiden gegen verbinden
Intersect (∩) und Union (∪) sind die beiden Mengenoperatoren auf Bereichen,
und sie ziehen in entgegengesetzte Richtungen. Union(A, B) lässt einen Bezug auf alles in einem der
beiden Bereiche wachsen. Intersect(A, B) schrumpft ihn auf nur das, was in beiden liegt, oder
Nothing. Union gibt nie Nothing zurück (Sie haben ihm echte Bereiche zum Verbinden gegeben);
Intersect gibt ständig Nothing zurück, und das ist sein Merkmal, kein Makel. Nutzen Sie Union, um
verstreute Zellen für eine Stapeloperation zu versammeln, und Intersect, um zu prüfen oder
einzugrenzen — um zu fragen, ob eine Bearbeitung, eine Auswahl oder eine Zelle in einen Bereich fällt,
der Sie interessiert.
Mehrfach-Überschneidungen und die Regel des gleichen Blatts
Intersect akzeptiert mehr als zwei Bereiche und gibt die Zellen zurück, die allen gemeinsam sind
— Intersect(rngA, rngB, rngC) ist der Bereich, den jedes Argument abdeckt. Wie bei Union muss jeder
Bereich auf demselben Arbeitsblatt liegen, sonst gibt es error 1004. Und dieselbe Disziplin gilt
für das Ergebnis: Könnte die Überschneidung leer sein, prüfen Sie Is Nothing, bevor Sie es nutzen —
bei drei oder mehr Bereichen ist eine leere Überschneidung noch wahrscheinlicher als bei zweien.
Wie ExcelMaster hilft
Intersect ist eine kleine Methode, die zwei leicht zu vergessende Regeln verbirgt: Is Nothing
prüfen, bevor Sie das Ergebnis anfassen, und den Ereignisschutz mit EnableEvents = False paaren,
damit eine selbst ausgelöste Änderung nicht ausufert. Vergessen Sie die erste, stürzen Sie mit
error 91 ab; vergessen Sie die zweite, feuert sich ein Worksheet_Change-Handler selbst in ein
Flackern oder ein Hängen.
ExcelMaster lässt Sie stattdessen
das Verhalten beschreiben. Sagen Sie „wenn jemand Spalte B bearbeitet, trage die Uhrzeit in Spalte C
ein“, und es schreibt den Intersect(Target, ...)-Schutz, das frühe Exit Sub, den
EnableEvents-Schalter und die CleanExit-Wiederherstellung — das ganze robuste Ereignismuster, nicht
nur den Idealfall. Sie behalten die Arbeitsmappe und den Code; Sie sparen sich die Debugging-Sitzung,
in der der Handler auf der falschen Zelle feuerte oder sich selbst in eine Schleife brachte.
Häufig gestellte Fragen
Was macht die Intersect-Methode in Excel VBA?
Intersect gibt einen Bereich der Zellen zurück, die zwei oder mehr Bereiche gemeinsam haben —
ihre Überschneidung. Intersect(Range("A1:D10"), Range("C5:F20")) gibt C5:D10 zurück. Überschneiden
sich die Bereiche gar nicht, gibt Intersect Nothing zurück, weshalb es genutzt wird, um zu prüfen,
ob ein Bereich innerhalb eines anderen liegt.
Warum gibt Intersect Nothing zurück und bringt meinen Code zum Absturz?
Teilen sich die Bereiche keine Zellen, gibt Intersect Nothing zurück statt eines leeren Bereichs.
Der Zugriff auf irgendeine Eigenschaft davon — .Address, .Cells, .Value — löst dann den
error 91 aus. Prüfen Sie immer zuerst mit If Not Intersect(a, b) Is Nothing Then (im Sinne von
„wenn es eine Überschneidung gibt“), bevor Sie das Ergebnis nutzen.
Wie nutze ich Intersect in einem Worksheet_Change-Ereignis?
Sichern Sie den Handler ab, damit er nur auf Bearbeitungen innerhalb Ihres Zielbereichs reagiert:
If Intersect(Target, Me.Range("B2:B1000")) Is Nothing Then Exit Sub. Setzen Sie dann
Application.EnableEvents = False, bevor Sie in irgendeine Zelle schreiben — sonst löst Ihr Schreiben
Worksheet_Change erneut aus —, und stellen Sie es in einem CleanExit-Label auf True zurück, damit
ein Fehler Ereignisse nicht abgeschaltet lassen kann.
Was ist der Unterschied zwischen Intersect und Union in VBA?
Es sind gegensätzliche Mengenoperationen. Intersect gibt nur die Zellen in beiden Bereichen
zurück (die Überschneidung), oder Nothing, wenn sie sich nicht berühren. Union gibt die Zellen in
einem der beiden Bereiche zurück (die kombinierte Fläche). Nutzen Sie Intersect, um einen Bereich
zu prüfen oder einzugrenzen, und Union, um verstreute Zellen zu einem Bezug zusammenzustellen.
Kann Intersect mehr als zwei Bereiche annehmen?
Ja. Intersect(rngA, rngB, rngC) gibt die Zellen zurück, die allen Bereichen gemeinsam sind. Jeder
Bereich muss auf demselben Arbeitsblatt liegen, und das Ergebnis kann Nothing sein, wenn die Bereiche
keine gemeinsame Zelle teilen — was bei drei oder mehr Bereichen wahrscheinlicher ist, prüfen Sie also
immer Is Nothing.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 16.08.2026.
Verwandte Anleitungen: VBA Union · VBA SpecialCells · VBA Worksheet_Change · VBA On Error · VBA Range
