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

VBA With-Anweisung in Excel — das Objekt einmal schreiben (und der führende Punkt, der alles entscheidet)

|

VBA With-Anweisung in Excel — das Objekt einmal schreiben (und der führende Punkt, der alles entscheidet)

TL;DRWith object … End With lä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: .Font bindet an Ihr With-Objekt; das nackte Font nicht — 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 — With klammert einen wiederholten Präfix aus, wie 2(a+b) in der Algebra
  • Warum es nicht nur ordentlicher ist: With löst die Objektreferenz einmal auf
  • Die Falle des fehlenden Punkts — Font vs. .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