[VBA] Utilisation de la méthode Intersect
Un petit résumé des possibilités de la méthode Intersect en VBA
Exemple 1
On veut une action quand on Click sur la Cellule "A1" uniquement :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
MsgBox "Click on " & Target.Address
End If
End Sub
Exemple 2
On veut une action quand on Click n'importe où dans la colonne "A" uniquement :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("A:A")) Is Nothing Then
MsgBox "Click on " & Target.Address
End If
End Sub
Exemple 3
On veut une action quand on Click n'importe où dans les colonne "A" à "E" uniquement :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("A:E")) Is Nothing Then
MsgBox "Click on " & Target.Address
End If
End Sub
Exemple 4
On veut une action quand on Click n'importe où dans la Plage de "A1 à A10" uniquement :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("A1:A10")) Is Nothing Then
MsgBox "Click on " & Target.Address
End If
End Sub
Exemple 5
On veut une action quand on Click n'importe où dans plusieurs plages non-adjacentes :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("A1:A12, D4:D10, D20, D22, D55, E1:E12")) Is Nothing Then
MsgBox "Click on " & Target.Address
End If
End Sub
Exemple 6
On veut une action quand on Click n'importe où dans plusieurs colonnes non-contigues :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("A:A, C:C, E:E")) Is Nothing Then
MsgBox "Click on " & Target.Address
End If
End Sub
Exemple 7
On veut une action quand on Click n'importe où dans la ligne 1:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Rows(1)) Is Nothing Then
MsgBox "Click on " & Target.Address
End If
End Sub
Exemple 8
On veut une action quand on Click n'importe où dans entre les lignes 1 et 3:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range(Rows(1), Rows(3))) Is Nothing Then
MsgBox "Click on " & Target.Address
End If
End Sub
Par contre là où çà se corse c'est pour le faire en lignes non contigues...
Exemple 9
On veut une action quand on Click n'importe où dans dans les lignes 1 ou 3 uniquement (pas la 2) :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range(Rows(1), Rows(3))) Is Nothing Then
If Application.Intersect(Target, Rows(2)) Is Nothing Then
MsgBox "Click on " & Target.Address
End If
End If
End Sub
[b]Ouf !! lol
Mais bon on peut faire la même chose aussi comme çà :[/b]
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("A1:IV1, A3:IV3")) Is Nothing Then
MsgBox "Click on " & Target.Address
End If
End Sub
Edition: Ajout d'un exemple d'utilisation
https://www.excel-pratique.com/~files/doc/ExempleIntersect.xls
peut on m eclairicr sur ce sujet, car je voit pas l utiliter de ces formules
Jessaye d aprendre excel mais pas facile
Salut Djguitchom
Ce ne sont pas des formules, mais du code VBA
Regarde j'ai ajouté un exemple sur le premier fil.
Mytå
Bonjour,
Je n'y comprends pas grand chose, -Je tente d'apprendre toute seule et débuter à la presque soixantaine ce n’est pas facile- bien que petit à petit j'y vois un tout petit peu plus clair. Je suis néanmoins incapable de modifier ce code:
(Inutile de vous dire qu'il n'est pas de moi !)
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Application.Intersect(Target, Range("A1:P655")) Is Nothing Then
Cancel = True
Target.EntireRow.Interior.ColorIndex = xlNone
Target.Interior.ColorIndex = 6
End If
With Selection.Font
.Underline = xlUnderlineStyleNone
.ColorIndex = 1
End With
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
With Selection.Font
.Underline = xlUnderlineStyleNone
.ColorIndex = 16
End With
Selection.Interior.ColorIndex = xlNone
End Sub
Car dans une liste sur plusieurs colonnes, j'ai besoin que la cellule cliquée devienne jaune/mots noirs, et revienne à son état initial au click droit, ce code fonctionne donc à priori parfaitement, sauf que : si j'ai besoin de sélectionner deux cellules dans deux colonnes différentes mais sur une même ligne, c'est impossible, la dernière cellule sélectionnée invalidant toute autre sur la même ligne.
Comment faire pour que cela puisse être accepté ? Ce n'est pas franchement grave puisque pour pallier à cet inconvénient j'utilise "copier la mise en forme" le reste du code étant valide au clic droit, mais s'il était possible de modifier ce code, cela me permettrai de comprendre davantage au vu de la modif.
Merci de me dire aussi si ce n'est pas trop vous demander, comment faire pour qu'une fois les cellules sélectionnées, les regrouper sur autre feuille pour impression.
Merci d'avance
Salut Bleuvert
Essaye en enlevant la ligne
Target.EntireRow.Interior.ColorIndex = xlNone
Mytå
Grand merci Mytå
C'est vrai qu'en y regardant de plus près et avec ton coup de pouce je vois bien le rapport,
C'est de cette façon que je pense parvenir à comprendre ce language.
Encore merci, pour la suite je vais essayer de me replonger dans mon bouquin sur Excel, mais je le trouve tellement indigeste qu'au bout d'une demi-page j'ai sommeil !
- Messages
- 9'249
- Excel
- Vista Office 2007FR
- Inscrit
- 8.12.2007
- Emploi
- retraité Sce.Méthodes
Bonjour à tous,
merci Mytå pour tes explications détaillées.
Dans ton fichier exemple, que signifie cette ligne de code ?
If .Count > 1 Then Exit Sub
et à quoi çà sert ?
amicalement
Claude.
Salut le forum
Claude la ligne
If .Count > 1 Then Exit Sub
permet de vérifier qu'une seule cellule à été sélectionnée et non une plage de cellule.
Mytå
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
MsgBox "Click on " & Target.Address
End If
End Sub
COMMENT CA MARCHE
Cette "Macro" est superbe
Toutefois quand je vais voir dans "outils" "macro", il n’y a rein ! ! !
1°) Ou se trouve cette "macro ???
2°) comment faire de même
Albert
Pour ma part, je fais PLEIN de macros commençant par sub macroalbert(), je peux les lancer et les modifier.
Ma question est simple, qu'es ce je n’ai pas saisi en programmation
Merci de m'éclairer
Salut le forum
Pour votre problème, cela vient de l'emplacement du code VB.
Le code ne doit pas se trouver dans un module (insertion module ou nouvelle macro)
mais directement dans la Feuille.
Vous devez donc quand vous vous trouvez dans Visual Basic (Alt+F11),
double-cliquer sur la Feuille et copier le code à cet emplacement.
Ceci permet un déclenchement évènementtiel de la macro...
Regarde l'exemple à la fin de ma première ficelle.
Mytå
Bonjour Mytå,
Je m'intéresse de près à cette méthode, mais je suis novice de chez novice en VBA.
Est-il faisable d'obtenir un affichage de Userforms différents en fonction de ce qui est choisi sur la même ligne mais dans la colonne de gauche(A par exemple), le tout en utilisant Intersect (pour la B)?
Bonjour,
tu veux un userform différent ou le même mais qui n'affiche pas tout à fait les mêmes choses ?
Si c'est un userform différent, il suffit de faire que si le click est en colonne A tu lances ton userform 1 et si c'est en B tu lances ton userform 2. Exemple pour affichage de l'userform sur un double click dans la colonne A ou B :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range)
If Not Application.Intersect(Target, Range("A:A")) Is Nothing Then
userform1.show
End If
If Not Application.Intersect(Target, Range("B:B")) Is Nothing Then
userform2.show
End If
End Sub
Après si tu veux le même userform mais qui affiche des choses différentes, cela va plus se passer au niveau de l'initialisation de l'userform dans son propre code à lui, que dans le code de lancement sur la feuille et cela ne sera pas spécialement lié à la fonction intersect().
Cordialement,
D'accord, je vois bien ce que tu veux dire, en ce qui me concerne, en colonne A il y aurait une liste déroulante, et ce que je voulais savoir c'est s'il est possible d'avoir un même UserForm mais n'affichant pas la même chose en B en fonction de ce qui a été selectionné en A.
Du coup ce serait plus un problème de code dans le Userform et l'histoire du choix en colonne précédente n'a rien à voir avec le Intersect si je comprends bien?
Tu as une liste déroulante en colonne A jusque là OK
par contre je ne vois pas le rapport entre l'userform et ta colonne B ? Un userform est une fenêtre qui s'ouvre par dessus ta feuille, donc que veux-tu dire par un "userform qui n'affiche pas la même chose en B" ?
Sinon oui tu peux initialiser différemment ton userform en fonction de la valeur de ta liste déroulante, mais effectivement cela se passe dans le code de l'userform, rien à voir avec intersect.
Cordialement,
Dans ma colonne A j'ai différents Modes de défaillance par exemple:
_Mauvais positionnement
_Endommager piece
Pour chaque mode de défaillance il y a ses effets dans la colonne B.
Jusque la j'avais fait des listes déroulantes en cascade, chaque liste dépendait du choix dans la liste située sur la colonne précédente.
Le problème est le suivant: je dois avoir chaque mode de défaillance l'un en dessous de l'autre sans sauter de ligne en colonne A, mais chaque mode à plusieurs effets, et, ces effets en colonne B peuvent avoir plusieurs causes en colonne C.
Voici pourquoi je voulais un UserForm qui me proposerait ce qu'il y avait autrefois dans ma liste déroulante, mais qui en plus, me permet de selectionner ce que je souhaite et de l'afficher dans une seul ligne.
Je ne sais pas si je fais bien d'expliquer cela sur ce post
Dans tous les cas merci beaucoup de prendre de ton temps pour m'aider
Oui si il y a un sujet d'ouvert autant s'en occuper la bas cela évitera de trop polluer ce cours.
D'ailleurs j'ai été le lire, et effectivement, je ne vois aucun rapport avec intersect().
Enfin j'ai vu que Banzai (qui est largement plus compétent que moi) avait déjà commencé à te repondre, donc je verrais si jamais il bloque mais je ne pense pas.
Cordialement,
Bonjour Mytå,
Je viens de découvrir ce fil (depuis ta réponse sur CCM),
pour l'Exemple 9 on peut utiliser Union pour créer la zone non continue et écrire :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Union(Rows(1), Rows(3))) Is Nothing Then
MsgBox "Click on " & Target.Address
End If
End Sub
Très cordialement
Patrice