Quelques exemples de la façon d'éviter de sélectionner
Utilisez Dim
d variables
Dim rng as Range
Set
la variable dans la plage requise. Il existe de nombreuses façons de se référer à une plage de cellules uniques :
Set rng = Range("A1")
Set rng = Cells(1, 1)
Set rng = Range("NamedRange")
Ou une gamme multi-cellules :
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 peut utiliser le raccourci vers le Evaluate
mais cette méthode est moins efficace et doit généralement être évitée dans le code de production.
Set rng = [A1]
Set rng = [A1:B10]
Tous les exemples ci-dessus se réfèrent à des cellules sur le feuille active . À moins que vous ne souhaitiez spécifiquement ne travailler qu'avec la feuille active, il est préférable de Dim une Worksheet
variable également :
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 faire veulent travailler avec le ActiveSheet
pour plus de clarté, il est préférable d'être explicite. Mais attention, car certains Worksheet
permettent de changer la feuille active.
Set rng = ActiveSheet.Range("A1")
Là encore, il s'agit de la cahier d'exercices actif . À moins que vous ne souhaitiez spécifiquement travailler uniquement avec le ActiveWorkbook
o ThisWorkbook
il est préférable d'utiliser Dim a Workbook
variable également.
Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")
Si vous faire veulent travailler avec le ActiveWorkbook
pour plus de clarté, il est préférable d'être explicite. Mais attention, car de nombreux WorkBook
permettent de changer le livre actif.
Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
Vous pouvez également utiliser le ThisWorkbook
pour faire référence au livre contenant le code en cours d'exécution.
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
Un morceau de code commun (mauvais) est d'ouvrir un livre, obtenir des données et le 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 les gammes à votre Sub
et Function
comme variables de portée :
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
y 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 bouclez 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 celui-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
C'est un petit avant-goût de ce qui est possible.
21 votes
Il est important de noter qu'il existe des cas où l'utilisation de l'option
Select
et/ouActiveSheet
etc. est tout à fait inévitable. Voici un exemple que j'ai trouvé : stackoverflow.com/questions/22796286/17 votes
Et il y a des occasions - l'édition de données graphiques dans un ppt avec un fichier Excel sous-jacent en est une - où l'activation ou la sélection sont nécessaires.
0 votes
@brettdj - Voici un exemple récent . Pour définir toutes les feuilles d'un classeur à la même valeur, il semble que
.Select / .Selection
est nécessaire.4 votes
@bruce du même AQ il semble que ce ne soit pas le cas