🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Union dans Excel — combiner des plages non adjacentes en une seule référence (et pourquoi il ne déduplique pas)

|

VBA Union dans Excel — combiner des plages non adjacentes en une seule référence (et pourquoi il ne déduplique pas)

TL;DRUnion colle 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 : Union concatè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 — Union combine 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 Union et 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. Union a besoin de deux arguments ou plus, et aucun ne peut valoir Nothing — 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.Areas quand vous avez besoin de chaque bloc contigu, et rappelez-vous que .Count totalise 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