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

VBA Intersect in Excel — Finden, wo sich zwei Bereiche überschneiden (und der Worksheet_Change-Schutz, den jeder nutzt)

|

VBA Intersect in Excel — Finden, wo sich zwei Bereiche überschneiden (und der Worksheet_Change-Schutz, den jeder nutzt)

TL;DRIntersect gibt nur die Zellen zurück, die sich zwei Bereiche teilen. Berühren sie sich nicht, gibt es Nothing zurück — keinen leeren Bereich, keinen Fehler — und dieses Nothing ist der ganze Sinn. Sein wichtigster Einsatz ist, ein Worksheet_Change-Ereignis so abzusichern, dass es nur auf Bearbeitungen in der Spalte reagiert, die Sie interessiert. Die wichtigste Regel: keine Überschneidung bedeutet Nothing, sodass jeder Zugriff auf eine Eigenschaft ohne Is Nothing-Prüfung mit error 91 abstü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 — Intersect gibt die Überschneidung zweier Bereiche zurück, oder Nothing, wenn sie sich verfehlen
  • Die wichtigste Regel — keine Überschneidung ist Nothing, also mit Is Nothing absichern, sonst gibt es error 91
  • Der entscheidende Einsatz — der Worksheet_Change-Schutz und die EnableEvents-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