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

VBA Intersect dans Excel — trouver où deux plages se chevauchent (et la protection Worksheet_Change que tout le monde emploie)

|

VBA Intersect dans Excel — trouver où deux plages se chevauchent (et la protection Worksheet_Change que tout le monde emploie)

TL;DRIntersect ne renvoie que les cellules que deux plages partagent. Si elles ne se touchent pas, il renvoie Nothing — pas une plage vide, pas une erreur — et ce Nothing est tout l'intérêt. Son usage numéro un est de protéger un événement Worksheet_Change pour qu'il ne réagisse qu'aux modifications de la colonne qui vous intéresse. La règle qui compte le plus : aucun chevauchement signifie Nothing, si bien que tout accès à une propriété sans vérification Is Nothing plante avec error 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 — Intersect renvoie le chevauchement de deux plages, ou Nothing si elles se manquent
  • La règle la plus importante — aucun chevauchement vaut Nothing, alors protégez avec Is Nothing ou heurtez error 91
  • L'usage phare — la protection de Worksheet_Change, et le piège EnableEvents qui 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 à toutesIntersect(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