TL;DR —
Intersectne renvoie que les cellules que deux plages partagent. Si elles ne se touchent pas, il renvoieNothing— pas une plage vide, pas une erreur — et ceNothingest tout l'intérêt. Son usage numéro un est de protéger un événementWorksheet_Changepour qu'il ne réagisse qu'aux modifications de la colonne qui vous intéresse. La règle qui compte le plus : aucun chevauchement signifieNothing, si bien que tout accès à une propriété sans vérificationIs Nothingplante avecerror 91:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Me.Range("B:B")) Is Nothing Then Exit Sub ' la modification n'etait pas dans la colonne B
Application.EnableEvents = False ' empecher notre propre ecriture de redeclencher ceci
Target.Offset(0, 1).Value = Now ' inscrire l'heure juste a cote
Application.EnableEvents = True
End Sub
Union combine des plages ; Intersect est son contraire — il rétrécit jusqu'à la partie
commune. Et à la différence de toutes les références qui précèdent, Intersect peut légitimement ne
renvoyer rien du tout, car deux plages qui ne se chevauchent pas n'ont aucune cellule commune. Ce
guide s'articule autour d'une seule idée — Intersect répond à une question par oui ou non (« est-ce
que ça se chevauche ? ») en renvoyant soit le chevauchement, soit Nothing, et vous devez vérifier
lequel avant d'y toucher. Cette seule habitude sépare un gestionnaire d'événement robuste d'un
gestionnaire qui plante au mauvais clic.
Ce que vous allez apprendre
- Le modèle mental —
Intersectrenvoie le chevauchement de deux plages, ouNothingsi elles se manquent - La règle la plus importante — aucun chevauchement vaut
Nothing, alors protégez avecIs Nothingou heurtezerror 91 - L'usage phare — la protection de
Worksheet_Change, et le piègeEnableEventsqui l'accompagne - Restreindre une macro à une zone cible avec
Intersect(Selection, ...) - Pourquoi
Intersect(∩, chevaucher) est le contraire d'Union (∪, combiner) - Les intersections multi-plages et la règle de la même feuille
Le modèle mental : Intersect est le chevauchement de deux plages
Remettez deux plages à Intersect et il renvoie une référence vers les seules cellules présentes dans
les deux :
Dim shared As Range
Set shared = Intersect(Range("A1:D10"), Range("C5:F20"))
' shared vaut C5:D10 - le rectangle commun aux deux plages
Si les deux plages ne partagent rien, il n'y a aucun rectangle commun à renvoyer, donc Intersect
renvoie Nothing. C'est ce comportement qui le rend utile : vous vous souciez rarement des
cellules du chevauchement elles-mêmes — vous vous souciez de savoir s'il y a un chevauchement, tout
court. « Cette cellule est-elle à l'intérieur de cette zone ? » devient « Intersect(cellule, zone)
vaut-il quelque chose plutôt que Nothing ? » Intersect transforme une question de géométrie en un
simple test de présence.
La règle la plus importante : aucun chevauchement renvoie Nothing
Parce qu'un manque renvoie Nothing, se saisir de n'importe quelle propriété ou méthode du
résultat sans vérifier d'abord, c'est un plantage qui ne demande qu'à arriver :
' FRAGILE - error 91 des l'instant ou les plages ne se chevauchent pas :
MsgBox Intersect(Selection, Range("B:B")).Address
Quand Selection n'est pas dans la colonne B, Intersect vaut Nothing, et .Address sur Nothing
lève error 91, « Object variable or With block variable not set ». Le correctif consiste toujours
à tester d'abord avec Is Nothing, et la formulation idiomatique emploie If Not ... Is Nothing
pour signifier « s'il y a un chevauchement » :
If Not Intersect(Selection, Range("B:B")) Is Nothing Then
MsgBox "Your selection touches column B."
End If
Lisez If Not (chevauchement) Is Nothing comme « si le chevauchement n'est pas nothing » —
c'est-à-dire s'il existe. Les deux erreurs ici sont de laisser tomber le Not (ce qui inverse la
logique) et de laisser tomber la vérification Is Nothing (ce qui plante en cas de manque). Mémorisez
la phrase entière ; c'est l'une des lignes les plus tapées de tout VBA.
L'usage phare : la protection de Worksheet_Change
Voici où Intersect gagne sa place. Un événement Worksheet_Change se déclenche à chaque
modification, où qu'elle soit sur la feuille, et 99 % du temps vous ne voulez réagir qu'aux changements
d'une seule colonne ou zone. Sans protection, votre gestionnaire s'exécute à chaque frappe sur toute la
feuille — lent et intrusif. Intersect est la protection : il demande si la cellule modifiée
(Target) chevauche la plage que vous surveillez.
Private Sub Worksheet_Change(ByVal Target As Range)
' N'agir que si la modification tombe dans la plage de donnees B2:B1000 :
If Intersect(Target, Me.Range("B2:B1000")) Is Nothing Then Exit Sub
Application.EnableEvents = False ' CRITIQUE - voir ci-dessous
On Error GoTo CleanExit
Dim c As Range
For Each c In Intersect(Target, Me.Range("B2:B1000")).Cells
c.Offset(0, 1).Value = "edited " & Format(Now, "yyyy-mm-dd hh:nn")
Next c
CleanExit:
Application.EnableEvents = True ' toujours retablir, meme apres une erreur
End Sub
Deux choses font de ceci le motif correct. D'abord, la ligne de protection If Intersect(...) Is Nothing Then Exit Sub ressort tôt à toute modification hors de la cible, si bien que le corps ne
s'exécute que quand il le doit. Ensuite — et c'est le piège qui attrape tout le monde — le gestionnaire
écrit dans une cellule, et écrire dans une cellule déclenche Worksheet_Change de nouveau, ce
qui écrit encore, et ainsi de suite. Application.EnableEvents = False brise cette récursion, et il
doit être rétabli dans une étiquette CleanExit pour qu'une erreur en plein gestionnaire ne laisse pas
les événements désactivés pour le reste de la session (voir VBA On Error et
Worksheet_Change). La protection Intersect et la protection
EnableEvents sont sœurs — vous ne voulez presque jamais l'une sans l'autre.
Restreindre une macro à une zone cible
Le même test de chevauchement cadre une macro ordinaire à une zone. Supposez qu'une macro de mise en forme ne doive toucher que les cellules que l'utilisateur a sélectionnées à l'intérieur de la zone d'impression — intersectez la sélection avec la zone et travaillez sur le résultat :
Dim scope As Range
Set scope = Intersect(Selection, Range("PrintArea"))
If scope Is Nothing Then
MsgBox "Select cells inside the print area first."
Exit Sub
End If
scope.Font.Bold = True ' seulement les cellules selectionnees qui tombent dans PrintArea
C'est un motif plus propre que de vérifier à la main l'adresse de chaque cellule sélectionnée :
Intersect calcule le sous-ensemble dans les limites en un seul appel, et la branche Is Nothing
traite le cas « la sélection a entièrement manqué la zone ».
Intersect vs Union : chevaucher contre combiner
Intersect (∩) et Union (∪) sont les deux opérateurs d'ensembles sur les
plages, et ils tirent en sens opposés. Union(A, B) fait grandir une référence vers tout ce qui est
dans l'une ou l'autre plage. Intersect(A, B) la réduit à seulement ce qui est dans les deux,
ou Nothing. Union ne renvoie jamais Nothing (vous lui avez donné de vraies plages à combiner) ;
Intersect renvoie Nothing à tout bout de champ, et c'est sa fonctionnalité, pas un défaut.
Servez-vous d'Union pour assembler des cellules éparpillées en vue d'une opération par lot, et
d'Intersect pour tester ou restreindre — pour demander si une modification, une sélection ou une
cellule tombe à l'intérieur d'une zone qui vous intéresse.
Les intersections multi-plages et la règle de la même feuille
Intersect accepte plus de deux plages et renvoie les cellules communes à toutes —
Intersect(rngA, rngB, rngC) est la zone que couvre chaque argument. Comme avec Union, chaque plage
doit être sur la même feuille, sinon vous obtenez error 1004. Et la même discipline s'applique au
résultat : si l'intersection pouvait être vide, testez Is Nothing avant de l'utiliser — avec trois
plages ou plus, un chevauchement vide est encore plus probable qu'avec deux.
Comment ExcelMaster aide
Intersect est une petite méthode qui cache deux règles faciles à oublier : vérifiez Is Nothing
avant de toucher le résultat, et associez la protection d'événement à EnableEvents = False pour qu'un
changement auto-déclenché ne s'emballe pas. Manquez la première et vous plantez avec error 91 ;
manquez la seconde et un gestionnaire Worksheet_Change se redéclenche tout seul en un scintillement
ou un blocage.
ExcelMaster vous laisse plutôt
décrire le comportement. Dites « quand quelqu'un modifie la colonne B, inscris l'heure dans la colonne
C », et il écrit la protection Intersect(Target, ...), le Exit Sub anticipé, la bascule
EnableEvents et le rétablissement CleanExit — tout le motif d'événement robuste, pas seulement le
cas idéal. Vous gardez le classeur et le code ; vous vous épargnez la séance de débogage où le
gestionnaire s'est déclenché sur la mauvaise cellule ou a bouclé sur lui-même.
Questions fréquentes
Que fait la méthode Intersect en VBA Excel ?
Intersect renvoie une plage des cellules que deux plages ou plus ont en commun — leur
chevauchement. Intersect(Range("A1:D10"), Range("C5:F20")) renvoie C5:D10. Si les plages ne se
chevauchent pas du tout, Intersect renvoie Nothing, ce qui explique pourquoi il sert à tester si
une plage tombe à l'intérieur d'une autre.
Pourquoi Intersect renvoie-t-il Nothing et fait-il planter mon code ?
Quand les plages ne partagent aucune cellule, Intersect renvoie Nothing plutôt qu'une plage vide.
Accéder à n'importe quelle propriété dessus — .Address, .Cells, .Value — lève alors error 91.
Testez toujours d'abord avec If Not Intersect(a, b) Is Nothing Then (ce qui signifie « s'il y a un
chevauchement ») avant d'utiliser le résultat.
Comment utiliser Intersect dans un événement Worksheet_Change ?
Protégez le gestionnaire pour qu'il ne réagisse qu'aux modifications à l'intérieur de votre plage
cible : If Intersect(Target, Me.Range("B2:B1000")) Is Nothing Then Exit Sub. Ensuite, définissez
Application.EnableEvents = False avant d'écrire dans une cellule — sinon votre écriture redéclenche
Worksheet_Change — et rétablissez-le à True dans une étiquette CleanExit pour qu'une erreur ne
puisse pas laisser les événements désactivés.
Quelle est la différence entre Intersect et Union en VBA ?
Ce sont des opérations d'ensembles opposées. Intersect ne renvoie que les cellules présentes dans les
deux plages (le chevauchement), ou Nothing si elles ne se touchent pas. Union renvoie les
cellules présentes dans l'une ou l'autre plage (la zone combinée). Servez-vous d'Intersect pour
tester ou restreindre une zone, et d'Union pour assembler des cellules éparpillées en une seule
référence.
Intersect peut-il prendre plus de deux plages ?
Oui. Intersect(rngA, rngB, rngC) renvoie les cellules communes à toutes les plages. Chaque plage
doit être sur la même feuille, et le résultat peut valoir Nothing si les plages ne partagent aucune
cellule commune — ce qui est plus probable avec trois plages ou plus, alors vérifiez toujours
Is Nothing.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 16/08/2026.
Guides associés : VBA Union · VBA SpecialCells · VBA Worksheet_Change · VBA On Error · VBA Range
