Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Arbeta med områden | Arbeta med Exceldata
Excel VBA för affärsautomatisering

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"
Figur 3.3

Ä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

  1. Börja från Range("A2") (ORD1001), använd Offset fö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".
  2. Använd CurrentRegion, Offset och Resize tillsammans för att markera endast dataraderna (ingen rubrik) och skriv ut hur många rader det området innehåller.
  3. Skapa ett namngivet område kallat OrdersData som täcker samma dataområde och bekräfta att du kan referera till det med namn i Immediate Window.
Tips
expand arrow

1. Använda Offset från A2 för att nå ORD1003

  • Börja med att sätta en Range-variabel till A2 — 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

  • CurrentRegionA1 ger 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.
  • Resize må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 anger Name:= och RefersTo:= — 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.
Lösning
expand arrow
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
Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 3

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 3. Kapitel 3
some-alt