Tuto : Gestion des MouseEvents au-dessus d'images
Hello, Hello,

Bon codage
Masterclass

1. MASTERCLASS : GESTION DU CLIC GAUCHE/DROIT SOURIS
2. OUTIL D'EXPORT TABLE POUR LE CALCUL TAILLES CELLULE ET GERER LES POS X;Y DE LA SOURIS
3. TUTO : ANIMER UN SPRITE AVEC UNE SPRITESHEET

VBA ne permet pas de base de capter les événements souris, mais Il est possible avec un contrôle Activex (entre autre) de capter les clics des boutons de la souris avec les événements : MouseMove ; MouseDown ; MouseUp ; Click ; DblClick.
* En suivant le lien DblClick, événement, vous verrez que ces événements agissent suivant un ordre (quand ceux-ci ne sont pas empêchés par des événements invalidant).
> Les événements Click et DblClick sont limités, leur fonction n'est que de capter le clic ou le double clic au-dessus du contrôleur, nous allons donc nous concentrer sur les autres événements qui de base gèrent cette info, ce qui simplifiera le codage.
Click, événement : https://msdn.microsoft.com/fr-fr/library/office/gg264479.aspx
Label.DblClick, événement : https://msdn.microsoft.com/fr-fr/library/office/ff845177.aspx
> Reste les événements MouseMove ; MouseDown ; MouseUp, ces événements ont la particularité d'avoir les mêmes paramètres, ceux-ci peuvent donc gérer les clics souris selon la nature des boutons et suivant leur principe d'événement.
Mais ici nous n'allons utiliser que l'événement MouseMove , cet événement est très puissant, en effet, on peut gérer à la fois la capture du mouvement de la souris, mais aussi les différents clic de la souris
MouseMove, Événement : https://msdn.microsoft.com/fr-fr/library/office/ff836610.aspx
MouseUp, Événement : https://msdn.microsoft.com/fr-fr/library/office/ff197657.aspx
MouseDown, Événement : https://msdn.microsoft.com/fr-fr/library/office/ff197358.aspx
Syntaxe de l'événement MouseMove : expression.MouseMove(Button, Shift, X, Y)
> Button = 0 => Aucun boutons de la souris appuyés
> Button = 1 => Bouton Gauche de la souris appuyé
> Button = 2 => Bouton Droit de la souris appuyé
> Button = 3 => Bouton Central de scrolling de la souris appuyé
Ce qui va permettre en utilisant un codage IF, de tester la valeur Button et de faire des actions spécifique, en fonction du clic gauche ou droit au dessus de notre "ensemble".
Exemple de procédure de gestion du clic gauche (entrer dans la cellule) et droit (montrer le menu contextuel) :
'-------------------------------------------------------------------------------------
'III. Gestion MouseMove au niveau du clic souris
'Button = 0 => Aucun boutons de la souris appuyés
'Button = 1 => Bouton Gauche de la souris appuyé
'Button = 2 => Bouton Droit de la souris appuyé
'Button = 3 => Bouton Central de la souris appuyé
'En l'état du codage proposé, utiliser l'événement clic ici, empêchera d'utliser les événéments DbleClick / Click / MouseDown
'Exemple code, avec codage gérant la variable 0 du bouton, sans gestion des OPTIONS clic souris
If Button <> 0 Then 'Si bouton souris différent à aucuns boutons souris appuyé alors
'-------------------------------------------------
'Procédure pour éviter le bug de désactivation du mode transparent du label créant un flash long masquant la carte
MAP.Visible = False 'désactiver l'affichage du label
Application.ScreenUpdating = False 'désactiver raffraichissement de l'écran, on reste sur la dernière vision de l'utilisateur OK
MAP.Visible = True 'rerendre label visible, réinitialise le mode transparent
Application.ScreenUpdating = True 'réaffichage ok pour l'utilisateur
'-------------------------------------------------
If Button = 1 Then 'Si bouton gauche de la souris appuyé
SendKeys "{F2}", False 'entrer dans la cellule, suivant version peut faire perdre verrNum
End If
'-------------------------------------------------
If Button = 2 Then 'si bouton droit de la souris appuyé
Application.CommandBars("Cell").ShowPopup 'Montrer le menu contextuel
End If
'-------------------------------------------------
End If
'-------------------------------------------------
Exemple de procédure complète de l'événement MouseMove, gérant à la fois le déplacement du curseur et de lancer une action spécifique suivant le clic gauche ou droit de la souris.
Suivant l'option choisie sur la feuille du classeur, le clic gauche ou droit de la souris donnera une action différente (soit 4 actions possibles) :
Clic gauche : Entrer dans la cellule Ou Afficher un message donnant l'emplacement de la souris
Clic droit : ouverture du menu contextuel Ou Afficher un message renvoyant la valeur à l'intérieur de la cellule
'Macro captant le mouvement et gérant les clics de la souris au dessus de la Map
'Explications que pour le point III. afin d'alléger le code
Private Sub MAP_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'-------------------------------------------------------------------------------------
Dim adress_curs, ancien_adress_curs As String
'-------------------------------------------------------------------------------------
On Error Resume Next
'-------------------------------------------------------------------------------------
'I. Auto-sélection cellule suivant position curseur souris
ThisWorkbook.Worksheets("Tab Calc Pos Souris").Range("POSX").Value = X
ThisWorkbook.Worksheets("Tab Calc Pos Souris").Range("POSY").Value = Y
adress_curs = ThisWorkbook.Worksheets("Tab Calc Pos Souris").Range("ADRESS_CURSEUR").Value
ThisWorkbook.ActiveSheet.Range(adress_curs).Select
'-------------------------------------------------------------------------------------
'II. Colorisation cellule sélectionnée
If ThisWorkbook.ActiveSheet.Range(adress_curs).Interior.ColorIndex = 2 Then
If COLORCELLULE.Value = True Then ThisWorkbook.ActiveSheet.Range(adress_curs).Interior.ColorIndex = 42
ancien_adress_curs = ThisWorkbook.Worksheets("Tab Calc Pos Souris").Range("ANCIEN_ADRESS_CURSEUR").Value
ThisWorkbook.ActiveSheet.Range(ancien_adress_curs).Interior.ColorIndex = 2
ThisWorkbook.Worksheets("Tab Calc Pos Souris").Range("ANCIEN_ADRESS_CURSEUR").Value = adress_curs
End If
'-------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------
'III. Gestion MouseMove au niveau du clic souris
'Button = 0 => Aucun boutons de la souris appuyés
'Button = 1 => Bouton Gauche de la souris appuyé
'Button = 2 => Bouton Droit de la souris appuyé
'Button = 3 => Bouton Central de la souris appuyé
'En l'état du codage proposé, utiliser l'événement clic ici, empêchera d'utliser les événéments DbleClick / Click / MouseDown
'Exemple code, avec codage gérant la variable 0 du bouton, avec gestion des OPTIONS clic souris
If Button <> 0 Then 'Si bouton souris différent à aucuns boutons souris appuyé alors
'-------------------------------------------------
'Procédure pour éviter le bug de désactivation du mode transparent du label créant un flash long masquant la carte
MAP.Visible = False 'désactiver l'affichage du label
Application.ScreenUpdating = False 'désactiver raffraichissement de l'écran, on reste sur la dernière vision de l'utilisateur OK
MAP.Visible = True 'rerendre label visible, réinitialise le mode transparent
Application.ScreenUpdating = True 'réaffichage ok pour l'utilisateur
'-------------------------------------------------
If Button = 1 Then 'Si bouton gauche de la souris appuyé et suivant option sélectionné d'événement clic
If OPTION_BOUTGAUCHE.Value = False Then MsgBox "Le curseur se trouve au-dessus de la cellule : " & adress_curs, vbInformation, "Evénement clic gauche" 'Afficher un message avec l'adresse de la cellule
If OPTION_BOUTGAUCHE.Value = True Then SendKeys "{F2}", False 'entrer dans la cellule, suivant version peut faire perdre verrNum
End If
'-------------------------------------------------
If Button = 2 Then 'si bouton droit de la souris appuyé et suivant option sélectionné d'événement clic
If OPTION_BOUTDROIT.Value = False Then Application.CommandBars("Cell").ShowPopup 'Montrer le menu contextuel
If OPTION_BOUTDROIT.Value = True Then MsgBox "La cellule contient le texte suivant : " & ThisWorkbook.ActiveSheet.Range(adress_curs).Value, vbInformation, "Evénement clic droit" 'Afficher un message avec le contenu de la cellule
End If
'-------------------------------------------------
End If
'-------------------------------------------------
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'Exemple code, avec codage gérant la variable 0 du bouton, sans gestion des OPTIONS clic souris
'If Button <> 0 Then 'Si bouton souris différent à aucuns boutons souris appuyé alors
'-------------------------------------------------
'Procédure pour éviter le bug de désactivation du mode transparent du label créant un flash long masquant la carte
'MAP.Visible = False 'désactiver l'affichage du label
'Application.ScreenUpdating = False 'désactiver raffraichissement de l'écran, on reste sur la dernière vision de l'utilisateur OK
'MAP.Visible = True 'rerendre label visible, réinitialise le mode transparent
'Application.ScreenUpdating = True 'réaffichage ok pour l'utilisateur
'-------------------------------------------------
'If Button = 1 Then 'Si bouton gauche de la souris appuyé
'SendKeys "{F2}", False 'entrer dans la cellule, suivant version peut faire perdre verrNum
'End If
'-------------------------------------------------
'If Button = 2 Then 'si bouton droit de la souris appuyé
'Application.CommandBars("Cell").ShowPopup 'Montrer le menu contextuel
'End If
'-------------------------------------------------
'End If
'-------------------------------------------------
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'Exemple code, avec codage sans variable 0 du bouton, sans gestion des OPTIONS clic souris
'If Button = 1 Or Button = 2 Then 'Si bouton souris égal boutons souris gauche ou droit appuyé alors
'-------------------------------------------------
'Procédure pour éviter le bug de désactivation du mode transparent du label créant un flash long masquant la carte
'MAP.Visible = False 'désactiver l'affichage du label
'Application.ScreenUpdating = False 'désactiver raffraichissement de l'écran, on reste sur la dernière vision de l'utilisateur OK
'MAP.Visible = True 'rerendre label visible, réinitialise le mode transparent
'Application.ScreenUpdating = True 'réaffichage ok pour l'utilisateur
'-------------------------------------------------
'If Button = 1 Then SendKeys "{F2}", False 'entrer dans la cellule, suivant version peut faire perdre verrNum
'-------------------------------------------------
'If Button = 2 Then Application.CommandBars("Cell").ShowPopup 'Montrer le menu contextuel 'si bouton droit de la souris appuyé
'-------------------------------------------------
'End If
'-------------------------------------------------
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
End Sub
Partage d'un tuto dans le thème du pingouin et de la programmation de jeu, sur une méthode pour animer un sprite pingouin à l'aide d'une feuille à sprite ici : https://www.excel-pratique.com/fr/telechargements/doc-vba/animer-sprite-vba-excel-no330.php
Avec vous pouvez reproduire une animation de mouvement et extrapoler la méthode pour faire d'autres types d'animations.