Excel · VBA · A3iformations

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(3, 2)Par numéros
Range(« A1:D8 »)Par adresse
Offset, ResizePar calcul
Union, Rows, ColumnsPar blocs
1

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)).

Simulateur : réglez la ligne et la colonne, ou testez un exemple
Cells(,)
Parcourir un tableauFor 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.
Ligne d’abordContrairement à l’adresse « B3 » (colonne puis ligne), Cells attend la ligne en premier : Cells(2, 3) est C2, pas B3.
2

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).

Simulateur : quelle zone désigne l’expression ?
Le piège des Cells non qualifiésws.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)).
Sans SelectL’enregistreur écrit Range("A1").Select puis Selection.Font.Bold = True. Une seule ligne suffit : Range("A1").Font.Bold = True. Plus court, plus rapide, sans scintillement.
3

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.

Simulateur : construisez une plage à partir d’une cellule de départ
Le tableau sans son en-têteSet 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) et les trousSi la colonne contient une cellule vide, End(xlDown) s’arrête juste avant. Pour la dernière ligne, remontez depuis le bas : Cells(Rows.Count, 1).End(xlUp).
4

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.

Simulateur : gestionnaire de noms

    

Noms interditsPas d’espace, pas de chiffre au début, et rien qui ressemble à une adresse : « TVA1 » est refusé, car TVA est une colonne valide (la colonne 14 093).
PortéeUn nom créé par ThisWorkbook.Names.Add vaut pour tout le classeur. Worksheets("Ventes").Names.Add crée un nom limité à cette feuille.
5

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.

Simulateur : Union, Areas et Intersect
Construire une Union dans une boucleIf 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.
Première zone seulementSur une plage multiple, Rows.Count, Columns.Count et Value ne concernent que la première zone. Parcourez For Each z In r.Areas pour traiter chaque bloc.
6

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.

Simulateur : lignes de la feuille et lignes d’une plage
Supprimer en remontantPour supprimer des lignes dans une boucle, partez du bas : For i = 8 To 2 Step -1. En descendant, chaque suppression décale les lignes suivantes et la boucle en saute une.
Ajouter une ligneCells(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.
7

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.

Simulateur : colonnes de la feuille et colonnes d’une plage
Mettre en forme une colonne du tableauRange("A1").CurrentRegion.Columns(4).NumberFormat = "#,##0 €" : seule la colonne Montant du tableau est touchée, pas le reste de la colonne D.
Numéro ou lettreColumns(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é)

  1. Enregistrez le classeur en .xlsm et collez le code de la feuille « Code VBA » dans un module standard.
  2. 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.
  3. Exécutez CreerNoms : les zones Stagiaires et Montants sont créées, leur somme s’affiche.
  4. Exécutez Discontinue : les colonnes Formation et Montant passent en gras en une seule instruction.
  5. Exécutez LignesColonnes : en-tête mis en forme, colonnes ajustées, lignes de 1 500 € et plus surlignées.
  6. Répondez aux questions de la feuille Contrôle.
A3iformations · Organisme certifié Qualiopi · Centre de passage TOSA Interface Excel Microsoft 365 en français