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

VBA Union in Excel — Nicht benachbarte Bereiche zu einem Bezug verbinden (und warum es keine Duplikate entfernt)

|

VBA Union in Excel — Nicht benachbarte Bereiche zu einem Bezug verbinden (und warum es keine Duplikate entfernt)

TL;DRUnion fügt verstreute Rechtecke zu einem Bezug zusammen, sodass Sie mehrere nicht benachbarte Blöcke auf einmal bearbeiten können. Es ist die Code-Fassung davon, mehrere Bereiche mit gedrückter Strg-Taste anzuklicken. Die wichtigste Regel: Union fügt aneinander, es entfernt keine Duplikate — überlappende Zellen werden doppelt gezählt, es ist also eine Stapelliste, keine mathematische Vereinigung. Seine nützlichste Form ist das Sammelmuster, das Zellen in einer Schleife einsammelt und sie einmal bearbeitet:

Dim flagged As Range, c As Range
For Each c In ThisWorkbook.Worksheets("Data").Range("B2:B1000")
    If c.Value < 0 Then
        If flagged Is Nothing Then Set flagged = c Else Set flagged = Union(flagged, c)
    End If
Next c
If Not flagged Is Nothing Then flagged.Interior.Color = vbRed   ' jeden Treffer in einem Aufruf einfaerben

Jeder Bezug bisher hielt ein Rechteck. Union sprengt diese Grenze: eine einzige Bereichsvariable kann nun B2, D5:D9 und F1 gleichzeitig halten, und eine einzige Zeile färbt, leert oder kopiert alle drei. Wo SpecialCells Excel eine nicht zusammenhängende Menge für Sie auswählen lässt, lässt Union Sie eine gezielt bauen. Diese Anleitung ruht auf einer Idee — Union ist, wie Sie einen Stapel zusammenstellen, um ihn einmal zu bearbeiten, kein Weg, eine duplikatfreie Menge zu berechnen. Verstehen Sie das, und sowohl die .Count-Überraschung als auch der Nothing-Fehler ergeben Sinn.

Was Sie lernen

  • Das mentale Modell — Union verbindet nicht benachbarte Bereiche zu einem Bezug (Strg-Klick im Code)
  • Die wichtigste Regel — es fügt aneinander, entfernt keine Duplikate, Überschneidungen zählen also doppelt
  • Das Sammelmuster — If Is Nothing ... Else Union und warum es einen Laufzeitfehler vermeidet
  • Stapeloperationen — viele Blöcke in einem Aufruf einfärben, leeren oder kopieren statt in einer Schleife
  • Die Grenzen — mindestens zwei Argumente, kein Nothing, alle Bereiche auf demselben Blatt
  • Wie sich Union (∪, verbinden) von Intersect (∩, überschneiden) unterscheidet

Das mentale Modell: Union verbindet nicht benachbarte Bereiche zu einem Bezug

Union nimmt zwei oder mehr Bereiche und gibt einen einzigen Bereich zurück, der alle abdeckt:

Dim multi As Range
Set multi = Union(Range("A1:A3"), Range("C1:C3"), Range("E1"))
multi.Interior.Color = vbYellow   ' drei getrennte Bloecke, zusammen hervorgehoben

Dieser Bezug verhält sich bei den meisten Operationen wie jeder andere Bereich — ein .Interior.Color, ein .ClearContents, ein .Copy fasst jeden Block an. Stellen Sie sich vor, Sie wählen Zellen von Hand mit gedrückter Strg-Taste: Sie klicken A1:A3, dann C1:C3, dann E1, und nun bewegen sie sich als Gruppe. Union ist dieser Strg-Klick in Code ausgedrückt, und es ist der einzige Weg, einer einzigen Operation eine einzige nicht benachbarte Auswahl zu übergeben.

Die wichtigste Regel: Union fügt aneinander, es entfernt keine Duplikate

Hier führt der Name in die Irre. In der Mengenlehre entfernt eine „Vereinigung“ Duplikate. VBAs Union tut das nicht. Es näht die Bereiche unverändert zusammen, sodass Zellen, die in mehr als einem Argument vorkommen, doppelt gezählt werden:

Dim u As Range
Set u = Union(Range("A1:A5"), Range("A3:A8"))
Debug.Print u.Count    ' gibt 11 aus  (5 + 6), NICHT 8 - A3:A5 doppelt gezaehlt

