Excel/Macro VBA: Trucs et astuces
Je vous invite à compiler ici les trucs tout bêtes, pour se faciliter la vie lorsqu'on développe de petites macros sous Excel.
(Pour demander de l'aide, prière de créer un autre sujet :
Option Explicit
Ne jamais oublier de mettre l'Option Explicit.
(Voir l'aide de VBA/Excel).
Itération dans une collection
Pour parcourir tous les objets d'une collection :
(Voir la définition d'une collection dans l'aide de VBA/Excel.)
Assez intelligemment, une collection porte comme nom le pluriel du type des objets de la collection. En général...
Exemple, la collection des feuilles de calcul d'un classeurs s'appelle Worksheets, alors que le type feuille de calcul est Worksheet.
Quelques objets Excel
Les objects importants sont :
■ L'application Excel elle-même. L'objet prédéfini est Application
■ Le classeur. De type WorkBook. L'application possède une collection de classeurs notée WorkBooks. Un classeur particulier de cette collection peut être désigné par son nom ou son numéro :
■ La feuille de calcul. De type WorkSheet. Le classeur possède une collection de feuilles de calcul notée WorkSheets. Une feuille de calcul particulière peut être désignée par son nom ou son numéro :
■ Les cellules de la feuille de calcul. De type Range. Attention, Range n'est pas une cellule, mais un ensemble de cellules. Il n'y a pas de classe d'objet définie pour désigner une cellule en VBA/Excel ! Une feuille de calcul possède une collection de cellules notée Cells. Une cellule particulière peut être désignée par ses coordonnées ligne x colonne.
Il est souvent plus agréable d'accéder à un ensemble de cellules (quitte à ce que cet ensemble ne soit qu'une seule cellule) en donnant son adresse. On utilise alors la méthode Range de l'objet WorkSheet :
Lorsqu'on ne travaille que dans un seul classeur, une seule feuille à la fois, Excel considère le classeur actif, la feuille active.
Il n'est alors pas utile de préciser quoi que ce soit.
Lorsqu'on travaille dans plusieurs classeurs, dans plusieurs feuilles à la fois, on serait tenté d'activer tel classeur, telle feuille pour ne pas avoir à y faire référence. C'est souvent une erreur. Les changements de classeurs, de feuilles, de sélections engendrent énormément de recalculs de la part d'Excel qui ne sont pas justifiés. Il est bien plus judicieux de préciser à quel classeur, à quelle feuille on fait référence. Cela alourdi un peu le code, mais ne le complique absoluement pas, au point de vue de l'exécution. Ainsi, pour accéder à la cellule B3, de la feuille Feuil2 du classeur Classeur1 on écrit :
Ces lignes sont équivalentes, et les différentes notations peuvent être panachées.
Désigner la ligne 12, les deux premières lignes, la colonne B, la troisière colonne (C), les colonnes de A à F :
(Tous ces exemples renvoient un objet Range)
Copier une zone (Range) vers une autre, de B1 vers B2, de B1 vers B2 en incrémentant, toute une zone de B1:B12 vers D1:.., d'une feuille à l'autre, d'un classeur à l'autre :
....
à suivre
Je vous invite à compiler ici les trucs tout bêtes, pour se faciliter la vie lorsqu'on développe de petites macros sous Excel.
(Pour demander de l'aide, prière de créer un autre sujet :
Vous devez être connecté pour voir les liens.
)Option Explicit
Ne jamais oublier de mettre l'Option Explicit.
(Voir l'aide de VBA/Excel).
Itération dans une collection
Pour parcourir tous les objets d'une collection :
(Voir la définition d'une collection dans l'aide de VBA/Excel.)
Code:
Dim element As TypeDeLaCollection
For Each element In Collection
..
Next
Exemple, la collection des feuilles de calcul d'un classeurs s'appelle Worksheets, alors que le type feuille de calcul est Worksheet.
Quelques objets Excel
Les objects importants sont :
■ L'application Excel elle-même. L'objet prédéfini est Application
■ Le classeur. De type WorkBook. L'application possède une collection de classeurs notée WorkBooks. Un classeur particulier de cette collection peut être désigné par son nom ou son numéro :
Code:
WorkBooks(2)
WorkBooks("Classeur1")
■ La feuille de calcul. De type WorkSheet. Le classeur possède une collection de feuilles de calcul notée WorkSheets. Une feuille de calcul particulière peut être désignée par son nom ou son numéro :
Code:
WorkSheets(2)
WorkSheets("Classeur1")
■ Les cellules de la feuille de calcul. De type Range. Attention, Range n'est pas une cellule, mais un ensemble de cellules. Il n'y a pas de classe d'objet définie pour désigner une cellule en VBA/Excel ! Une feuille de calcul possède une collection de cellules notée Cells. Une cellule particulière peut être désignée par ses coordonnées ligne x colonne.
Code:
Cells(row, col)
Code:
Range("A1")
Range("A1:B2")
Range(Cells(1, 1), Cells(4, 5))
Lorsqu'on ne travaille que dans un seul classeur, une seule feuille à la fois, Excel considère le classeur actif, la feuille active.
Il n'est alors pas utile de préciser quoi que ce soit.
Lorsqu'on travaille dans plusieurs classeurs, dans plusieurs feuilles à la fois, on serait tenté d'activer tel classeur, telle feuille pour ne pas avoir à y faire référence. C'est souvent une erreur. Les changements de classeurs, de feuilles, de sélections engendrent énormément de recalculs de la part d'Excel qui ne sont pas justifiés. Il est bien plus judicieux de préciser à quel classeur, à quelle feuille on fait référence. Cela alourdi un peu le code, mais ne le complique absoluement pas, au point de vue de l'exécution. Ainsi, pour accéder à la cellule B3, de la feuille Feuil2 du classeur Classeur1 on écrit :
Code:
WorkBooks(1).WorkSheets(2).Cells(3, 2)
WorkBooks("Classeur1").WorkSheets("Feuil2").Range("B3")
Désigner la ligne 12, les deux premières lignes, la colonne B, la troisière colonne (C), les colonnes de A à F :
(Tous ces exemples renvoient un objet Range)
Code:
Rows(12)
Rows("1:2")
Columns("B")
Columns(3)
Columns("A:F")
Copier une zone (Range) vers une autre, de B1 vers B2, de B1 vers B2 en incrémentant, toute une zone de B1:B12 vers D1:.., d'une feuille à l'autre, d'un classeur à l'autre :
Code:
Range("B2").Value = Range("B1").Value
Range("B2").Value = Range("B1").Value + 1
Range("B1:B12").Copy Destination:=Range("D1")
WorkSheets("Feuil2").Range("B1:B12").Copy Destination:=WorkSheets(1).Range("D1")
WorkBooks(2).WorkSheets("Feuil2").Range("B1:B12").Copy Destination:=WorkBooks("Classeur1").WorkSheets(1).Range("D1")
....
à suivre