Arbeta med områden
Svep för att visa menyn
Markera områden
Detta görs vid utforskning, produktionskod undviker .Select och refererar istället direkt till områden:
ws.Range("A1:I1").Select ' fine for exploring
ws.Range("A1:I1").Font.Bold = True ' better — skips Select entirely
Offset
Flyttar en referens relativt till sig själv — läses som (rader ned, kolumner åt höger), med negativa tal för att gå uppåt eller åt vänster:
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"
Ändra storlek
Ändrar hur många rader eller kolumner ett område omfattar, med det övre vänstra hörnet oförändrat:
Dim headerRow As Range
Set headerRow = ws.Range("A1")
Set headerRow = headerRow.Resize(1, 9) ' now covers A1:I1, the full header
Kombinera Offset och Resize för att hämta "allt under rubriken" utan att veta antal rader i förväg:
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
Namngivna områden
Tilldela ett område ett lättförståeligt namn som kan användas istället för en adress:
ThisWorkbook.Names.Add Name:="OrdersTable", RefersTo:=ws.Range("A1:I6")
Debug.Print ws.Range("OrdersTable").Rows.Count
Uppgift
- Börja från Range("A2") (ORD1001), använd
Offsetför att skriva ut Produkt och Total för beställningen två rader nedanför (ORD1003) — utan att någonsin skriva "A4", "D4" eller "H4". - Använd
CurrentRegion,OffsetochResizetillsammans för att markera endast dataraderna (ingen rubrik) och skriv ut hur många rader det området innehåller. - Skapa ett namngivet område kallat
OrdersDatasom täcker samma dataområde och bekräfta att du kan referera till det med namn i Immediate Window.
1. Använda Offset från A2 för att nå ORD1003
- Börja med att sätta en
Range-variabel tillA2— detta är din ankarecell, precis som i kapitlets genomgångsexempel. - "Två rader nedanför" och "samma kolumn" innebär att det första
Offset-argumentet (rader) är 2 och det andra (kolumner) är 0 — för Produkt-kolumnen. - Total är en annan kolumn men samma rad — så endast kolumn-offset-numret ändras mellan dina två
Offset-anrop, inte radnumret. - Räkna kolumner från A2:s position: Produkt är 3 kolumner till höger om Order ID; Total är 7 kolumner till höger.
2. Kombinera CurrentRegion, Offset och Resize
CurrentRegionpåA1ger dig hela tabellen, inklusive rubriken.Offset(1, 0)flyttar hela blocket nedåt med en rad — tillräckligt för att ta bort rubriken från toppen.Resizemåste minska radantalet med exakt samma antal som du flyttade, annars kommer nederkanten att hamna en rad för långt ned.
3. Skapa och testa ett namngivet område
- Namngivna områden läggs till via
ThisWorkbook.Names.Add, där du angerName:=ochRefersTo:=— du kan återanvända exakt samma range-uttryck från tips 2 istället för att bygga det på nytt. - För att referera till det efteråt, använd
Range("OrdersData")— namnet blir en vanlig sträng, inte en variabel.
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
Kör Sub (F5), skriv sedan i Direktfönstret (Ctrl+G):
?Range("OrdersData").Rows.Count
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal