XL 2010 Molette souris et ComboBox

Magic_Doctor

XLDnaute Barbatruc
D'aucuns prétendront qu'il n'est pas possible d'utiliser la molette de la souris avec un ComboBox ou un ListBox. FAUX !
Pour ce faire, il faut avoir recours à des APIs. C'est sur ce même forum, voilà un moment déjà, que l'on m'avait communiqué cette astuce.
Ça marche très bien pour Excel 32 Bytes ; en revanche je n'en ai pas la moindre idée pour Excel 64 Bytes.
Ci-joint 2 fichiers : l'un pour Excel 32 Bytes, l'autre pour Excel 64 Bytes et pour lequel j'ai essayé de retranscrire les APIs pour le 32 Bytes en APIs pour le 64 Bytes.
Pour ceux qui sont en 64 Bytes, dites-moi si ça marche.
Merci d'avance.
 

Pièces jointes

  • Molette (64).xlsm
    34 KB · Affichages: 21
  • Molette (32).xlsm
    38.8 KB · Affichages: 8

Magic_Doctor

XLDnaute Barbatruc
Bonjour à tous,

J'ai bien regardé la solution de BrunoM45. Lors du défilement des items d'un ComboBox de l'UF, si lon sort du ComboBox, le défilement cesse.
Idem pour la solution de patricktoulon qui a néanmoins l'avantage d'être la plus succincte de toutes.

J'ai retrouvé le fil intial concernant ce sujet. La solution était apportée par le regretté Thierry Pourtier alias "Ti". Avec sa solution, si l'on sort du ComboBox (début de Parkinson, par exemple) et que l'on continue à actionner la molette de la souris, les items continuent de défiler.
Les fonctions (APIs) qu'utilisent BrunoM45 et patricktoulon sont quasiment les mêmes que celles de Ti. En les regardant de plus près, je me suis rendu compte que dans ma tentative de transcription –32 Bytes vers 64 Bytes–, j'aurais dû remplacer "Long" par "LongPtr". J'ai corrigé l'erreur. Dites-moi si maintenent ça marche.
Merci d'avance.

J'en profite pour poser une question. patricktoulon écrit :
VB:
#If VBA7 Then
    Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As LongPtr)
    Private Declare PtrSafe Function SetWindowsHookEx Lib "USER32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As Long) As LongPtr
    Private Declare PtrSafe Function CallNextHookEx Lib "USER32" (ByVal hHook As LongPtr, ByVal nCode As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
    Private Declare PtrSafe Function UnhookWindowsHookEx Lib "USER32" (ByVal hHook As LongPtr) As Long

#Else
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
    Private Declare Function SetWindowsHookEx Lib "USER32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Private Declare Function CallNextHookEx Lib "USER32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function UnhookWindowsHookEx Lib "USER32" (ByVal hHook As Long) As Long
#End If
Pourquoi précéder "If", "Else" & "End If" par # ?
 

Pièces jointes

  • Molette2 (64).xlsm
    34.1 KB · Affichages: 6
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour ça marche dans l'userform mais pas pour la combo sur feuille
quand tu hook pour la combo c'est la scroll de la feuille que tu modifie avec la mollette
un seul bémol pour ton userform c'est que tu est obligé de sélectionner un item pour enclencher la mollette
dans mon exemple que j'ai donné on a pas besoins de sélectionner un item pour que la mollette soit active

et je vais revérifier mais je crois que tu ne stop pas le hook quand tu sort du control
 

patricktoulon

XLDnaute Barbatruc
re
j'ai changé l'event déclencheur du hooking dans ton userform tu n'est plus obligé de sélectionner pour avoir la mollette (maintenant c'est comme dans le mien )
et j'ai ajouté au move dans le userform un unhook
autrement dit la mollette est déclenché uniquement au move dans les controls concernés et stopé quand la souris sort du control
VB:
Option Explicit



Private Sub UserForm_Initialize()
    Dim i As Long

    Me.ComboBox1.Clear
    Me.ListBox1.Clear

    For i = 123 To 163
        Me.ComboBox1.AddItem i
        Me.ListBox1.AddItem i
    Next i
   
    Me.ComboBox1.ListIndex = 2
   
    'Me.cmdQuit.SetFocus

End Sub

Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 If plHooking = 0 Then Call HookMouse(Me.ComboBox1, eUSERFORM, Me.Name)
End Sub

Private Sub ComboBox1_Click()
    Me.cmdQuit.SetFocus
    UnHookMouse
End Sub

Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  If plHooking = 0 Then Call HookMouse(Me.ListBox1, eUSERFORM, Me.Name)
End Sub

Private Sub ListBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    UnHookMouse
End Sub

Private Sub cmdQuit_Click()
    Feuil1.Range("A1").Activate
    Unload Me
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If plHooking <> 0 Then UnHookMouse ' pour etre sur de stoper le hook quand on est pas dans la périférie des controls hooké
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    UnHookMouse
End Sub
 

Discussions similaires