Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Arbejde med Områder | Arbejde med Excel-data
Excel VBA til Forretningsautomatisering

Arbejde med Områder

Stryg for at vise menuen

Valg af områder

Dette bruges under udforskning; produktionskode undgår .Select til fordel for direkte reference til områder:

ws.Range("A1:I1").Select        ' fine for exploring
ws.Range("A1:I1").Font.Bold = True    ' better — skips Select entirely

Offset

Flytter en reference relativt til sig selv — læses som (rækker ned, kolonner til højre), hvor negative tal flytter op eller til venstre:

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

Ændr størrelse

Ændrer hvor mange rækker eller kolonner et område dækker, mens dets øverste venstre hjørne forbliver fast:

Dim headerRow As Range
Set headerRow = ws.Range("A1")
Set headerRow = headerRow.Resize(1, 9)    ' now covers A1:I1, the full header

Kombiner Offset og Resize for at hente "alt under overskriften" uden at kende rækkeantallet på forhånd:

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

Navngivne områder

Tildel et område et letforståeligt navn, som du kan referere til i stedet for en adresse:

ThisWorkbook.Names.Add Name:="OrdersTable", RefersTo:=ws.Range("A1:I6")
Debug.Print ws.Range("OrdersTable").Rows.Count

Opgave

  1. Startende fra Range("A2") (ORD1001), brug Offset til at udskrive Produkt og Total for ordren to rækker nedenfor (ORD1003) — uden nogensinde at skrive "A4", "D4" eller "H4".
  2. Brug CurrentRegion, Offset og Resize sammen for kun at vælge datarækkerne (ingen overskrift) og udskriv hvor mange rækker dette område indeholder.
  3. Opret et navngivet område kaldet OrdersData, der dækker det samme dataområde uden overskrift, og bekræft at du kan referere til det ved navn i Immediate Window.
Tip
expand arrow

1. Brug af Offset fra A2 for at nå ORD1003

  • Start med at sætte en Range-variabel til A2 — det er din anker-celle, præcis som i kapitlets gennemgåede eksempel.
  • "To rækker nedenfor" og "samme kolonne" betyder, at det første Offset-argument (rækker) er 2 og det andet (kolonner) er 0 — for Produkt-kolonnen.
  • Total er en anden kolonne, men samme række — så kun kolonne-offset-nummeret ændres mellem dine to Offset-kald, ikke række-nummeret.
  • Tæl kolonner fra A2's position: Produkt er 3 kolonner til højre for Order ID; Total er 7 kolonner til højre.

2. Kombinering af CurrentRegion, Offset og Resize

  • CurrentRegionA1 giver dig hele tabellen, inklusive overskriften.
  • Offset(1, 0) flytter hele blokken én række ned — nok til at fjerne overskriften fra toppen.
  • Resize skal reducere rækkeantallet med præcis det samme antal, som du har flyttet, ellers vil den nederste kant gå én række forbi de reelle data.

3. Oprettelse og test af et navngivet område

  • Navngivne områder tilføjes via ThisWorkbook.Names.Add, hvor du angiver et Name:= og et RefersTo:= — du kan genbruge det nøjagtige områdeudtryk fra hint 2 i stedet for at opbygge det igen fra bunden.
  • For at referere til det bagefter, brug Range("OrdersData") — navnet bliver en almindelig streng, ikke 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), og skriv derefter i det øjeblikkelige vindue (Ctrl+G):

?Range("OrdersData").Rows.Count
Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 3

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 3. Kapitel 3
some-alt