Manipuler les cellules en VBA : ActiveCell, Value, Address, Offset, Select, Copy, Cut, PasteSpecial et Merge
Une fois une cellule désignée (voir les sélections : Range, Cells, Rows, Columns), il faut agir dessus : lire ou écrire sa valeur, connaître son adresse, se déplacer vers ses voisines, la copier, la déplacer ou la fusionner. Chaque séquence propose une mini-feuille Excel pilotée par du vrai code VBA. Choisissez un exemple ou modifiez le code, puis exécutez-le d’un coup (F5) ou ligne par ligne (F8). Vous pouvez aussi cliquer dans la grille (Maj + clic pour étendre la sélection) : la cellule active est encadrée en vert, la zone copiée en pointillés bleus.
ActiveCell : la cellule active
ActiveCell désigne la cellule active, celle où se trouve le curseur et dont l’adresse apparaît dans la Zone Nom. Une sélection peut contenir plusieurs cellules (Selection), mais il n’y a toujours qu’une seule cellule active. ActiveCell est un objet Range : on lui applique les mêmes propriétés (.Value, .Address, .Row, .Column) et méthodes qu’à n’importe quelle cellule.
Value : lire et écrire le contenu
.Value est la propriété la plus utilisée : elle lit ou modifie le contenu d’une cellule (Range("C2").Value = 350). C’est la propriété par défaut : Range("C2") = 350 fonctionne aussi, mais écrire .Value rend le code plus clair. À distinguer de .Text, le texte affiché avec son format, et de .Formula, la formule écrite dans la cellule.
| Propriété | Renvoie | Exemple pour C2 (350,00 €) |
|---|---|---|
.Value | La valeur stockée (nombre, texte, date) | 350 |
.Text | Le texte affiché, avec le format (lecture seule) | « 350,00 € » |
.Formula | La formule en anglais, ou la valeur s’il n’y en a pas | « 350 » ; pour E2 : « =C2*D2 » |
Range("C2").ClearContents efface le contenu en gardant la mise en forme ; .Clear efface tout..Formula attend =SUM(, =IF(… Pour écrire en français, utilisez .FormulaLocal = "=SOMME(E2:E6)".Address : l’adresse d’une cellule
.Address renvoie l’adresse d’une cellule ou d’une plage sous forme de texte, par défaut en références absolues : $C$4. Ses arguments règlent le format : RowAbsolute et ColumnAbsolute (.Address(False, False) donne C4), ReferenceStyle:=xlR1C1 pour le style L1C1, External:=True pour ajouter le classeur et la feuille. Address sert à afficher un message, à mémoriser une position ou à construire une formule.
.Row et .Column plutôt que de découper le texte de Address.If ActiveCell.Address = "$E$8" Then : la comparaison se fait sur le texte, avec les $.Offset : se déplacer à partir d’une cellule
.Offset(lignes, colonnes) renvoie la cellule située à un certain décalage : Range("A1").Offset(2, 1) est B3. Les valeurs positives vont vers le bas et la droite, les négatives vers le haut et la gauche, 0 ne décale pas. Combiné à ActiveCell, Offset permet de lire les voisines d’une cellule (ActiveCell.Offset(0, 2) : deux colonnes à droite) ou de parcourir un tableau ligne par ligne.
ActiveCell.Offset(1, 0) désigne la cellule du dessous ; seul .Select déplace le curseur.Range("A1").End(xlDown).Offset(1, 0) : la première cellule vide sous le tableau, pour un nouvel enregistrement.Select : sélectionner
.Select sélectionne une plage, exactement comme un clic : elle devient Selection et sa première cellule devient ActiveCell. L’enregistreur de macros en produit beaucoup (Range("B2").Select puis Selection.Font.Bold = True). Dans un code écrit à la main, on agit le plus souvent directement sur la plage, sans la sélectionner : le code est plus court, plus rapide et ne dépend pas de la feuille affichée.
Worksheets("Archive").Range("A1").Select provoque l’erreur 1004 si la feuille Archive n’est pas active : activez-la d’abord, ou évitez Select.X.Select / Selection.Y par X.Y.Méthodes : Copy, Cut, PasteSpecial, Merge et UnMerge
.Copy copie une plage et .Cut la coupe. Avec l’argument Destination, le collage se fait dans la même instruction : Range("C2:C6").Copy Destination:=Range("G2"). Sans destination, la plage part dans le Presse-papiers (pointillés) ; on la colle ensuite avec ActiveSheet.Paste ou, après Copy uniquement, avec .PasteSpecial pour ne coller que les valeurs, les formats ou transposer. .Merge fusionne une plage en une seule cellule, .UnMerge la défusionne.
| Argument Paste de PasteSpecial | Colle | Équivalent Excel |
|---|---|---|
xlPasteAll | Tout (valeurs, formules, formats) | Collage normal |
xlPasteValues | Les valeurs, sans formule ni format | Collage spécial › Valeurs |
xlPasteFormulas | Les formules, sans format | Collage spécial › Formules |
xlPasteFormats | La mise en forme seule | Collage spécial › Formats |
xlPasteValuesAndNumberFormats | Les valeurs et les formats de nombre | Valeurs et formats des nombres |
Transpose:=True | Inverse lignes et colonnes | Case Transposé |
Application.CutCopyMode = False vide le Presse-papiers et supprime la bordure clignotante.HorizontalAlignment = xlCenterAcrossSelection (Centrer sur plusieurs colonnes).Range("G2:G6").Value = Range("E2:E6").Value recopie les valeurs d’une plage de même taille, sans Copy ni PasteSpecial.Exercice : calculer, archiver, mettre en forme et déplacer
Classeur d’exercice (Énoncé et Corrigé)
- Enregistrez le classeur en .xlsm et collez le code de la feuille « Code VBA » dans un module standard.
- Feuille Sessions : cliquez sur une cellule et exécutez
Infos(ActiveCell, Address, Value). - Exécutez
AjouterTTC(Offset),Archiver(Copy, PasteSpecial),Titre(Merge) puisDeplacer(Cut). - Répondez aux questions de la feuille Contrôle.