Alcuni esempi di come evitare la selezione
Usa Dim
le variabili
Dim rng as Range
Set
la variabile nell'intervallo richiesto. Esistono molti modi per fare riferimento a un intervallo di celle singole
Set rng = Range("A1")
Set rng = Cells(1,1)
Set rng = Range("NamedRange")
o un intervallo multi-cella
Set rng = Range("A1:B10")
Set rng = Range("A1", "B10")
Set rng = Range(Cells(1,1), Cells(10,2))
Set rng = Range("AnotherNamedRange")
Set rng = Range("A1").Resize(10,2)
È possibile utilizzare il collegamento al Evaluate
metodo, ma questo è meno efficiente e generalmente dovrebbe essere evitato nel codice di produzione.
Set rng = [A1]
Set rng = [A1:B10]
Tutti gli esempi sopra riportati si riferiscono alle celle sul foglio attivo . A meno che tu non voglia specificamente lavorare solo con il foglio attivo, è meglio anche Dimmerare una Worksheet
variabile
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Set rng = ws.Cells(1,1)
With ws
Set rng = .Range(.Cells(1,1), .Cells(2,10))
End With
Se non vogliono lavorare con il ActiveSheet
, per chiarezza è meglio essere espliciti. Ma attenzione, poiché alcuni Worksheet
metodi cambiano il foglio attivo.
Set rng = ActiveSheet.Range("A1")
Ancora una volta, questo si riferisce alla cartella di lavoro attiva . A meno che tu non voglia specificamente lavorare solo con ActiveWorkbook
o ThisWorkbook
, è meglio oscurare anche una Workbook
variabile.
Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")
Se non vogliono lavorare con il ActiveWorkbook
, per chiarezza è meglio essere espliciti. Ma attenzione, poiché molti WorkBook
metodi cambiano il libro attivo.
Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
È inoltre possibile utilizzare l' ThisWorkbook
oggetto per fare riferimento al libro contenente il codice in esecuzione.
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
Un pezzo di codice (cattivo) comune è aprire un libro, recuperare alcuni dati e richiuderlo
Questo non va bene:
Sub foo()
Dim v as Variant
Workbooks("Book1.xlsx").Sheets(1).Range("A1").Clear
Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
v = ActiveWorkbook.Sheets(1).Range("A1").Value
Workbooks("SomeAlreadyOpenBook.xlsx").Activate
ActiveWorkbook.Sheets("SomeSheet").Range("A1").Value = v
Workbooks(2).Activate
ActiveWorkbook.Close()
End Sub
E sarebbe meglio come:
Sub foo()
Dim v as Variant
Dim wb1 as Workbook
Dim wb2 as Workbook
Set wb1 = Workbooks("SomeAlreadyOpenBook.xlsx")
Set wb2 = Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
v = wb2.Sheets("SomeSheet").Range("A1").Value
wb1.Sheets("SomeOtherSheet").Range("A1").Value = v
wb2.Close()
End Sub
Passa gli intervalli alle tue Sub
s e Function
s come variabili di intervallo
Sub ClearRange(r as Range)
r.ClearContents
'....
End Sub
Sub MyMacro()
Dim rng as Range
Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:B10")
ClearRange rng
End Sub
È inoltre necessario applicare i metodi (come Find
e Copy
) alle variabili
Dim rng1 As Range
Dim rng2 As Range
Set rng1 = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10")
Set rng2 = ThisWorkbook.Worksheets("SomeSheet").Range("B1:B10")
rng1.Copy rng2
Se esegui il ciclo su un intervallo di celle, spesso è meglio (più veloce) copiare prima i valori dell'intervallo su un array di varianti e passare sopra quello
Dim dat As Variant
Dim rng As Range
Dim i As Long
Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10000")
dat = rng.Value ' dat is now array (1 to 10000, 1 to 1)
for i = LBound(dat, 1) to UBound(dat, 1)
dat(i,1) = dat(i,1) * 10 'or whatever operation you need to perform
next
rng.Value = dat ' put new values back on sheet
Questo è un piccolo assaggio di ciò che è possibile.
Select
e / oActiveSheet
ecc. Ecc. È assolutamente inevitabile. Ecco un esempio che ho trovato: stackoverflow.com/questions/22796286/…