TL;DR —
Unioncolle des rectangles éparpillés en une seule référence pour que vous puissiez agir sur plusieurs blocs non adjacents d'un coup. C'est la version en code du Ctrl-clic sur plusieurs zones. La règle qui compte le plus :Unionconcatène, il ne déduplique pas — les cellules qui se chevauchent sont comptées deux fois, c'est donc une liste de lot, et non une union d'ensembles au sens mathématique. Sa forme la plus utile est le motif d'accumulation, qui collecte les cellules dans une boucle et agit sur elles en une fois :
Dim flagged As Range, c As Range
For Each c In ThisWorkbook.Worksheets("Data").Range("B2:B1000")
If c.Value < 0 Then
If flagged Is Nothing Then Set flagged = c Else Set flagged = Union(flagged, c)
End If
Next c
If Not flagged Is Nothing Then flagged.Interior.Color = vbRed ' colore chaque correspondance en un seul appel
Jusqu'ici, chaque référence tenait un seul rectangle. Union brise cette limite : une même
variable de plage peut désormais contenir B2, D5:D9 et F1 en même temps, et une seule ligne
colore, efface ou copie les trois. Là où SpecialCells laisse Excel choisir pour vous un ensemble
non contigu, Union vous laisse en construire un délibérément. Ce guide s'articule autour d'une
seule idée — Union est la façon d'assembler un lot pour agir dessus en une fois, pas un moyen de
calculer un ensemble dédupliqué. Acquérez-la et la surprise du .Count comme l'erreur Nothing
prennent tout leur sens.
Ce que vous allez apprendre
- Le modèle mental —
Unioncombine des plages non adjacentes en une seule référence (le Ctrl-clic en code) - La règle la plus importante — il concatène, ne déduplique pas, donc les chevauchements comptent double
- Le motif d'accumulation —
If Is Nothing ... Else Unionet pourquoi il évite une erreur d'exécution - Les opérations par lot — colorer, effacer ou copier de nombreux blocs en un seul appel plutôt qu'une boucle
- Les limites — au moins deux arguments, pas de
Nothing, toutes les zones sur la même feuille - En quoi
Union(∪, combiner) diffère d'Intersect (∩, chevaucher)
Le modèle mental : Union combine des plages non adjacentes en une seule référence
Union prend deux plages ou plus et renvoie une plage unique qui les couvre toutes :
Dim multi As Range
Set multi = Union(Range("A1:A3"), Range("C1:C3"), Range("E1"))
multi.Interior.Color = vbYellow ' trois blocs distincts, surlignes ensemble
Cette référence se comporte comme n'importe quelle autre plage pour la plupart des opérations — un
seul .Interior.Color, un seul .ClearContents, un seul .Copy touche chaque bloc. Pensez à
sélectionner des cellules à la main en maintenant Ctrl : vous cliquez A1:A3, puis C1:C3, puis E1,
et les voilà qui se déplacent en groupe. Union, c'est ce Ctrl-clic exprimé en code, et c'est la seule
façon de remettre une sélection non adjacente unique à une seule opération.
La règle la plus importante : Union concatène, il ne déduplique pas
Voici où le nom induit en erreur. En théorie des ensembles, une « union » retire les doublons. Le
Union de VBA, non. Il coud les zones telles quelles, si bien que les cellules présentes dans plus
d'un argument sont comptées deux fois :
Dim u As Range
Set u = Union(Range("A1:A5"), Range("A3:A8"))
Debug.Print u.Count ' affiche 11 (5 + 6), PAS 8 - A3:A5 comptee deux fois
Le chevauchement A3:A5 est inclus depuis les deux arguments, donc .Count annonce 11 pour ce qui n'est
que 8 cellules distinctes. C'est sans danger quand vous opérez sur la référence — définir deux fois
une couleur sur la même cellule ne fait rien de mal — mais c'est un vrai bug si vous faites .Count
sur le résultat, le sommez, ou l'envoyez quelque part qui suppose des cellules distinctes. À retenir :
servez-vous d'Union pour assembler des cellules sur lesquelles agir, jamais pour calculer combien
de cellules distinctes vous avez. Si vous avez réellement besoin d'un ensemble dédupliqué, filtrez
plutôt les données avec un AutoFilter.
Le motif d'accumulation : construire une référence dans une boucle
L'usage le plus précieux d'Union, c'est de collecter les correspondances au fil d'une boucle et
d'agir sur elles en une fois à la fin. Mais il y a un piège : Union exige au moins deux vraies
plages et refuse Nothing, si bien que Union(rngAll, c) échoue à la première itération, quand
rngAll est encore vide. L'idiome standard protège la première cellule :
Dim rngAll As Range, c As Range
For Each c In Range("A2:A1000")
If Len(Trim(c.Value)) = 0 Then ' quelle que soit votre condition
If rngAll Is Nothing Then
Set rngAll = c ' premiere correspondance : l'amorcer directement
Else
Set rngAll = Union(rngAll, c) ' correspondances suivantes : etendre la reference
End If
End If
Next c
If Not rngAll Is Nothing Then rngAll.EntireRow.Delete ' une seule suppression pour toutes les correspondances
Lisez la protection ainsi : amorcez la référence avec la première correspondance, puis continuez à
unir le reste par-dessus. Sauter la branche If rngAll Is Nothing est l'erreur numéro un d'Union —
passer Nothing comme argument lève une erreur d'exécution à l'instant où la boucle trouve sa première
correspondance.
Les opérations par lot : un seul appel au lieu d'une boucle cellule par cellule
Pourquoi se donner la peine d'assembler une référence, au lieu d'agir sur chaque cellule au fur et à
mesure ? La vitesse. Toucher la feuille une fois par cellule est la première cause de macros qui
rampent. Collectez les cellules avec Union, puis effectuez une seule opération sur tout le
groupe — décidez dans la boucle, appliquez à la plage :
' Lent : ecrit dans la feuille a chaque ligne correspondante
For Each c In rng
If c.Value > 100 Then c.Interior.Color = vbGreen ' un acces feuille par correspondance
Next c
' Rapide : collecter d'abord, colorer une fois
For Each c In rng
If c.Value > 100 Then _
Set hot = IIf(hot Is Nothing, c, Union(hot, c))
Next c
If Not hot Is Nothing Then hot.Interior.Color = vbGreen ' un seul acces feuille
C'est la même discipline que le guide cell-color recommande pour le surlignage : rassemblez les cibles, appliquez la mise en forme une fois. Sur des milliers de lignes, la différence se compte en secondes contre millisecondes.
Les limites : deux arguments, pas de Nothing, même feuille
Trois contraintes piègent les gens, et toutes trois s'énoncent vite :
- Au moins deux plages.
Uniona besoin de deux arguments ou plus, et aucun ne peut valoirNothing— d'où la protection d'accumulation ci-dessus. - Même feuille. Chaque plage que vous unissez doit résider sur la même feuille. Combiner des
plages de deux feuilles lève
error 1004; si vous avez besoin de travailler entre feuilles, traitez séparément l'union de chaque feuille. - Le résultat est multi-zones. Comme SpecialCells, une union est une
référence non contiguë. Bouclez
For Each area In u.Areasquand vous avez besoin de chaque bloc contigu, et rappelez-vous que.Counttotalise chaque cellule sur toutes les zones (en comptant les chevauchements en double).
Union vs Intersect : combiner contre chevaucher
Union et Intersect sont les deux opérateurs d'ensembles sur les plages,
et ils sont opposés. Union(A, B) renvoie tout ce qui est dans A ou B — l'empreinte combinée.
Intersect(A, B) ne renvoie que ce qui est dans les deux — le chevauchement, ou Nothing s'ils ne
se touchent pas. Union fait grandir une référence ; Intersect la réduit à la partie commune.
Tournez-vous vers Union pour assembler des cellules éparpillées en un lot, et vers Intersect pour
tester ou restreindre — le plus célèbre étant de demander « l'utilisateur a-t-il modifié une cellule
à l'intérieur de la plage qui m'intéresse ? »
Comment ExcelMaster aide
Union est d'une simplicité trompeuse : la protection d'accumulation est facile à oublier à la
première itération, le double comptage du .Count corrompt en silence tout décompte, et le « même
feuille seulement » surgit sous forme d'un 1004 que vous n'attendiez pas. Aucun de ces cas n'apparaît
avant l'entrée précise qui le déclenche.
ExcelMaster vous laisse plutôt décrire
le résultat. Dites « surligne chaque ligne où le solde est négatif » ou « supprime toutes les lignes
vides de la colonne A », et il écrit la boucle, amorce la référence avec la première correspondance,
l'étend avec Union et effectue une seule opération sur tout le groupe — la version rapide et
protégée, sans le plantage Nothing ni le ralentissement cellule par cellule. Vous gardez le classeur
et le code ; vous vous épargnez la passe où la boucle a touché la feuille dix mille fois.
Questions fréquentes
Que fait la méthode Union en VBA Excel ?
Union combine deux plages ou plus en une seule référence qui les couvre toutes, même quand elles
ne sont pas voisines. Vous pouvez ensuite colorer, effacer, copier ou supprimer chaque bloc en une
opération. C'est l'équivalent en code du Ctrl-clic sur plusieurs zones d'une feuille pour qu'elles
agissent comme une seule sélection.
VBA Union retire-t-il les cellules en double ?
Non. Union concatène les plages sans dédupliquer, si bien qu'une cellule présente dans plus d'un
argument est comptée deux fois. Union(Range("A1:A5"), Range("A3:A8")).Count renvoie 11, pas 8.
C'est sans danger quand vous opérez sur la référence, mais faux si vous la comptez ou la sommez —
servez-vous d'Union pour assembler des cellules sur lesquelles agir, pas pour calculer un ensemble
distinct.
Pourquoi Union lève-t-il une erreur dans une boucle ?
Parce que Union exige au moins deux vraies plages et refuse Nothing. À la première itération, votre
variable accumulateur vaut encore Nothing, donc Union(rngAll, c) échoue. Protégez-la :
If rngAll Is Nothing Then Set rngAll = c Else Set rngAll = Union(rngAll, c) — amorcez avec la première
correspondance, puis unissez le reste.
Union peut-il combiner des plages de feuilles différentes ?
Non. Toutes les plages passées à Union doivent être sur la même feuille ; mélanger des feuilles
lève error 1004. Si vous devez travailler entre feuilles, construisez et traitez une union distincte
pour chaque feuille.
Quelle est la différence entre Union et Intersect en VBA ?
Ce sont des opérations d'ensembles opposées. Union renvoie tout ce qui est dans l'une ou l'autre
plage — la zone combinée. Intersect ne renvoie que ce qui est dans les deux — le chevauchement,
ou Nothing s'ils ne se touchent pas. Servez-vous d'Union pour assembler des cellules éparpillées en
un lot, et d'Intersect pour tester si une plage tombe à l'intérieur d'une autre.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 16/08/2026.
Guides associés : VBA Intersect · VBA SpecialCells · VBA Range · VBA Cell Color · VBA For Loop
