Clic droit et sélection change s'éxécutent les 2
Bonjour,
Voilà je m'amuse à faire un petit démineur pour m'exercer. Le problème est que ma macro éxécute à la fois :
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
et
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Comment bloquer selection change quand beforerightclick a été activé ?
Voici mon code :
Public nbbb, decalv, decalh, th, tv As Integer
Sub grille()
nbbb = 15 'nb de bombes
decalh = 5 'début du tracé
decalv = 5
th = 8 'dimensions du tracé -1
tv = 12
Cells.Delete
With Range(Cells(decalh, decalv), Cells(decalh + th, decalv + tv))
.Borders.Weight = xlThin
.Borders(xlEdgeTop).Weight = xlMedium
.Borders(xlEdgeBottom).Weight = xlMedium
.Borders(xlEdgeLeft).Weight = xlMedium
.Borders(xlEdgeRight).Weight = xlMedium
.HorizontalAlignment = xlCenter
'.Font.Color = vbWhite 'blanc sur blanc
End With
For i = 1 To nbbb
'x = Int((th * Rnd) + 1) 'de 1 à nbbb
x = Int((th + 1) * Rnd)
y = Int((tv + 1) * Rnd)
If Cells(decalh + x, decalv + y) = "X" Then i = i - 1
If Cells(decalh + x, decalv + y) = "" Then Cells(decalh + x, decalv + y) = "X"
Next
For Each cell In Range(Cells(decalh, decalv), Cells(decalh + th, decalv + tv))
If cell.Value <> "X" Then cell.Value = 0
If cell.Offset(1, 1) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(0, 1) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(-1, 1) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(-1, 0) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(-1, -1) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(0, -1) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(1, -1) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(1, 0) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
Next
'.Font.Color = vbBlack
Cells(decalh, decalv + tv + 2) = "Nombre de coups joué"
Cells(decalh + 1, decalv + tv + 2 + 1) = "sur"
Cells(decalh + 1, decalv + tv + 2) = 0
Cells(decalh + 1, decalv + tv + 2 + 2) = Application.WorksheetFunction.CountA(Range(Cells(decalh, decalv), Cells(decalh + th, decalv + tv)))
'fin de construction de la grille
End Sub
Sub alea()
Dim nb, nblign, nbtir As Integer
Range("A1", "A1000").ClearContents
Range("j10", "FF10").ClearContents
nb = Cells(4, 5) '1 nb début tirage
nblign = Cells(4, 7) '100 nb fin tirage
nbtir = Cells(5, 7) '5 nb de tirage
i = nb
Do Until i > nblign
nb = Int((nblign * Rnd) + 1)
Do While IsEmpty(Cells(nb, 1))
Cells(nb, 1) = i
i = i + 1
If i = nbalign Then Exit Sub
nb = Int((nblign * Rnd) + 1)
Loop
Loop
Randomize
nblign = nblign - nbtir + 1
nb = Int((nblign * Rnd) + 1)
For i = 0 To nbtir - 1
Cells(10, 10 + i) = Cells(nb + i, 1)
Next
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Set KeyCells = Range(Cells(decalh, decalv), Cells(decalh + th, decalv + tv)) 'cette variable définit la zone sensible
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Cancel = True 'Annulation du clic droit
ActiveCell.Interior.Color = RGB(0, 0, 0)
'Cells(decalh + 1, decalv + tv + 2) = Cells(decalh + 1, decalv + tv + 2) + 1
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim couleur(8) As String
Set KeyCells = Range(Cells(decalh, decalv), Cells(decalh + th, decalv + tv)) 'cette variable définit la zone sensible
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
If ActiveCell.Interior.Color = RGB(0, 0, 0) Then Stop
couleur(0) = RGB(174, 248, 200): couleur(1) = RGB(148, 246, 183)
couleur(2) = RGB(93, 241, 146): couleur(3) = RGB(55, 237, 120)
couleur(4) = RGB(20, 230, 95): couleur(5) = RGB(16, 188, 77)
couleur(6) = RGB(13, 151, 62): couleur(7) = RGB(10, 120, 49)
couleur(8) = RGB(8, 88, 37)
a = ActiveCell.Value
If a <> "X" And a <> "" Then ActiveCell.Interior.Color = couleur(a)
If a = "X" Then
MsgBox "perdu"
Call grille
End If
Cells(decalh + 1, decalv + tv + 2) = Cells(decalh + 1, decalv + tv + 2) + 1
If a = 0 Then
' If cell.Offset(1, 1) = "0" Then cell.Offset(1, 1).Interior.Color = couleur(0)
' If cell.Offset(0, 1) = "0" Then cell.Offset(0, 1).Interior.Color = couleur(0)
' If cell.Offset(-1, 1) = "0" Then cell.Offset(-1, 1).Interior.Color = couleur(0)
' If cell.Offset(-1, 0) = "0" Then cell.Offset(-1, 0).Interior.Color = couleur(0)
' If cell.Offset(-1, -1) = "0" Then cell.Offset(-1, -1).Interior.Color = couleur(0)
' If cell.Offset(0, -1) = "0" Then cell.Offset(0, 1).Interior.Color = couleur(0)
' If cell.Offset(1, -1) = "0" Then cell.Offset(1, -1).Interior.Color = couleur(0)
' If cell.Offset(1, 0) = "0" Then cell.Offset(1, 0).Interior.Color = couleur(0)
End If
If Cells(decalh + 1, decalv + tv + 2) = Cells(decalh + 1, decalv + tv + 2 + 2) - nbbb Then MsgBox "bravo!!!"
End If
End SubJ'aurai aussi bien d'aider pour les "0" qui se découvre en fractal mais ca c'est une autre histoire :p
merci
Bonjour,
un simple test montre que l'événement Change se produit avant RightClic.
Il faut donc mémoriser que cet événement a eu lieu et le tester :
Public cellChange As Boolean
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If cellChange Then
' il y a eu SelectionChange
Stop
Else
' il n'y a pas eu de SelectionChange
Stop
End If
cellChange = False
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
cellChange = True
Stop
End Suberic
oui c'est ca, change se produit avant
comment faire en sorte qu'il ne se produise pas ou filtrer à l'intérieur que c'est un bouton de droite ?
Salut Yoyovento,
Salut Eriiic,
c'est bien ça le problème : un clic droit est avant tout... un clic !
La procédure 'Selection_Change' s'exécutera AVANT toute autre : il faut y penser quand on code !
Explique-nous ce que tu veux faire et nous trouverons peut-être une astuce.
A+
je veux noircir la case avec le clic doit donc :
je veux dire "perdu" quand on clique gauche et qu'il y a un X dans la case
mais je ne veux pas avoir "perdu" quand on clique droit et qu'il y a un X dans la case
Salut Yoyovento,
la réponse la plus facile est d'utiliser le Clic-droit dans un cas et le Double-clic dans l'autre, ainsi en supprimant 'Selection_Change', tu règles ton souci.
A+
Je suis d'accord avec toi curulis57 mais ca fait faire beaucoup de double clic alors :(
Sinon il faudrait alors toujours faire avec le gauche mais cliquer dans une autre case juste avant pour choisir la couleur noire...
Ca change un peu les règles mais simplifie la macro LOL
J'ai fait ce code du coup :
Public nbbb, decalv, decalh, th, tv, noireok As Integer
Sub grille()
nbbb = 15 'nb de bombes
decalh = 5 'début du tracé
decalv = 5
th = 8 'dimensions du tracé -1
tv = 12
Cells.Delete
With Range(Cells(decalh, decalv), Cells(decalh + th, decalv + tv))
.Borders.Weight = xlThin
.Borders(xlEdgeTop).Weight = xlMedium
.Borders(xlEdgeBottom).Weight = xlMedium
.Borders(xlEdgeLeft).Weight = xlMedium
.Borders(xlEdgeRight).Weight = xlMedium
.HorizontalAlignment = xlCenter
.Font.Color = vbWhite 'blanc sur blanc
End With
For i = 1 To nbbb
'x = Int((th * Rnd) + 1) 'de 1 à nbbb
x = Int((th + 1) * Rnd)
y = Int((tv + 1) * Rnd)
If Cells(decalh + x, decalv + y) = "X" Then i = i - 1
If Cells(decalh + x, decalv + y) = "" Then Cells(decalh + x, decalv + y) = "X"
Next
For Each cell In Range(Cells(decalh, decalv), Cells(decalh + th, decalv + tv))
If cell.Value <> "X" Then cell.Value = 0
If cell.Offset(1, 1) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(0, 1) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(-1, 1) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(-1, 0) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(-1, -1) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(0, -1) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(1, -1) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
If cell.Offset(1, 0) = "X" And cell.Value <> "X" Then cell.Value = cell.Value + 1
Next
'.Font.Color = vbBlack
Cells(decalh, decalv + tv + 2) = "Nombre de coups joué"
Range(Cells(decalh, decalv + tv + 2), Cells(decalh, decalv + tv + 8)).Merge
Cells(decalh + 1, decalv + tv + 2 + 1) = "sur"
Cells(decalh + 1, decalv + tv + 2) = 0
Cells(decalh + 1, decalv + tv + 2 + 2) = Application.WorksheetFunction.CountA(Range(Cells(decalh, decalv), Cells(decalh + th, decalv + tv)))
Columns(decalv + tv + 2 + 2).EntireColumn.AutoFit
Cells(decalh + 3, decalv + tv + 2).Interior.Color = RGB(0, 0, 0)
'fin de construction de la grille
End Sub
Sub alea()
Dim nb, nblign, nbtir As Integer
Range("A1", "A1000").ClearContents
Range("j10", "FF10").ClearContents
nb = Cells(4, 5) '1 nb début tirage
nblign = Cells(4, 7) '100 nb fin tirage
nbtir = Cells(5, 7) '5 nb de tirage
i = nb
Do Until i > nblign
nb = Int((nblign * Rnd) + 1)
Do While IsEmpty(Cells(nb, 1))
Cells(nb, 1) = i
i = i + 1
If i = nbalign Then Exit Sub
nb = Int((nblign * Rnd) + 1)
Loop
Loop
Randomize
nblign = nblign - nbtir + 1
nb = Int((nblign * Rnd) + 1)
For i = 0 To nbtir - 1
Cells(10, 10 + i) = Cells(nb + i, 1)
Next
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim couleur(8) As String
Set KeyCells1 = Range(Cells(decalh, decalv), Cells(decalh + th, decalv + tv)) 'cette variable définit la zone sensible
Set KeyCells2 = Cells(decalh + 3, decalv + tv + 2)
If Not Application.Intersect(KeyCells1, Range(Target.Address)) Is Nothing Then
couleur(0) = RGB(174, 248, 200): couleur(1) = RGB(148, 246, 183)
couleur(2) = RGB(93, 241, 146): couleur(3) = RGB(55, 237, 120)
couleur(4) = RGB(20, 230, 95): couleur(5) = RGB(16, 188, 77)
couleur(6) = RGB(13, 151, 62): couleur(7) = RGB(10, 120, 49)
couleur(8) = RGB(8, 88, 37)
a = ActiveCell.Value
If ActiveCell.Interior.Color = 16777215 Then Cells(decalh + 1, decalv + tv + 2) = Cells(decalh + 1, decalv + tv + 2) + 1
If a <> "X" And a <> "" And noireok = 0 Then ActiveCell.Interior.Color = couleur(a)
'stop
If a = "X" And noireok = 0 Then
ActiveCell.Font.Color = RGB(0, 0, 0)
MsgBox "perdu"
Call grille
End If
If noireok = 1 Then
ActiveCell.Interior.Color = RGB(0, 0, 0)
ActiveCell.Font.Color = RGB(0, 0, 0)
noireok = 0
End If
If a = 0 Then
' If cell.Offset(1, 1) = "0" Then cell.Offset(1, 1).Interior.Color = couleur(0)
' If cell.Offset(0, 1) = "0" Then cell.Offset(0, 1).Interior.Color = couleur(0)
' If cell.Offset(-1, 1) = "0" Then cell.Offset(-1, 1).Interior.Color = couleur(0)
' If cell.Offset(-1, 0) = "0" Then cell.Offset(-1, 0).Interior.Color = couleur(0)
' If cell.Offset(-1, -1) = "0" Then cell.Offset(-1, -1).Interior.Color = couleur(0)
' If cell.Offset(0, -1) = "0" Then cell.Offset(0, 1).Interior.Color = couleur(0)
' If cell.Offset(1, -1) = "0" Then cell.Offset(1, -1).Interior.Color = couleur(0)
' If cell.Offset(1, 0) = "0" Then cell.Offset(1, 0).Interior.Color = couleur(0)
End If
If Cells(decalh + 1, decalv + tv + 2) = Cells(decalh + 1, decalv + tv + 2 + 2) - nbbb Then
MsgBox "bravo!!!"
Range(Cells(decalh, decalv), Cells(decalh + th, decalv + tv)).Font.Color = vbBlack 'affiche les bombes
End If
End If
Columns(decalv + tv + 2).EntireColumn.AutoFit
On Error Resume Next
Set KeyCells2 = Cells(decalh + 3, decalv + tv + 2)
If Not Application.Intersect(KeyCells2, Range(Target.Address)) Is Nothing Then noireok = 1
End SubCa ne me déplait pas tant que ca LOL
Je pourrais même voir pour une autre couleur du coup (comme dans le jeu original)
Salut Yoyovento,
pas lu mais si tu pouvais envoyer ton fichier et si tu es d'accord, j'y jetterai un oeil pour y mettre ma patte...
A+
J'ai collé tout mon code au dessus
Si tu testais ma proposition et me disais ce que tu en penses ?
Désolé Éric mais j'ai pas compris 🙏
Bah, teste le code que j'ai mis dans mon post tout au début.
Il faut tout lire dans une réponse...
Désolé Eric mais j'avais lu ca, c'est pas une solution, c'est le problème je crois
Oui, bonjour aussi,
Heuuu, comment dire... Tu as vraiment testé ?
Même sans tester, en lisant le code tu vois qu'il y a un test dans DoubleClick qui permet de savoir s'il y a eu un Selection juste avant ou pas.
Ce n'était la question originale ?
J'ai mis des Stop pour que tu vois quel chemin était pris selon les cas.
eric
Bonsoir,
ensemble de procédures utilisées dans mon application "le chasseur de bombe" que j'ai repris ci dessous pour Magic-Draw où le clic gauche est utilisé pour faire tourner les couleurs dans un sens et le clic droit dans l'autre sens, le principe on instaure une temporisation sur le change afin de laisser le temps à VBA de gérer le clic droit : si pas de gestion alors clic gauche dans les deux cas on lance la procédure de coloriage :
Option Explicit
Dim Droite As Boolean
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, R) Is Nothing And En_Cours Then
Droite = True
Cancel = True
Call Coloriage(ActiveCell)
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If En_Cours Then
Droite = False
Application.OnTime 1, Me.CodeName & ".Action"
End If
End Sub
Sub Action()
' si le clic droit a été géré, alors on sort de l'action due au "SelectionChange"
If Droite Then Droite = False: Exit Sub
' s'il n'y a pas eu de gestion clic droit on exécute la gestion du clic gauche
Call Coloriage(ActiveCell)
End SubColoriage est la procédure de coloriage, Action remplace l'exécution "direct" du clic gauche...
@ bientôt
LouReeD
Le fichier "pas fini" pour l'exemple, le but est de cliquer sur les cellules du dessin de droite pour reconstituer l'image de gauche. Clic gauche la palette de couleur va dans un sens, clic droit elle va dans l'autre.
Que ce soit pour Magic-Draw ou le chasseur de bombe, après un clic gauche il faut dé sélectionner la cellule cliquée, sinon plus d'action car le clic gauche est géré par le sélection change !
Le fichier :
Attention ! il ne restera pas longtemps !
@ bientôt
LouReeD