Arbeiten mit Bereichen
Swipe um das Menü anzuzeigen
Bereiche auswählen
Dies wird beim Erkunden verwendet; Produktionscode vermeidet .Select und referenziert Bereiche direkt:
ws.Range("A1:I1").Select ' fine for exploring
ws.Range("A1:I1").Font.Bold = True ' better — skips Select entirely
Offset
Verschiebt eine Referenz relativ zu sich selbst — zu lesen als (Zeilen nach unten, Spalten nach rechts), wobei negative Zahlen nach oben oder links verschieben:
Dim orderCell As Range
Set orderCell = ws.Range("A2") ' ORD1001
Debug.Print orderCell.Offset(1, 0).Value ' one row down → ORD1002
Debug.Print orderCell.Offset(0, 2).Value ' two columns right → Acme Corp
Debug.Print orderCell.Offset(-1, 0).Value ' one row up → the header, "Order ID"
Größe ändern
Ändert, wie viele Zeilen oder Spalten ein Bereich umfasst, wobei die linke obere Ecke fixiert bleibt:
Dim headerRow As Range
Set headerRow = ws.Range("A1")
Set headerRow = headerRow.Resize(1, 9) ' now covers A1:I1, the full header
Kombinieren Sie Offset und Resize, um "alles unterhalb der Kopfzeile" zu erfassen, ohne die Zeilenanzahl im Voraus zu kennen:
Dim dataRange As Range
Set dataRange = ws.Range("A1").CurrentRegion
Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)
' dataRange now covers A2:I6 — every order, no header
Benannte Bereiche
Weisen Sie einem Bereich einen verständlichen Namen zu, den Sie anstelle einer Adresse verwenden können:
ThisWorkbook.Names.Add Name:="OrdersTable", RefersTo:=ws.Range("A1:I6")
Debug.Print ws.Range("OrdersTable").Rows.Count
Aufgabe
- Beginnen Sie mit Range("A2") (ORD1001) und verwenden Sie
Offset, um das Produkt und den Gesamtbetrag für die Bestellung zwei Zeilen darunter (ORD1003) auszugeben — ohne jemals "A4", "D4" oder "H4" einzugeben. - Verwenden Sie
CurrentRegion,OffsetundResizegemeinsam, um nur die Datenzeilen (ohne Kopfzeile) auszuwählen und geben Sie aus, wie viele Zeilen dieser Bereich enthält. - Erstellen Sie einen benannten Bereich mit dem Namen
OrdersData, der denselben nur-Daten-Bereich abdeckt, und bestätigen Sie, dass Sie ihn im Direktfenster per Namen referenzieren können.
1. Verwenden von Offset von A2, um ORD1003 zu erreichen
- Beginne damit, eine
Range-Variable aufA2zu setzen – das ist die Ankerzelle, genau wie im durchgearbeiteten Beispiel des Kapitels. - "Zwei Zeilen darunter" und "gleiche Spalte" bedeutet, dass das erste
Offset-Argument (Zeilen) 2 und das zweite (Spalten) 0 ist – für die Spalte Product. - Total ist eine andere Spalte, aber gleiche Zeile – daher ändert sich nur die Spalten-Offset-Zahl zwischen den beiden
Offset-Aufrufen, nicht die Zeilen-Offset-Zahl. - Spalten von der Position A2 aus zählen: Product ist 3 Spalten rechts von Order ID; Total ist 7 Spalten rechts.
2. Kombination von CurrentRegion, Offset und Resize
CurrentRegionaufA1liefert die gesamte Tabelle, einschließlich Kopfzeile.Offset(1, 0)verschiebt diesen gesamten Block um eine Zeile nach unten – genug, um die Kopfzeile oben abzuschneiden.Resizemuss die Zeilenanzahl um genau denselben Betrag verkleinern, um den die Verschiebung erfolgte, sonst ragt der untere Rand eine Zeile über die echten Daten hinaus.
3. Erstellen und Testen eines benannten Bereichs
- Benannte Bereiche werden über
ThisWorkbook.Names.Addhinzugefügt, wobei einName:=und einRefersTo:=vergeben wird – der genaue Bereichsausdruck aus Hinweis 2 kann wiederverwendet werden, anstatt ihn erneut von Grund auf zu erstellen. - Um später darauf zuzugreifen, verwende
Range("OrdersData")– der Name wird zu einem einfachen String, nicht zu einer Variablen.
Sub NavigateWithoutHardcoding()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Orders")
' --- 1. Offset from A2 to reach ORD1003 ---
Dim orderCell As Range
Set orderCell = ws.Range("A2")
Debug.Print orderCell.Offset(2, 3).Value ' Product
Debug.Print orderCell.Offset(2, 7).Value ' Total
' --- 2. CurrentRegion + Offset + Resize ---
Dim dataRange As Range
Set dataRange = ws.Range("A1").CurrentRegion
Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)
Debug.Print "Data rows: " & dataRange.Rows.Count
' --- 3. Named range ---
ThisWorkbook.Names.Add Name:="OrdersData", RefersTo:=dataRange
End Sub
Führe das Sub aus (F5), dann im Direktfenster (Ctrl+G) eingeben:
?Range("OrdersData").Rows.Count
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen