Comment utiliser Range en VBA pour lire et écrire des cellules
Tu ouvres un fichier Excel lundi matin. Tu dois remettre un reporting financier avant midi, consolider des exports SAP, nettoyer des colonnes bancales, remettre en forme un tableau RH, puis refaire exactement la même chose sur le fichier du mois prochain. Tu sais déjà que le vrai problème n’est pas Excel. Le vrai problème, c’est la répétition.
C’est là que range in vba change la donne. Quand tu comprends l’objet Range, tu arrêtes de piloter Excel à la souris. Tu commences à lui donner des consignes précises, reproductibles, et surtout rapides. Une cellule, une colonne, un bloc de données, une zone entière détectée automatiquement. Tout passe par lui.
Si tu n’as pas encore activé l’environnement VBA, commence par vérifier l’onglet Développeur dans Excel. Ensuite, garde cette idée simple en tête : Range est ton GPS dans la feuille. Si tu sais pointer la bonne zone, tu peux lire, écrire, formater, copier, calculer et automatiser presque tout.
Pour garder sous la main des codes qui lisent, écrivent et mettent en forme des plages, télécharge notre guide des codes VBA Excel au format PDF. Chaque code y est classé par usage et prêt à coller dans un module.
Codes VBA Excel prêts à l’emploi (PDF)
Les 47 codes du guide, classés par usage, à coller dans ton Excel. Gratuit.
Tu en as assez de répéter les mêmes tâches sur Excel ?
Tu recopies les mêmes formules. Tu recolories les mêmes lignes. Tu ajustes toujours les mêmes formats monétaires. Et chaque mois, tu recommences.
Un contrôleur de gestion le vit souvent sur les clôtures mensuelles. Un RH le vit sur les suivis d’absences, de paie ou d’effectifs. Un consultant le vit sur des livrables clients qui changent peu dans leur logique, mais beaucoup dans leur volume. La fatigue vient rarement de la complexité. Elle vient de la répétition manuelle.
VBA est utile précisément ici. Et au cœur de VBA, il y a Range. C’est l’objet central pour manipuler une cellule unique, une ligne, une colonne, un bloc contigu de cellules, et même certaines plages plus complexes (documentation de l’objet Range chez Microsoft). Si tu veux automatiser Excel sérieusement, tu passes par lui.
Un bon code VBA ne “fait pas de la magie”. Il sait juste exactement où agir dans la feuille.
L’idée de cet article est simple. Te faire passer de “je comprends vaguement le VBA” à “je peux automatiser une vraie tâche métier sans casser mon fichier”. Tu vas voir la syntaxe, bien sûr. Mais surtout les usages concrets, les raccourcis qui font gagner du temps, les pièges que les tutos survolent trop vite, et les réflexes qui rendent tes macros fiables sur de gros fichiers.
L'objet Range, ton couteau suisse en VBA
Quand tu travailles sur une feuille, Excel voit un immense quadrillage. Le code, lui, a besoin d’un repère précis. Range, c’est ce repère. C’est ton GPS. Tu lui dis où aller, et il agit exactement à cet endroit.

