TL;DR —
With object … End Withlässt Sie ein Objekt einmal benennen und dann seine Member mit einem nackten führenden Punkt erreichen:.Value,.Font.Bold,.Interior.Color. Es ist weniger Tippen, es liest sich sauberer, und es ist tatsächlich schneller, weil VBA die Objektreferenz ein einziges Mal auflöst statt in jeder Zeile. Der ganze Trick steckt in diesem führenden Punkt:.Fontbindet an IhrWith-Objekt; das nackteFontnicht — es fällt auf ein implizites Objekt zurück (meist das aktive Blatt) und ändert klammheimlich das falsche Ding.
With Sheets("Report").Range("A1")
.Value = "Total" ' jeder Punkt bedeutet: Sheets("Report").Range("A1") . ...
.Font.Bold = True
.Font.Size = 14
.Interior.Color = vbYellow
End With
Tiefe Objektpfade sind in Excel VBA überall:
ThisWorkbook.Worksheets("Data").Range("A1").Font.…. Diesen Präfix in zehn
aufeinanderfolgenden Zeilen zu tippen ist mühsam, langsam in der Ausführung und
schwer zu lesen — und müssen Sie ihn je auf eine andere Zelle umlenken, bearbeiten
Sie zehn Stellen. With behebt alle drei auf einmal: Nennen Sie das Objekt in der
ersten Zeile, dann lassen Sie jede Zeile im Block mit einem Punkt daran hängen. Es
ist eines der einfachsten Konstrukte der Sprache und eines der am leichtesten subtil
falsch zu machenden.
Was Sie lernen
- Das mentale Modell —
Withklammert einen wiederholten Präfix aus, wie2(a+b)in der Algebra - Warum es nicht nur ordentlicher ist:
Withlöst die Objektreferenz einmal auf - Die Falle des fehlenden Punkts —
Fontvs..Font— und warum sie stillschweigend scheitert - Wie verschachtelte
With-Blöcke den Punkt auflösen und warum Sie bei zwei aufhören sollten - Das
With+For Each-Idiom, das diesen Cluster zusammenbindet
Das mentale Modell: den wiederholten Präfix ausklammern
Denken Sie an With als Ausklammern, so wie Sie 2*a + 2*b + 2*c als
2*(a + b + c) umschreiben. Das Wiederholte — hier der Objektpfad
Sheets("Report").Range("A1") — wird einmal genannt, und alles innerhalb der
Klammern wird als damit multipliziert verstanden. In VBA sind die „Klammern“
With … End With, und das „damit multiplizieren“ ist der führende Punkt.
' Ohne With — der Präfix wiederholt sich in jeder Zeile
Sheets("Report").Range("A1").Value = "Total"
Sheets("Report").Range("A1").Font.Bold = True
Sheets("Report").Range("A1").Font.Size = 14
' Mit With — einmal nennen, hineinpunkten
With Sheets("Report").Range("A1")
.Value = "Total"
.Font.Bold = True
.Font.Size = 14
End With
Beide tun genau dasselbe. Das zweite ist kürzer, lenkt in einer einzigen Bearbeitung
um und — wie der nächste Abschnitt zeigt — läuft tatsächlich schneller. Alles
innerhalb des Blocks bezieht sich implizit auf das Objekt in der With-Zeile.
Die Regel, die es mehr als kosmetisch macht: das Objekt wird einmal aufgelöst
With bedeutet nicht nur weniger Tippen. Wenn VBA
Sheets("Report").Range("A1").Font in zehn getrennten Zeilen sieht, läuft es diese
ganze Kette zehnmal neu ab — das Blatt nachschlagen, den Bereich auflösen, die
Schrift holen — in jeder einzelnen Zeile. Innerhalb eines With-Blocks löst VBA das
Objekt einmal auf, beim Eintritt, und verwendet diese aufgelöste Referenz für
jeden gepunkteten Member wieder.
Bei ein paar Zeilen ist der Unterschied unsichtbar. Innerhalb einer Schleife über Tausende von Zellen ist er real:
Dim cell As Range
For Each cell In Range("A1:A10000")
With cell
.Value = .Value * 1.1 ' 'cell' einmal pro Iteration auflösen...
.NumberFormat = "0.00" ' ...nicht dreimal
.Font.Color = vbBlue
End With
Next cell
Ohne das With dereferenziert jedes cell. das Bereichsobjekt in jeder Zeile neu;
mit ihm passiert diese Dereferenzierung einmal pro Iteration. Die Regel: wenn Sie
drei oder mehr Member desselben Objekts berühren — besonders innerhalb einer
Schleife —, packen Sie sie in ein With. Es ist die seltene
Lesbarkeitsverbesserung, die Ihnen zugleich Tempo bringt.
Die Falle, die das falsche Objekt ändert: der fehlende führende Punkt
Das ist der Bug, der With gefährlich statt bloß hilfreich macht. Der führende
Punkt ist es, der einen Member an das With-Objekt bindet. Lassen Sie ihn weg,
wirft der Member keinen Fehler — er bindet an etwas anderes:
With Sheets("Report").Range("A1")
.Value = "Total"
Font.Bold = True ' BUG: kein führender Punkt — das ist NICHT die Schrift des With-Objekts
End With
.Font.Bold bedeutet Sheets("Report").Range("A1").Font.Bold. Aber Font.Bold —
ohne Punkt — ist eine unqualifizierte Referenz. VBA löst sie gegen den impliziten
Kontext des aktiven Blatts auf, also bekommen Sie entweder einen
Kompilierungsfehler oder, schlimmer, Sie formatieren klammheimlich eine Zelle auf
welchem Blatt auch immer gerade aktiv ist. Nichts warnt Sie; das With-Objekt
bleibt schlicht unangetastet, während sich ein anderes Objekt ändert.
Die Regel ist mechanisch und wert, sie sich einzubrennen: innerhalb eines
With-Blocks muss jeder Member, der zum Objekt gehört, mit einem Punkt beginnen.
Wenn Sie einen With-Block prüfen, scannen Sie den linken Rand — alles, was nicht
mit . beginnt, ist entweder eine bewusste Referenz auf ein anderes Objekt oder
ein Bug. (Das ist dieselbe Familie von „implizitem ActiveSheet“-Fehler, die in
VBA ActiveSheet behandelt wird — ein unqualifiziertes
Range oder Cells hängt sich klammheimlich an das gerade aktive Blatt.)
Die Regel fürs Verschachteln: der Punkt bindet an das nächste With
Sie können With-Blöcke verschachteln, und es ist wirklich nützlich, um in ein
Unterobjekt hineinzubohren. Aber die Auflösungsregel erwischt Leute: ein führender
Punkt bindet immer an das innerste With.
With Sheets("Report")
.Range("A1").Value = "Report" ' ein Punkt -> das Blatt
With .Range("A2").Font ' ein inneres With auf der Schrift öffnen
.Bold = True ' .Bold -> die SCHRIFT (innerste), nicht das Blatt
.Size = 12
End With
.Range("A3").Value = "Done" ' nach End With zurück zum Blatt
End With
Innerhalb des inneren Blocks gehört .Bold der Schrift, nicht dem Blatt. Das ist
auf zwei Ebenen korrekt und lesbar — aber auf drei oder vier wird es zum Ratespiel,
welches Objekt jeder Punkt meint. Die Regel: verschachteln Sie höchstens zwei
With-Blöcke. Tiefer als das, weisen Sie eine Zwischenobjektvariable zu
(Set fnt = .Range("A2").Font) und geben Sie dem Leser einen Namen statt eines
Stapels von Punkten.
Das Idiom, das den Cluster zusammenhält: With + For Each
With und For Each sind natürliche Partner. For Each
reicht Ihnen ein Objekt nach dem anderen; With lässt Sie dieses Objekt sauber
bearbeiten, ohne die Schleifenvariable zu wiederholen:
Dim cell As Range
For Each cell In Sheets("Data").Range("B2:B100")
With cell
If .Value < 0 Then
.Interior.Color = vbRed
.Font.Bold = True
End If
End With
Next cell
Lesen Sie es laut vor, und es ist fast Deutsch: „für jede Zelle, mit dieser Zelle —
wenn sie negativ ist, färbe sie rot und mache sie fett.“ Diese Paarung — For Each,
um die Collection zu durchlaufen, With, um auf jedes Mitglied zu wirken — ist das
Rückgrat sauberer Formatierungs- und Datenmarkierungs-Makros über einen
Range hinweg.
Wie ExcelMaster hilft
With ist eine kleine Sache, die tausendfach getan wird: den Präfix ausklammern, an
den Punkt denken, nicht zu tief verschachteln. Es ist genau die Art mechanischer
Sorgfalt, die lesbare Makros von brüchigen trennt — und genau die Art Sache, über
die Sie lieber nicht nachdenken würden, wenn Sie einfach nur ein Blatt formatiert
haben wollen.
ExcelMaster lässt Sie
stattdessen das Ergebnis beschreiben. Sagen Sie „färbe im Blatt Data jeden negativen
Wert in Spalte B rot und mache ihn fett“, und es schreibt und führt die Logik aus —
qualifiziert jede Objektreferenz korrekt, sodass der stille „falsches Blatt“-Bug, den
der fehlende Punkt verursacht, schlicht nicht passieren kann. Wenn Sie ein Makro nach
Zeitplan von Hand schreiben, greifen Sie weiterhin selbst zu With; für die
alltägliche Formatierungs- und Markierungsaufgabe schlägt das Beschreiben dessen, was
Sie wollen, das fehlerfreie Setzen jedes führenden Punkts von Hand.
Häufig gestellte Fragen
Was macht die With-Anweisung in VBA?
With object … End With benennt ein Objekt einmal, sodass Sie seine Member mit einem
nackten führenden Punkt (.Value, .Font.Bold) ansprechen können, statt den vollen
Objektpfad in jeder Zeile zu wiederholen. Es macht Code kürzer, leichter umzulenken
und schneller — weil VBA die Objektreferenz ein einziges Mal beim Eintritt auflöst
statt in jeder Zeile.
Warum ändert mein With-Block nicht das richtige Objekt?
Fast immer ein fehlender führender Punkt. Innerhalb von With obj bezieht sich
.Font auf obj, aber Font ohne Punkt ist eine unqualifizierte Referenz, die an
den impliziten Kontext des aktiven Blatts bindet — also ändern Sie klammheimlich das
falsche Objekt. Jeder Member, der zum With-Objekt gehört, muss mit einem Punkt
beginnen.
Macht die With-Anweisung VBA wirklich schneller?
Ja, mäßig, und es zählt innerhalb von Schleifen. VBA löst das Objekt in der
With-Zeile einmal auf und verwendet diese Referenz für jeden gepunkteten Member
wieder, statt die volle Objektkette in jeder Zeile neu abzulaufen. Bei zwei oder drei
Zeilen merken Sie es nicht; über Tausende von Iterationen summieren sich die
eingesparten Neu-Dereferenzierungen.
Kann ich With-Anweisungen in VBA verschachteln?
Ja. Ein führender Punkt bindet immer an das innerste aktive With, also macht
With .Range("A2").Font innerhalb von With Sheets("Report") .Bold zu der der
Schrift. Es ist auf zwei Ebenen lesbar, aber tiefere Verschachtelung macht es schwer
zu erkennen, auf welches Objekt sich jeder Punkt bezieht — weisen Sie eine
Zwischenobjektvariable zu, statt drei oder mehr Ebenen tief zu verschachteln.
Kann ich das With-Objekt selbst innerhalb des Blocks ändern?
Nein — die With-Referenz ist fest, sobald der Block betreten wird. Sie können nicht
mittendrin umlenken, worauf With zeigt; um an einem anderen Objekt zu arbeiten,
schließen Sie den Block mit End With und öffnen einen neuen. Sie können die
Member des Objekts frei lesen und ändern, es nur nicht umlenken.
Getestet in
Getestet mit: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 01.08.2026.
Verwandte Anleitungen: VBA For Each · VBA Collection · VBA Range · VBA ActiveSheet · VBA For-Schleife
