Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Työskentely Alueiden Kanssa | Työskentely Excel-tietojen Kanssa
Excel VBA Liiketoiminnan Automaatioon

Työskentely Alueiden Kanssa

Pyyhkäise näyttääksesi valikon

Alueiden valitseminen

Tätä tehdään tutkimisen yhteydessä, tuotantokoodissa vältetään .Select-käskyä ja viitataan alueisiin suoraan:

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

Offset

Siirtää viitettä suhteessa itseensä — luetaan muodossa (rivit alas, sarakkeet oikealle), negatiiviset arvot siirtävät ylös tai vasemmalle:

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

Resize

Muokkaa alueen kattamien rivien tai sarakkeiden määrää pitäen vasen yläkulma paikallaan:

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

Yhdistämällä Offset ja Resize voit hakea "kaikki otsikon alapuolella olevat rivit" tietämättä rivimäärää etukäteen:

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

Nimikoidut alueet

Anna alueelle selkokielinen nimi, jota voit käyttää osoitteen sijaan:

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

Tehtävä

  1. Aloittaen Range("A2") (ORD1001), käytä Offset-ominaisuutta tulostaaksesi tuotteen ja kokonaissumman tilaukselle kaksi riviä alempana (ORD1003) — ilman, että kirjoitat "A4", "D4" tai "H4".
  2. Käytä yhdessä CurrentRegion, Offset ja Resize -ominaisuuksia valitaksesi vain datarivit (ei otsikkoa) ja tulostaaksesi kuinka monta riviä alue sisältää.
  3. Luo nimetty alue nimeltä OrdersData, joka kattaa saman pelkän datan alueen, ja varmista, että voit viitata siihen nimellä Immediate Window -ikkunassa.
Vihje
expand arrow

1. Offsetin käyttäminen A2:sta ORD1003:een

  • Aloita asettamalla Range-muuttuja soluun A2 — tämä on ankkurisolu, aivan kuten luvun esimerkissä.
  • "Kaksi riviä alaspäin" ja "sama sarake" tarkoittaa, että ensimmäinen Offset-argumentti (rivit) on 2 ja toinen (sarakkeet) on 0 — tuotesarakkeelle.
  • Total on eri sarakkeessa mutta samalla rivillä — joten vain sarake-offset muuttuu kahden Offset-kutsun välillä, ei rivin.
  • Laske sarakkeet A2:n sijainnista: Product on 3 saraketta oikealle Order ID:stä; Total on 7 saraketta oikealle.

2. CurrentRegionin, Offsetin ja Resizen yhdistäminen

  • CurrentRegion solussa A1 antaa koko taulukon, otsikko mukaan lukien.
  • Offset(1, 0) siirtää koko lohkon yhden rivin alaspäin — näin otsikkorivi jää pois.
  • Resize-toiminnolla rivimäärää pienennetään täsmälleen saman verran kuin siirrettiin, muuten alareuna menee yhden rivin yli todellisen datan.

3. Nimetyn alueen luominen ja testaaminen

  • Nimetyt alueet lisätään ThisWorkbook.Names.Add-komennolla, jossa annetaan Name:= ja RefersTo:= — voit käyttää samaa aluekaavaa kuin vihjeessä 2, eikä tarvitse rakentaa sitä uudelleen.
  • Viitataksesi siihen myöhemmin, käytä Range("OrdersData") — nimi on tavallinen merkkijono, ei muuttuja.
Ratkaisu
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

Suorita Sub (F5), ja kirjoita sitten Välitön-ikkunaan (Ctrl+G):

?Range("OrdersData").Rows.Count
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 3. Luku 3
some-alt