Si tu veux une définition simple, retiens celle-ci : Range représente une ou plusieurs cellules. Ça peut être Range("A1"), Range("A1:B3"), une ligne, une colonne ou une zone détectée automatiquement. Si tu veux revoir la notion de plage côté Excel, le lexique de la plage dans Excel est un bon complément.
La hiérarchie qui évite les bugs
Beaucoup d’erreurs viennent d’un détail invisible : le code ne sait pas toujours sur quel fichier ou quelle feuille tu travailles.
En VBA, la logique suit cette hiérarchie :
| Niveau | Rôle |
|---|---|
| Application | Excel lui-même |
| Workbook | Le classeur |
| Worksheet | La feuille |
| Range | La zone visée |
Quand tu écris seulement Range("A1"), VBA se base sur la feuille active. Si la mauvaise feuille est active, ta macro écrit au mauvais endroit. C’est pour ça qu’un code plus fiable ressemble à ça :
Worksheets("Reporting").Range("A1").Value = "CA"
L’idée n’est pas de compliquer. L’idée est d’éviter les surprises.
Les deux syntaxes à connaître tout de suite
La syntaxe la plus directe :
Range("A1").Value = 100
Range("A1:B3").Interior.Color = vbYellow
Tu peux aussi utiliser des références absolues :
Range("$A$1:$B$3")
Elles gardent les positions fixes quand tu copies des formules ou des traitements. C’est très utile dans les modèles financiers ou les matrices RH qui doivent rester stables.
Déclarer une variable Range proprement
Quand tu commences à écrire un vrai code, évite de répéter des adresses partout. Déclare un objet Range et assigne-lui une zone.
Sub ExempleRange()
Dim rng As Range
Set rng = Range("A1:B10")
rng.Font.Bold = True
End Sub
Le duo Dim + Set est fondamental.Dim rng As Range prépare une variable objet.Set rng = ... lui donne une vraie plage.
Sans Set, tu vas vite rencontrer l’erreur classique 91. On y reviendra plus loin.
Range comme outil métier
Prenons deux cas concrets.
En finance
Tu reçois un export comptable. Tu dois mettre la première colonne au format euro, supprimer une ligne de total parasite, puis ajouter une formule sur tout le tableau.
En RH
Tu reçois un suivi de collaborateurs. Tu dois détecter le bloc de données, colorer certaines colonnes, puis recopier une formule de contrôle.
Dans les deux cas, ton levier n’est pas “VBA” au sens vague. Ton levier, c’est Range. C’est lui qui te permet de dire à Excel :
- où lire
- où écrire
- où appliquer un format
- où copier
- où supprimer
Règle terrain : si ta macro touche des cellules, elle manipule presque toujours un Range, même si tu ne le vois pas encore clairement.
Propriétés et méthodes clés pour manipuler tes données
Tu sais maintenant désigner une plage. La vraie bascule commence quand tu lui demandes de travailler pour toi.
C’est là que beaucoup de macros deviennent soit très utiles, soit très lentes. Sur un petit fichier, presque tout fonctionne. Sur un reporting financier de plusieurs milliers de lignes ou un suivi RH mis à jour chaque semaine, le choix de la bonne propriété ou de la bonne méthode change vraiment le résultat.
Avec Range, tu peux voir une plage comme une zone sur un GPS Excel. Les propriétés te disent ce qu’il y a à cette adresse. Les méthodes te permettent d’agir sur cette zone.
Les propriétés à connaître d’abord
Commence par trois repères simples : Value, Formula et Address.
Range("A1").Value = "Janvier"
Range("B1").Value = 1250
Range("C1").Formula = "=SUM(B1:B10)"
MsgBox Range("C1").Address
Avec Formula, la formule s’écrit en anglais (SUM, et non SOMME). Pour l’écrire en français, passe par FormulaLocal.
Ces trois propriétés couvrent déjà une grande partie des besoins concrets :
| Propriété | Ce qu’elle fait | Cas d’usage pro |
|---|---|---|
Value |
lit ou écrit le contenu d’une cellule | injecter un montant, un nom de salarié, une date de clôture |
Formula |
écrit une formule Excel | poser une somme, un contrôle, un calcul de prime |
Address |
renvoie l’adresse de la plage | construire une formule dynamique ou tracer une zone traitée |
Un point mérite ton attention. Value est souvent la porte d’entrée la plus simple, mais ce n’est pas juste “mettre du texte dans une cellule”. C’est aussi ce qui te sert à alimenter une feuille de synthèse, récupérer un résultat pour une condition, ou écrire un statut comme “À valider” dans un workflow RH.
Pour la mise en forme, tu vas très souvent enchaîner avec Font et Interior.
Range("A1").Font.Bold = True
Range("A1").Interior.Color = vbYellow
C’est pratique si tu veux faire ressortir un en-tête, signaler une anomalie dans un budget, ou marquer les dossiers incomplets dans un tableau RH.
Les méthodes qui font gagner du temps
Certaines actions reviennent partout en entreprise : copier, vider, supprimer, se décaler, attraper un bloc complet. C’est exactement ce que gèrent Copy, ClearContents, Delete, Offset et CurrentRegion.
Range("A1:C10").Copy Destination:=Range("E1")
Range("B2:B10").ClearContents
Range("A1").Offset(1, 1).Value = "OK"
Copy Destination:=... est une bonne habitude. Tu évites Select, ton code est plus lisible, et Excel fait moins d’allers-retours visuels.
Offset déplace ton point de repère sans que tu réécrives une adresse complète. Si B1 est ta base, Offset(1,1) te mène à C2. Pour une série de contrôles ou de calculs relatifs, c’est très pratique.
Beaucoup de débutants rangent aussi Rows et Columns dans les détails. C’est une erreur. Ces deux membres te permettent de traiter un groupe entier d’un seul coup, ce qui est souvent plus propre que de passer cellule par cellule.
Range("A1:J1000").Rows(1).Font.Bold = True
Sur un gros export, cette approche réduit souvent le temps de traitement parce qu’Excel applique l’action en lot. Tu le sens vite sur des feuilles de reporting, de facturation ou d’audit.
Range et Cells. Deux logiques différentes
La confusion est normale au début. Range("A1") et Cells(1,1) désignent la même cellule, mais ils ne répondent pas au même besoin.
Range est plus naturel quand tu connais déjà l’adresse.Cells devient plus confortable quand la ligne ou la colonne dépend d’un calcul, d’une boucle, ou d’une variable.
Comparaison Range vs. Cells
| Critère | Range("A1") |
Cells(1, 1) |
|---|---|---|
| Lecture | Très visuel | Très pratique en code dynamique |
| Syntaxe | Adresse Excel classique | Numéro de ligne et de colonne |
| Cas idéal | Zone connue à l’avance | Tableau variable ou boucle |
| Ex. métier | Range("D2:D20") pour une colonne de primes |
Cells(i, 4) pour écrire la prime de chaque salarié |
| Souplesse | Très bonne pour des blocs fixes | Très bonne pour des positions calculées |
Si tu veux clarifier cette différence avec plus d’exemples, lis aussi ce guide sur la différence entre Cells et ses usages en VBA.
Regarde cette comparaison concrète :
For i = 1 To 1000
Range("A" & i).Value = i
Next i
For i = 1 To 1000
Cells(i, 1).Value = i
Next i
Les deux fonctionnent. Mais dans un gros fichier, Cells(i, 1) est souvent plus adapté, car VBA n’a pas besoin de reconstruire une adresse texte à chaque passage dans la boucle. Ce genre de détail paraît mineur au début. Dans un classeur mensuel lourd, il peut faire la différence entre une macro fluide et une macro que personne n’ose relancer.
Deux outils sous-estimés
Offset et CurrentRegion méritent une place à part, car ils collent très bien aux cas d’usage professionnels.
Range("B1").Offset(1, 1).Value = "Cible"
Ici, tu travailles par rapport à un point de départ. C’est utile si la cellule de référence ne change pas, mais que les données à écrire se trouvent toujours “une ligne plus bas et une colonne à droite”.
CurrentRegion, lui, capte automatiquement le bloc continu autour d’une cellule.
Dim r As Range
Set r = Range("A1").CurrentRegion
C’est redoutable pour les exports qui grossissent ou rétrécissent tous les mois. Par exemple, tu reçois un fichier de ventes avec 800 lignes en janvier, puis 1 350 en février. Si ta macro s’appuie sur CurrentRegion, elle s’adapte beaucoup mieux qu’un code figé sur A1:H800.
Le bon réflexe sur les gros fichiers
Sur des volumes importants, pose-toi toujours cette question : est-ce qu’Excel peut traiter la plage en une seule action ?
Si oui, fais-le. Écrire sur une plage entière, formater une ligne complète ou vider un bloc d’un coup sera souvent plus efficace qu’une boucle qui visite chaque cellule. Les tutoriels généralistes passent vite sur ce point. En pratique, c’est l’une des habitudes qui séparent une macro de démonstration d’une macro vraiment fiable au bureau.
Autre piège courant : ClearContents supprime les valeurs, mais garde les formats. Delete, lui, retire les cellules et décale le reste. Si tu confonds les deux dans un tableau de suivi, tu peux casser la structure sans t’en rendre compte. C’est typiquement le genre d’erreur qu’on découvre trop tard, après un export ou une consolidation.
L’idée à retenir est simple. Avec Range, tu ne manipules pas seulement des cellules. Tu pilotes une zone de travail, avec des choix qui ont un impact direct sur la lisibilité du code, la maintenance de la macro et les performances sur les vrais fichiers métier.
Tutoriels pratiques pour automatiser ton quotidien
La vraie progression commence quand tu appliques Range à une tâche métier. Pas à un exemple abstrait. À une tâche que tu fais vraiment.

