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"
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à
- Partendo da Range("A2") (ORD1001), utilizzare
Offsetper stampare il Prodotto e il Totale dell'ordine due righe più in basso (ORD1003) — senza mai digitare "A4", "D4" o "H4". - Utilizzare insieme
CurrentRegion,OffseteResizeper selezionare solo le righe dei dati (senza intestazione) e stampare quante righe contiene quell'intervallo. - Creare un intervallo denominato chiamato
OrdersDatache copra lo stesso intervallo solo dati e confermare che sia possibile farvi riferimento per nome nella Finestra Immediata.
1. Utilizzo di Offset da A2 per raggiungere ORD1003
- Impostare una variabile
RangesuA2— 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
CurrentRegionsuA1restituisce 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.Resizedeve 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 unName:=e unRefersTo:=— è 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.
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
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
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"
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à
- Partendo da Range("A2") (ORD1001), utilizzare
Offsetper stampare il Prodotto e il Totale dell'ordine due righe più in basso (ORD1003) — senza mai digitare "A4", "D4" o "H4". - Utilizzare insieme
CurrentRegion,OffseteResizeper selezionare solo le righe dei dati (senza intestazione) e stampare quante righe contiene quell'intervallo. - Creare un intervallo denominato chiamato
OrdersDatache copra lo stesso intervallo solo dati e confermare che sia possibile farvi riferimento per nome nella Finestra Immediata.
1. Utilizzo di Offset da A2 per raggiungere ORD1003
- Impostare una variabile
RangesuA2— 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
CurrentRegionsuA1restituisce 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.Resizedeve 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 unName:=e unRefersTo:=— è 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.
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
Grazie per i tuoi commenti!