Quelques exemples pour éviter de sélectionner
Utiliser Dim
des variables 'd
Dim rng as Range
Set
la variable à la plage requise. Il existe de nombreuses façons de faire référence à une plage unicellulaire
Set rng = Range("A1")
Set rng = Cells(1,1)
Set rng = Range("NamedRange")
ou une gamme multicellulaire
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)
Vous pouvez utiliser le raccourci vers la Evaluate
méthode, mais cela est moins efficace et devrait généralement être évité dans le code de production.
Set rng = [A1]
Set rng = [A1:B10]
Tous les exemples ci-dessus se réfèrent aux cellules de la feuille active . À moins que vous ne souhaitiez spécifiquement travailler qu'avec la feuille active, il est préférable de réduire également une Worksheet
variable
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
Si vous ne voulez travailler avec la ActiveSheet
, pour plus de clarté , il est préférable d'être explicite. Mais attention, certaines Worksheet
méthodes modifient la feuille active.
Set rng = ActiveSheet.Range("A1")
Encore une fois, cela fait référence au classeur actif . À moins que vous ne vouliez spécifiquement travailler qu'avec ActiveWorkbook
ou ThisWorkbook
, il est préférable de réduire également une Workbook
variable.
Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")
Si vous ne voulez travailler avec la ActiveWorkbook
, pour plus de clarté , il est préférable d'être explicite. Mais attention, de nombreuses WorkBook
méthodes modifient le livre actif.
Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
Vous pouvez également utiliser l' ThisWorkbook
objet pour faire référence au livre contenant le code en cours d'exécution.
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
Un (mauvais) morceau de code courant consiste à ouvrir un livre, à obtenir des données puis à refermer
C'est mauvais:
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
Et ce serait mieux comme:
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
Passez des plages à vos Sub
s et Function
s en tant que variables de plage
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
Vous devez également appliquer des méthodes (telles que Find
et Copy
) aux variables
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
Si vous effectuez une boucle sur une plage de cellules, il est souvent préférable (plus rapide) de copier d'abord les valeurs de la plage dans un tableau de variantes et de boucler sur celle-ci.
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
Ceci est un petit avant-goût de ce qui est possible.
Select
et / ouActiveSheet
etc etc est complètement inévitable. Voici un exemple que j'ai trouvé: stackoverflow.com/questions/22796286/…