Si tu veux créer rapidement ton premier script avant de l’améliorer, tu peux t’aider de ce guide pour créer une macro VBA.
1. Lire et écrire des données dans un tableau de synthèse
Supposons que tu as une feuille Clients et une feuille Synthese. Tu veux récupérer le nom d’un client et son chiffre d’affaires.
Sub CopierDonnees()
Worksheets("Synthese").Range("A2").Value = Worksheets("Clients").Range("A2").Value
Worksheets("Synthese").Range("B2").Value = Worksheets("Clients").Range("C2").Value
End Sub
Pourquoi c’est utile ?
Parce que tu peux alimenter un tableau de bord, une fiche client, un mini reporting ou un onglet de restitution sans faire de copier-coller.
Ce qui bloque souvent les débutants
Ils oublient de qualifier la feuille. Résultat, Range("A2") agit sur la feuille active, pas forcément sur la bonne.
2. Parcourir une colonne et appliquer une règle visuelle
Tu as une colonne de chiffres d’affaires mensuels. Tu veux colorer en vert ceux qui atteignent l’objectif.
Sub ColorerObjectifs()
Dim i As Long
For i = 2 To 20
If Cells(i, 2).Value >= 10000 Then
Cells(i, 2).Interior.Color = vbGreen
End If
Next i
End Sub
Ici, Cells(i, 2) pointe la colonne B (l’exercice parcourir une plage avec une boucle For te fait pratiquer ce geste). Tu pourrais adapter ça à :
- un suivi RH où tu repères les contrats arrivant à échéance
- un tableau de recouvrement où tu mets en évidence les retards
- un suivi commercial où tu surlignes les objectifs atteints
3. Rendre la macro dynamique avec End et CurrentRegion
C’est souvent là que tout bascule. Tant que tu codes A2:A20, ta macro fonctionne. Puis le mois suivant, tu as 37 lignes. Ou 412. Et tout casse.
La solution, c’est de rendre la plage dynamique.
Détecter la dernière ligne remplie
Sub DerniereLigne()
Dim derniereLigne As Long
derniereLigne = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox derniereLigne
End Sub
Ici, Excel part du bas de la colonne A et remonte jusqu’à la dernière cellule remplie.
Capturer un bloc complet automatiquement
Sub BlocDeDonnees()
Dim r As Range
Set r = Range("A1").CurrentRegion
r.Font.Name = "Calibri"
End Sub
Si ton tableau commence en A1, CurrentRegion attrape tout le bloc contigu. C’est très pratique pour des exports propres, sans lignes vides au milieu.
Sur le terrain,
CurrentRegionest souvent le moyen le plus rapide pour dire à Excel : “prends tout le tableau autour de cette cellule”.
4. Ajouter une formule automatiquement à côté d’un tableau
Tu as un export RH ou financier. Tu veux calculer une colonne de contrôle sans tirer la formule à la main.
Sub AjouterFormule()
Dim r As Range
Set r = Range("A1").CurrentRegion
Set r = r.Offset(1).Resize(r.Rows.Count - 1)
r.Columns(r.Columns.Count).Offset(0, 1).Formula = "=SUM(" & r.Rows(1).Address(False, False) & ")"
End Sub
Ici, Offset(1) et Resize retirent la ligne d’en-tête, puis Offset(0, 1) vise la seule colonne vide à droite du bloc. L’adresse relative (A2:C2) s’ajuste à chaque ligne, si bien que chaque ligne reçoit son propre total sans toucher aux données.
Ce type de logique sert souvent pour :
| Situation | Utilisation de Range |
|---|---|
| Reporting financier | ajouter une colonne d’écart ou de total |
| Suivi RH | ajouter une formule de statut ou d’ancienneté |
| Contrôle qualité | ajouter un indicateur de validation |
5. Travailler avec des plages nommées
Les plages nommées rendent le code plus lisible. Au lieu de manipuler Range("F2:F200"), tu manipules un nom métier.
Sub UtiliserPlageNommee()
Range("ChiffreAffaires_2026").Font.Bold = True
End Sub
L’intérêt est énorme :
- le code est plus clair
- tu relies le VBA à une logique métier
- tu réduis la dépendance à une adresse fixe
Pour un consultant ou un contrôleur de gestion, c’est très propre dans des modèles qui vivent longtemps.
Astuce bonus
Quand tu nettoies un tableau, pense aussi à UsedRange ou à CurrentRegion pour éviter les macros rigides. Une macro souple ne dépend pas d’un volume figé. Elle s’adapte au fichier réel.
Techniques avancées pour optimiser tes macros VBA
Tu lances une macro sur 200 lignes, tout va bien. Tu la relances le lendemain sur un export de 40 000 lignes pour un reporting financier mensuel, et Excel semble figé. C’est souvent à ce moment-là qu’on comprend une chose simple. En VBA, une macro correcte ne suffit pas. Il faut une macro qui tient la charge sur un vrai fichier métier.
L’idée à retenir est la suivante. Range fonctionne comme un GPS. Si tu lui demandes un trajet propre, direct et groupé, il t’emmène vite au bon endroit. Si tu le forces à repasser cellule par cellule, feuille par feuille, avec des détours inutiles, le temps de traitement explose.
Réduis les actions visibles pendant l’exécution
Excel perd du temps à rafraîchir l’écran, recalculer et gérer des changements que l’utilisateur n’a pas besoin de voir pendant la macro.
Application.ScreenUpdating = False
' Ton code
Application.ScreenUpdating = True
Sur un suivi RH avec des mises en forme, des copies de plages et des filtres, cette simple ligne change déjà le confort d’utilisation. La macro paraît plus stable, et elle passe moins de temps à redessiner la feuille.
Tu peux aller plus loin sur les gros fichiers en coupant aussi le calcul automatique pendant le traitement, puis en le restaurant à la fin. Là, il faut être rigoureux. Si tu oublies de réactiver les paramètres, tu crées un autre problème pour l’utilisateur.
Supprime les détours avec Select
Select ressemble à un geste naturel parce qu’il imite ce qu’on fait à la main dans Excel. Pourtant, en VBA, c’est souvent une perte de temps et une source d’erreurs.
' À éviter
Range("A1").Select
Selection.Value = "OK"
' À préférer
Range("A1").Value = "OK"
Dans le premier cas, Excel doit activer la cellule, afficher la sélection, puis appliquer l’action. Dans le second, il écrit directement à la bonne adresse. Pour un fichier de contrôle budgétaire ou un export de paie, cette différence devient vite visible.
Dans les boucles, Cells est souvent plus propre
Quand tu parcours une grande série de lignes, Cells(i, 1) est souvent plus simple à maintenir que Range("A" & i). Tu évites de reconstruire une adresse texte à chaque tour, et ton code reste plus lisible.
Dim i As Long
For i = 1 To 5000
Cells(i, 1).Value = i
Next i
Lis-le comme ça. Cells(i, 1) veut dire “ligne i, colonne 1”. C’est très pratique dans un traitement répétitif, par exemple pour remplir un identifiant, poser un statut RH ou vérifier une colonne de montants.
Travaille par blocs
Beaucoup de macros lentes ont le même défaut. Elles répètent 1 000 fois une action qu’Excel sait faire en une seule instruction.
Range("A1:J1000").Rows(1).Font.Bold = True
Range("E1:E1000").NumberFormat = "#,##0.00 €"
Cette logique change tout. Au lieu de piloter Excel cellule par cellule, tu lui donnes une consigne globale. C’est exactement ce qu’il fait le mieux.
Pose-toi cette question à chaque boucle. “Est-ce que je suis en train de traiter une cellule, alors que je pourrais traiter une plage entière ?”
Pour les gros volumes, passe par un tableau VBA
C’est le réflexe des macros professionnelles. Tu lis la plage une fois, tu travailles en mémoire, puis tu réécris le résultat d’un coup. Les échanges entre VBA et la feuille sont souvent le vrai goulot d’étranglement.
La logique tient en trois étapes :
- lire une plage dans un tableau VBA
- modifier les valeurs en mémoire
- réécrire le tableau dans la plage
Sur un export comptable, un journal de ventes ou un fichier RH lourd, cette approche fait souvent la différence entre une macro “acceptable” et une macro utilisable tous les jours.
Un exemple concret pour comprendre le gain
Tu veux marquer comme “À vérifier” toutes les lignes dont le montant dépasse un seuil.
Version lente. Tu écris dans la feuille à chaque passage.
Dim i As Long
For i = 2 To 5000
If Cells(i, 5).Value > 10000 Then
Cells(i, 6).Value = "À vérifier"
End If
Next i
Version plus solide sur gros volume. Tu lis d’abord les données, puis tu réécris en bloc. Le code est un peu plus avancé, mais la logique est bien plus adaptée à un environnement pro où les volumes varient selon les mois.
Garde un code rapide, mais aussi sûr
L’optimisation ne consiste pas seulement à gagner quelques secondes. Elle sert aussi à éviter les macros qui deviennent imprévisibles sur les fichiers des collègues, sur un poste plus lent, ou sur une feuille plus lourde que prévu.
Si tu développes pour un usage métier francophone, pense toujours à ces trois questions :
- est-ce que je travaille sur la bonne feuille, de façon explicite ?
- est-ce que je traite une plage complète plutôt qu’une suite d’actions isolées ?
- est-ce que cette macro restera rapide si le fichier double de taille ?
Si tu veux te former à ce niveau, cherche des ressources centrées sur des cas réels et pas seulement sur des exemples de démonstration. Notre leçon Macros VBA est une bonne base pour aller au-delà des macros de démonstration et construire des automatismes fiables.
Déjouer les Pièges Courants avec l'Objet Range
Tu lances ta macro de reporting financier. Sur ton fichier, tout passe. Tu l’envoies à un collègue du service RH, et là, erreur, résultat décalé, ou feuille qui refuse la modification. Avec Range, les bugs les plus pénibles ne viennent pas toujours de la syntaxe. Ils viennent du terrain. Feuille protégée, cellules fusionnées, plage mal qualifiée, tableau incomplet. Ce sont les cas réels que beaucoup de tutoriels survolent, alors que ce sont eux qui font perdre du temps en entreprise, surtout sur des classeurs lourds partagés par plusieurs personnes.

