Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Lavorare con gli intervalli | Lavorare con i dati di Excel
Excel VBA per l'Automazione Aziendale

Lavorare con gli intervalli

Scorri per mostrare il menu

Selezione di intervalli

Questa operazione viene eseguita durante l'esplorazione; nel codice di produzione si evita .Select preferendo il riferimento diretto agli intervalli:

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

Offset

Sposta un riferimento rispetto a se stesso — da leggere come (righe in basso, colonne a destra), con numeri negativi che spostano verso l'alto o a sinistra:

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

Ridimensiona

Modifica il numero di righe o colonne coperte da un intervallo, mantenendo fisso l'angolo in alto a sinistra:

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

Combinando Offset e Resize è possibile selezionare "tutto ciò che si trova sotto l'intestazione" senza conoscere in anticipo il numero di righe:

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

Intervalli denominati

Assegna a un intervallo un nome in inglese semplice che puoi utilizzare come riferimento invece dell'indirizzo:

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

Attività

  1. Partendo da Range("A2") (ORD1001), utilizzare Offset per stampare il Prodotto e il Totale dell'ordine due righe più in basso (ORD1003) — senza mai digitare "A4", "D4" o "H4".
  2. Utilizzare insieme CurrentRegion, Offset e Resize per selezionare solo le righe dei dati (senza intestazione) e stampare quante righe contiene quell'intervallo.
  3. Creare un intervallo denominato chiamato OrdersData che copra lo stesso intervallo solo dati e confermare che sia possibile farvi riferimento per nome nella Finestra Immediata.
Suggerimento
expand arrow

1. Utilizzo di Offset da A2 per raggiungere ORD1003

  • Impostare una variabile Range su A2 — questa è la cella di ancoraggio, esattamente come nell'esempio pratico del capitolo.
  • "Due righe sotto" e "stessa colonna" significa che il primo argomento di Offset (righe) è 2 e il secondo (colonne) è 0 — per la colonna Product.
  • Total è una colonna diversa ma la stessa riga — quindi cambia solo il numero di offset delle colonne tra le due chiamate a Offset, non quello delle righe.
  • Contare le colonne dalla posizione di A2: Product è 3 colonne a destra di Order ID; Total è 7 colonne a destra.

2. Combinazione di CurrentRegion, Offset e Resize

  • CurrentRegion su A1 restituisce l'intera tabella, inclusa l'intestazione.
  • Offset(1, 0) sposta tutto il blocco verso il basso di una riga — sufficiente per escludere l'intestazione dalla parte superiore.
  • Resize deve ridurre il numero di righe esattamente della stessa quantità dello spostamento, altrimenti il bordo inferiore supererà di una riga i dati reali.

3. Creazione e verifica di un intervallo con nome

  • Gli intervalli con nome vengono aggiunti tramite ThisWorkbook.Names.Add, assegnando un Name:= e un RefersTo:= — è possibile riutilizzare l'espressione di intervallo esatta dal suggerimento 2 invece di ricostruirla da zero.
  • Per farvi riferimento successivamente, utilizzare Range("OrdersData") — il nome diventa una semplice stringa, non una variabile.
Soluzione
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

Eseguire la Sub (F5), quindi nella Finestra Immediata (Ctrl+G) digitare:

?Range("OrdersData").Rows.Count
Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 3

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Lavorare con gli intervalli

Selezione di intervalli

Questa operazione viene eseguita durante l'esplorazione; nel codice di produzione si evita .Select preferendo il riferimento diretto agli intervalli:

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

Offset

Sposta un riferimento rispetto a se stesso — da leggere come (righe in basso, colonne a destra), con numeri negativi che spostano verso l'alto o a sinistra:

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

Ridimensiona

Modifica il numero di righe o colonne coperte da un intervallo, mantenendo fisso l'angolo in alto a sinistra:

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

Combinando Offset e Resize è possibile selezionare "tutto ciò che si trova sotto l'intestazione" senza conoscere in anticipo il numero di righe:

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

Intervalli denominati

Assegna a un intervallo un nome in inglese semplice che puoi utilizzare come riferimento invece dell'indirizzo:

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

Attività

  1. Partendo da Range("A2") (ORD1001), utilizzare Offset per stampare il Prodotto e il Totale dell'ordine due righe più in basso (ORD1003) — senza mai digitare "A4", "D4" o "H4".
  2. Utilizzare insieme CurrentRegion, Offset e Resize per selezionare solo le righe dei dati (senza intestazione) e stampare quante righe contiene quell'intervallo.
  3. Creare un intervallo denominato chiamato OrdersData che copra lo stesso intervallo solo dati e confermare che sia possibile farvi riferimento per nome nella Finestra Immediata.
Suggerimento
expand arrow

1. Utilizzo di Offset da A2 per raggiungere ORD1003

  • Impostare una variabile Range su A2 — questa è la cella di ancoraggio, esattamente come nell'esempio pratico del capitolo.
  • "Due righe sotto" e "stessa colonna" significa che il primo argomento di Offset (righe) è 2 e il secondo (colonne) è 0 — per la colonna Product.
  • Total è una colonna diversa ma la stessa riga — quindi cambia solo il numero di offset delle colonne tra le due chiamate a Offset, non quello delle righe.
  • Contare le colonne dalla posizione di A2: Product è 3 colonne a destra di Order ID; Total è 7 colonne a destra.

2. Combinazione di CurrentRegion, Offset e Resize

  • CurrentRegion su A1 restituisce l'intera tabella, inclusa l'intestazione.
  • Offset(1, 0) sposta tutto il blocco verso il basso di una riga — sufficiente per escludere l'intestazione dalla parte superiore.
  • Resize deve ridurre il numero di righe esattamente della stessa quantità dello spostamento, altrimenti il bordo inferiore supererà di una riga i dati reali.

3. Creazione e verifica di un intervallo con nome

  • Gli intervalli con nome vengono aggiunti tramite ThisWorkbook.Names.Add, assegnando un Name:= e un RefersTo:= — è possibile riutilizzare l'espressione di intervallo esatta dal suggerimento 2 invece di ricostruirla da zero.
  • Per farvi riferimento successivamente, utilizzare Range("OrdersData") — il nome diventa una semplice stringa, non una variabile.
Soluzione
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

Eseguire la Sub (F5), quindi nella Finestra Immediata (Ctrl+G) digitare:

?Range("OrdersData").Rows.Count
Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 3
some-alt