Die Überschneidung A3:A5 ist aus beiden Argumenten enthalten, .Count meldet also 11 für das, was nur 8 verschiedene Zellen sind. Das ist harmlos, solange Sie auf dem Bezug arbeiten — dieselbe Zelle zweimal einzufärben schadet nicht —, aber es ist ein echter Bug, wenn Sie das Ergebnis mit .Count zählen, aufsummieren oder irgendwohin geben, das verschiedene Zellen voraussetzt. Die Lehre: Nutzen Sie Union, um Zellen zum Bearbeiten zusammenzustellen, nie, um zu berechnen, wie viele verschiedene Zellen Sie haben. Brauchen Sie wirklich eine duplikatfreie Menge, filtern Sie die Daten stattdessen mit einem AutoFilter.

Das Sammelmuster: einen Bezug in einer Schleife aufbauen

Der wertvollste Einsatz von Union ist, Treffer während einer Schleife einzusammeln und sie am Ende einmal zu bearbeiten. Aber es gibt einen Haken: Union verlangt mindestens zwei echte Bereiche und weist Nothing zurück, sodass Union(rngAll, c) in der ersten Iteration scheitert, wenn rngAll noch leer ist. Das übliche Idiom sichert die erste Zelle ab:

Dim rngAll As Range, c As Range
For Each c In Range("A2:A1000")
    If Len(Trim(c.Value)) = 0 Then                 ' was auch immer Ihre Bedingung ist
        If rngAll Is Nothing Then
            Set rngAll = c                          ' erster Treffer - direkt setzen
        Else
            Set rngAll = Union(rngAll, c)           ' spaetere Treffer - den Bezug erweitern
        End If
    End If
Next c
If Not rngAll Is Nothing Then rngAll.EntireRow.Delete   ' ein Delete fuer jeden Treffer

Lesen Sie den Schutz so: den Bezug mit dem ersten Treffer bestücken, dann alle weiteren per Union daran anfügen. Den Zweig If rngAll Is Nothing wegzulassen ist der häufigste Union-Fehler — Nothing als Argument zu übergeben löst einen Laufzeitfehler aus, sobald die Schleife ihren ersten Treffer findet.

Stapeloperationen: ein Aufruf statt einer Schleife pro Zelle

Warum überhaupt einen Bezug zusammenstellen, statt einfach jede Zelle zu bearbeiten, sobald man sie findet? Tempo. Das Arbeitsblatt einmal pro Zelle anzufassen ist der Hauptgrund, warum Makros kriechen. Sammeln Sie die Zellen mit Union und führen Sie dann eine Operation auf der ganzen Gruppe aus — in der Schleife entscheiden, auf den Bereich anwenden:

' Langsam: schreibt bei jeder passenden Zeile ins Blatt
For Each c In rng
    If c.Value > 100 Then c.Interior.Color = vbGreen   ' ein Blattzugriff pro Treffer
Next c

' Schnell: erst sammeln, dann einmal einfaerben
For Each c In rng
    If c.Value > 100 Then _
        Set hot = IIf(hot Is Nothing, c, Union(hot, c))
Next c
If Not hot Is Nothing Then hot.Interior.Color = vbGreen   ' ein einziger Blattzugriff

Das ist dieselbe Disziplin, die der Leitfaden zu VBA Cell Color fürs Hervorheben empfiehlt: die Ziele sammeln, das Format einmal anwenden. Bei Tausenden Zeilen ist der Unterschied Sekunden gegen Millisekunden.

Die Grenzen: zwei Argumente, kein Nothing, dasselbe Blatt

Drei Einschränkungen erwischen die Leute, und alle drei sind schnell gesagt:

  • Mindestens zwei Bereiche. Union braucht zwei oder mehr Argumente, und keines davon darf Nothing sein — daher der Sammelschutz oben.
  • Dasselbe Arbeitsblatt. Jeder Bereich, den Sie vereinen, muss auf demselben Blatt liegen. Bereiche von zwei Blättern zu kombinieren wirft den error 1004; brauchen Sie blattübergreifende Arbeit, verarbeiten Sie die Vereinigung jedes Blatts einzeln.
  • Das Ergebnis hat mehrere Bereiche. Wie bei SpecialCells ist eine Vereinigung ein nicht zusammenhängender Bezug. Schleifen Sie For Each area In u.Areas, wenn Sie jeden zusammenhängenden Block brauchen, und denken Sie daran, dass .Count jede Zelle über alle Bereiche summiert (Überschneidungen doppelt gezählt).

Union gegen Intersect: verbinden gegen überschneiden

