Les sélections en VBA : Cells, Range, plages, zones nommées, Rows et Columns
Avant de lire ou de modifier une cellule, une macro doit la désigner. VBA propose plusieurs façons de le faire : Cells par numéros de ligne et de colonne, Range par adresse ou par nom, Offset, Resize et CurrentRegion pour construire une plage à partir d’une cellule, Union pour une sélection discontinue, Rows et Columns pour des lignes et des colonnes entières. Chaque simulateur accepte vos propres expressions : tapez-les et observez la zone désignée. Voir aussi les propriétés des cellules et les variables objet.
Cells() : désigner une cellule par ses numéros
Cells(ligne, colonne) désigne une cellule par deux nombres : Cells(3, 2) est B3. C’est la forme idéale dans une boucle, car la ligne et la colonne peuvent être des variables : For i = 2 To 7 : Cells(i, 4).Value = …. La colonne accepte aussi une lettre (Cells(3, "B")). Appliqué à une plage, Cells devient relatif à sa première cellule. Sans point devant, Cells vise la feuille active : dans un vrai programme, préfixez-le par la feuille (ws.Cells(3, 2)).
Cells(,)For i = 2 To 7 puis Cells(i, 4).Value = Cells(i, 2).Value * Cells(i, 3).Value * 175 : la ligne varie, la colonne reste fixe.Cells attend la ligne en premier : Cells(2, 3) est C2, pas B3.Range() : désigner par une adresse
Range reçoit une adresse texte, comme dans une formule : une cellule ("B3"), une plage ("A1:D8"), une colonne ("B:B") ou des lignes ("3:5"). Avec deux arguments, ce sont les deux coins de la plage : Range("A1", "C3") ou, avec des numéros calculés, Range(Cells(2, 1), Cells(7, 4)). .Select sélectionne la plage à l’écran, mais c’est rarement nécessaire : on agit directement dessus (Range("A1:D1").Font.Bold = True).
ws.Range(Cells(2, 1), Cells(7, 4)) échoue (erreur 1004) si ws n’est pas la feuille active : écrivez ws.Range(ws.Cells(2, 1), ws.Cells(7, 4)), ou utilisez With ws et .Range(.Cells(2, 1), .Cells(7, 4)).Range("A1").Select puis Selection.Font.Bold = True. Une seule ligne suffit : Range("A1").Font.Bold = True. Plus court, plus rapide, sans scintillement.Plage de cellules : Offset, Resize, CurrentRegion et End
Une macro connaît rarement à l’avance la taille d’un tableau. On part donc d’une cellule et on construit la plage : Offset(lignes, colonnes) décale sans changer la taille, Resize(lignes, colonnes) redimensionne, CurrentRegion prend toute la zone contiguë non vide (comme Ctrl + *), End(xlDown) saute jusqu’à la dernière cellule remplie (comme Ctrl + ↓). Cells(Rows.Count, 1).End(xlUp).Row donne la dernière ligne utilisée de la colonne A, même s’il y a des cellules vides au milieu.
Set r = Range("A1").CurrentRegion puis r.Offset(1).Resize(r.Rows.Count - 1) : on descend d’une ligne et on retire une ligne pour ne pas déborder.End(xlDown) s’arrête juste avant. Pour la dernière ligne, remontez depuis le bas : Cells(Rows.Count, 1).End(xlUp).Zone nommée : Range(« NomDeZone »)
Une zone nommée (onglet Formules › Gestionnaire de noms) s’utilise dans VBA à la place de l’adresse : Range("Stagiaires"). Si on insère des lignes ou déplace le tableau, le nom suit, alors qu’une adresse écrite dans le code resterait figée. On crée un nom par macro avec ThisWorkbook.Names.Add, on le supprime avec Names("Nom").Delete. Application.Goto atteint une zone même située sur une autre feuille.
ThisWorkbook.Names.Add vaut pour tout le classeur. Worksheets("Ventes").Names.Add crée un nom limité à cette feuille.Sélection discontinue : plusieurs zones à la fois
Comme Ctrl + clic à la souris, une plage peut réunir plusieurs blocs. On les écrit dans une seule chaîne séparés par des virgules (Range("A2:A7,D2:D7")), ou on les réunit avec Union quand ce sont déjà des objets Range. La collection Areas donne accès à chaque bloc : Areas.Count en donne le nombre, Areas(2) le deuxième. Intersect fait l’inverse : il garde la partie commune, ou renvoie Nothing.
If r Is Nothing Then Set r = c Else Set r = Union(r, c) : on accumule les cellules qui remplissent une condition, puis on les met en forme en une seule instruction.Rows.Count, Columns.Count et Value ne concernent que la première zone. Parcourez For Each z In r.Areas pour traiter chaque bloc.Rows() : les lignes
Rows(3) désigne la ligne 3 entière, Rows("2:4") les lignes 2 à 4. Appliqué à une plage, Rows est relatif : Range("A1:D8").Rows(3) est A3:D3, limité aux colonnes de la plage. Rows.Count renvoie le nombre de lignes (1 048 576 pour la feuille, 8 pour le tableau). EntireRow étend une cellule à sa ligne complète, par exemple pour la supprimer : Range("C5").EntireRow.Delete.
For i = 8 To 2 Step -1. En descendant, chaque suppression décale les lignes suivantes et la boucle en saute une.Cells(Rows.Count, 1).End(xlUp).Offset(1) est la première cellule vide sous le tableau : c’est là qu’on écrit un nouvel enregistrement.Columns() : les colonnes
Columns(2) ou Columns("B") désignent la colonne B entière, Columns("B:C") plusieurs colonnes. Comme Rows, Columns est relatif quand il suit une plage : Range("A1:D8").Columns(4) est D1:D8. On l’utilise surtout pour la largeur (Columns("A:D").AutoFit, Columns(1).ColumnWidth = 18), pour masquer (.Hidden = True) ou pour mettre en forme une colonne d’un tableau.
Range("A1").CurrentRegion.Columns(4).NumberFormat = "#,##0 €" : seule la colonne Montant du tableau est touchée, pas le reste de la colonne D.Columns(4) et Columns("D") sont équivalents. Pour convertir, Cells(1, 4).Address(False, False) renvoie « D1 », et Range("D1").Column renvoie 4.Exercice : désigner les cellules d’un tableau de formations
Classeur d’exercice (Énoncé et Corrigé)
- Enregistrez le classeur en .xlsm et collez le code de la feuille « Code VBA » dans un module standard.
- Exécutez
Adresses: la fenêtre d’exécution affiche les adresses désignées par Cells, Range, Offset, Resize et CurrentRegion. Comparez avec vos prévisions. - Exécutez
CreerNoms: les zones Stagiaires et Montants sont créées, leur somme s’affiche. - Exécutez
Discontinue: les colonnes Formation et Montant passent en gras en une seule instruction. - Exécutez
LignesColonnes: en-tête mis en forme, colonnes ajustées, lignes de 1 500 € et plus surlignées. - Répondez aux questions de la feuille Contrôle.