Le scénario est fréquent : une macro semble correcte pendant les tests, puis échoue dès qu’elle rencontre une structure de feuille un peu différente. Si tu travailles sur des fichiers métier volumineux, mieux vaut apprendre à repérer ces pièges tôt.
L’erreur 91 et le fameux Set oublié
Le message ressemble à ça : Object variable or With block variable not set.
Cela signifie que ta variable Range existe dans le code, mais ne pointe vers aucune vraie plage. Un peu comme un GPS allumé sans destination enregistrée. L’outil fonctionne, mais il ne sait pas où aller.
Dim rng As Range
rng.Value = "Test"
Ce code plante. Il manque :
Set rng = Range("A1")
Version correcte :
Dim rng As Range
Set rng = Range("A1")
rng.Value = "Test"
Cette erreur revient souvent dans les macros écrites rapidement, puis réutilisées plus tard dans un autre contexte.
La feuille active te joue souvent un mauvais tour
Range("A1") est pratique pour un test rapide. En environnement pro, c’est souvent un piège. Si l’utilisateur a cliqué sur la mauvaise feuille avant de lancer la macro, ton code écrit au mauvais endroit.
Range("A1").Value = "OK"
Pour fiabiliser le comportement, précise la feuille :
Worksheets("Synthese").Range("A1").Value = "OK"
Ton Range fonctionne alors comme un GPS avec adresse complète, pas comme une indication vague du type "tourne quelque part à gauche".
Même logique pour Cells, Rows, Columns et UsedRange.
Dans un suivi RH, ce détail évite par exemple d’écrire une date de mise à jour dans l’onglet d’archive au lieu de l’onglet actif du mois en cours.
Les cellules fusionnées cassent la logique
Les cellules fusionnées rendent une feuille plus jolie. Elles rendent aussi les macros plus fragiles.
Pourquoi ? Parce que Range ne "voit" plus une grille simple et régulière. Une copie peut viser une zone inattendue. Un Offset peut se comporter de façon confuse. Une détection de bloc avec CurrentRegion peut donner un résultat incohérent.
Si ton objectif est d’automatiser un tableau de reporting, garde les fusions pour les titres, pas pour la zone de données. Dans un gros fichier, c’est un choix de performance et de maintenance, pas seulement de mise en forme.
Sécuriser End et CurrentRegion
Les plages dynamiques sont utiles, surtout quand le nombre de lignes change chaque semaine. Mais elles demandent des vérifications. Une colonne vide au mauvais endroit, un onglet renommé, ou une feuille partiellement remplie, et la macro vise la mauvaise zone.
Un garde-fou utile :
Sub ExempleSecurise()
Dim rng As Range
On Error Resume Next
Set rng = Worksheets("Données").Range("A1").CurrentRegion
On Error GoTo 0
If Not rng Is Nothing Then
rng.Offset(0, 1).Font.Bold = True
End If
End Sub
L’idée n’est pas de cacher les erreurs. L’idée est de contrôler si la plage existe avant de l’utiliser.
Sur un petit fichier, une erreur de plage se repère vite. Sur un classeur de plusieurs dizaines de milliers de lignes, elle peut ralentir la macro, produire un mauvais export, ou fausser un indicateur sans que personne ne s’en rende compte.
Une macro fiable ne suppose pas que la feuille est propre. Elle vérifie.
En résumé, deviens indispensable grâce à VBA
Tu n’as pas besoin de connaître tout VBA pour devenir beaucoup plus efficace. Tu as surtout besoin de maîtriser Range, parce que c’est lui qui relie ton code à la réalité de la feuille.
Quand tu sais viser une cellule, un bloc, une colonne ou une plage dynamique, tu peux automatiser des tâches très concrètes. Alimenter un reporting financier. Mettre en forme un suivi RH. Contrôler un export. Nettoyer un tableau avant analyse. Tout ça devient plus rapide, plus fiable, et moins dépendant de manipulations manuelles.
Tu sais maintenant :
- ce qu’est un Range
- comment utiliser ses propriétés et méthodes clés
- quand choisir Range ou Cells
- comment rendre une macro plus rapide
- comment éviter les erreurs les plus courantes
La suite dépend surtout de ta pratique. Prends une tâche répétitive de ton quotidien. Une seule. Automatise-la. Même un petit script peut changer ton rapport au travail sur Excel.
Si tu veux prolonger l’apprentissage avec une ressource structurée, le livre J'excelle en Excel est un excellent point d’appui pour progresser avec méthode.
Questions Fréquemment Posées sur Range en VBA
Faut-il utiliser Range ou Cells dans une macro professionnelle
Dans une macro métier, tu vas souvent utiliser les deux.
Range sert bien quand tu connais déjà l’adresse à viser. C’est le choix le plus lisible pour un titre, une zone fixe, ou un bloc de reporting qui ne bouge pas. Cells, lui, devient pratique dès que ta macro calcule une ligne, parcourt un tableau ou s’adapte à un nombre d’enregistrements variable.
Le plus simple est de voir Range comme une adresse écrite en toutes lettres, et Cells comme des coordonnées GPS. Pour un suivi RH qui ajoute chaque mois de nouveaux collaborateurs, Cells t’aide à viser la bonne ligne. Pour écrire l’en-tête d’un reporting financier, Range("A1") reste plus clair.
Un exemple très classique :
Range("A1").Value = "Nom"
Cells(2, 1).Value = "Dupont"
Si tu débutes, retiens cette règle simple. Range pour une zone connue. Cells pour une position calculée.
Comment manipuler plusieurs plages non contiguës
Oui, avec Union.
Cette méthode regroupe plusieurs zones séparées en un seul objet Range, ce qui t’évite de répéter la même action bloc par bloc.
Dim multi As Range
Set multi = Union(Range("A1:B2"), Range("D5:E6"))
multi.Interior.Color = vbRed
C’est utile dans un fichier de contrôle interne, par exemple si tu veux colorer plusieurs zones sensibles d’un onglet. Tu peux aussi t’en servir pour marquer des écarts dans un export comptable ou signaler plusieurs cellules à vérifier dans un tableau RH.
Attention à un point qui surprend souvent. Union échoue si les plages ne sont pas sur la même feuille. Qualifie donc toujours tes références si ton classeur contient plusieurs onglets.
Est-ce que Range peut bien fonctionner avec Power Query
Oui, surtout dans des fichiers professionnels où les données arrivent sous forme d’exports qui changent de taille.
Le bon réflexe consiste à préparer la zone avec VBA, puis à laisser Power Query faire le nettoyage ou la transformation. En pratique, VBA peut redimensionner la plage source, vérifier qu’elle ne contient pas de lignes parasites, ou alimenter un tableau structuré avant actualisation. C’est une approche très utile pour un public francophone qui travaille sur des reportings mensuels, des extractions SIRH ou des exports ERP rarement propres du premier coup.
Beaucoup d’analystes trouvent difficile de faire cohabiter VBA et Power Query, surtout quand le fichier grossit. Le problème ne vient pas seulement de la syntaxe. Il vient souvent du timing. La plage n’est pas encore à jour au moment du rafraîchissement, ou la requête pointe vers une source qui a changé de forme.
Dans ce cas, ton enchaînement doit rester simple :
- définir la plage source en VBA
- vérifier que les données attendues sont bien présentes
- lancer ou accompagner le rafraîchissement Power Query
Sur les gros fichiers, cette discipline évite une bonne partie des erreurs silencieuses.
Pourquoi mon code Range marche un jour et plante le lendemain
Le plus souvent, ton code vise le bon endroit, mais dans le mauvais contexte.
Voici les causes les plus fréquentes :
- la mauvaise feuille est active
- la structure du tableau a changé
- une plage dynamique renvoie une zone inattendue
- des cellules sont fusionnées
- la feuille est protégée
Dans la vraie vie, une macro casse rarement sur un exemple propre. Elle casse sur un fichier reçu à 8 h 42, avec une colonne ajoutée, deux lignes vides et un onglet renommé par un collègue. C’est pour ça qu’une macro professionnelle doit vérifier ses repères avant d’écrire dans la feuille.
Si ton fichier devient lourd, ajoute aussi des contrôles simples avant d’agir. Teste si la feuille existe. Vérifie si la plage n’est pas vide. Évite Select et Activate. Tu gagnes en vitesse, mais surtout en fiabilité.