Union und Intersect sind die beiden Mengenoperatoren auf Bereichen, und sie sind Gegensätze. Union(A, B) gibt alles zurück, was in A oder B liegt — die kombinierte Fläche. Intersect(A, B) gibt nur zurück, was in beiden liegt — die Überschneidung, oder Nothing, wenn sie sich nicht berühren. Union lässt einen Bezug wachsen; Intersect schrumpft ihn auf den gemeinsamen Teil. Greifen Sie zu Union, um verstreute Zellen zu einem Stapel zusammenzustellen, und zu Intersect, um zu prüfen oder einzugrenzen — am berühmtesten für die Frage „hat der Benutzer eine Zelle innerhalb des Bereichs bearbeitet, der mich interessiert?“

Wie ExcelMaster hilft

Union ist trügerisch einfach: den Sammelschutz vergisst man leicht bei der ersten Iteration, die .Count-Doppelzählung verfälscht still jede Summe, und „nur dasselbe Blatt“ taucht als ein 1004 auf, mit dem Sie nicht gerechnet haben. Keiner davon zeigt sich, bis genau die Eingabe kommt, die ihn auslöst.

ExcelMaster lässt Sie stattdessen das Ergebnis beschreiben. Sagen Sie „hebe jede Zeile hervor, in der der Saldo negativ ist“ oder „lösche alle leeren Zeilen in Spalte A“, und es schreibt die Schleife, bestückt den Bezug mit dem ersten Treffer, erweitert ihn mit Union und führt eine Operation auf der ganzen Gruppe aus — die schnelle, abgesicherte Fassung, ohne den Nothing-Absturz oder die Verlangsamung Zelle für Zelle. Sie behalten die Arbeitsmappe und den Code; Sie sparen sich den Durchlauf, in dem die Schleife das Blatt zehntausendmal anfasste.

Häufig gestellte Fragen

Was macht die Union-Methode in Excel VBA?

Union verbindet zwei oder mehr Bereiche zu einem einzigen Bezug, der sie alle abdeckt, auch wenn sie nicht nebeneinander liegen. Sie können dann jeden Block in einer Operation einfärben, leeren, kopieren oder löschen. Es ist das Code-Äquivalent dazu, mehrere Bereiche auf einem Blatt mit gedrückter Strg-Taste anzuklicken, sodass sie als eine Auswahl wirken.

Entfernt VBA Union doppelte Zellen?

Nein. Union fügt die Bereiche ohne Duplikatentfernung aneinander, sodass eine Zelle, die in mehr als einem Argument vorkommt, doppelt gezählt wird. Union(Range("A1:A5"), Range("A3:A8")).Count gibt 11 zurück, nicht 8. Das ist harmlos, wenn Sie auf dem Bezug arbeiten, aber falsch, wenn Sie ihn zählen oder aufsummieren — nutzen Sie Union, um Zellen zum Bearbeiten zusammenzustellen, nicht, um eine duplikatfreie Menge zu berechnen.

Warum wirft Union in einer Schleife einen Fehler?

Weil Union mindestens zwei echte Bereiche verlangt und Nothing zurückweist. In der ersten Iteration ist Ihre Sammelvariable noch Nothing, also scheitert Union(rngAll, c). Sichern Sie es ab: If rngAll Is Nothing Then Set rngAll = c Else Set rngAll = Union(rngAll, c) — mit dem ersten Treffer bestücken, dann den Rest vereinen.

Kann Union Bereiche aus verschiedenen Arbeitsblättern verbinden?

Nein. Alle an Union übergebenen Bereiche müssen auf demselben Arbeitsblatt liegen; Blätter zu mischen wirft den error 1004. Müssen Sie blattübergreifend arbeiten, bauen und verarbeiten Sie für jedes Blatt eine eigene Vereinigung.

Was ist der Unterschied zwischen Union und Intersect in VBA?

Es sind gegensätzliche Mengenoperationen auf Bereichen. Union gibt alles zurück, was in einem der beiden Bereiche liegt — die kombinierte Fläche. Intersect gibt nur zurück, was in beiden liegt — die Überschneidung, oder Nothing, wenn sie sich nicht berühren. Nutzen Sie Union, um verstreute Zellen zu einem Stapel zusammenzustellen, und Intersect, um zu prüfen, ob ein Bereich innerhalb eines anderen liegt.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 16.08.2026.

Verwandte Anleitungen: VBA Intersect · VBA SpecialCells · VBA Range · VBA Cell Color · VBA For-Schleife