[VBA Excel]Glisser et pinceau
Bonjour,
Je souhaitais détecté l'action "glisser une cellule" dans mon projet excel, ce que j'ai fait en gérant les évènements 2 change puis1 selectionChange
Dans le premier évènement change, je regarde si la cellule d'origine est différente de la cellule de destination.
Si oui, il s'agit d'un glisser, et je fais ce que j'ai à faire (undo pour récupérer les anciennes valeurs, puis traitement).
Cela marche bien, sauf que récemment j'ai constaté que mon traitement ce déclenchait lorsque j'utilisais le pinceau (déclenche 1 change et 1 selectionChange).
Le premier change a aussi une cellule d'origine et une cellule de destination différente, donc il déclenche le traitement et je ne le veux pas.
Voici (simplifié), comment je procède:
Dans une feuille Excel, je mets ce code:
Code:
1 2 3 4 5 6 7 8 9 10 11
| Private Sub Worksheet_Change(ByVal Target As Range)
' Si l'origine et la destination sont différentes
If Target.Address <> prevCel.Address Then
MsgBox "Il y a un glissé"
' Traitement
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set prevCel = Target
End Sub |
Ce que je voudrais, ce serait un moyen de détecter si j'utilise le pinceau (variable récupérant le contenu du pinceau, si ça existe).
Ceci, me permetterai de garder mon code en rajoutant simplement une condition.
Sinon, je devrait tout modifier, et ce ne sera pas évident à cause du traitement.
Sinon une solution serait:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| Dim prevCel As Range
Dim intcountEvent As Integer
Dim bGlisserPeinture As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
' On compte les passsages dans change
intcountEvent = intcountEvent + 1
' Si l'origine et la destination sont différentes on indique un glisser où une peinture
If Target.Address <> prevCel.Address Then bGlisserPeinture = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set prevCel = Target
' Si peinture
If intcountEvent = 1 And bGlisserPeinture = True Then
MsgBox "il y a eu peinture"
ElseIf intcountEvent = 2 And bGlisserPeinture = True Then
MsgBox "il y a eu glisser"
End If
intcountEvent = 0
bGlisserPeinture = False
End Sub |
Mais le traitement que j'ai fait complique énormement la chose. Donc, s'il existe un moyen de détecter les peintures...