utiliser la souris

Micheldu42

XLDnaute Nouveau
Bonjour
je voudrais savoir si il n'y a pas quelqu'un qui a une macro pour utiliser la sourit dans une combobox dans une UserForm.
J'ai plusieurs combobox avec de grande liste pour un formulaire d'ajout de données j'aimerais pouvoir défiler certaine combobox par la souris.
J'ai fais un tas de recherche mais en vain .j'ai trouver plein de choses mais rien ne fonctionne.
Ou alors je n'arrive pas à adapter vu que je suis novice en vba.
Je joint mon fichier pour que vous voyer ce que j'aimerais.
Merci.
 

Pièces jointes

  • Suivi conducteurs Eco-conduite + FCO+CQC+Permis.xlsm
    39.3 KB · Affichages: 33

PMO2

XLDnaute Accro
Bonjour,
C'est la roulette de la souris (mouse wheel) que vous voulez utiliser pour scroller les ComboBoxes ?
Si c'est bien cela, une piste avec votre classeur corrigé en pièce jointe.
Les ajouts sont signalés dans le code du UserForm par des '///
VB:
'/// ajout pmo ///
      '######################################
      '### Evénement Enter des ComboBoxes ###
      '######################################
Private Sub ComboBox1_Enter()
Call HookMouse(Me.ActiveControl, eUSERFORM, Me.Caption)
End Sub
Private Sub ComboBox2_Enter()
Call HookMouse(Me.ActiveControl, eUSERFORM, Me.Caption)
End Sub
Private Sub ComboBox3_Enter()
Call HookMouse(Me.ActiveControl, eUSERFORM, Me.Caption)
End Sub
Private Sub ComboBox4_Enter()
Call HookMouse(Me.ActiveControl, eUSERFORM, Me.Caption)
End Sub
Private Sub ComboBox5_Enter()
Call HookMouse(Me.ActiveControl, eUSERFORM, Me.Caption)
End Sub
Private Sub ComboBox6_Enter()
Call HookMouse(Me.ActiveControl, eUSERFORM, Me.Caption)
End Sub
Private Sub ComboBox7_Enter()
Call HookMouse(Me.ActiveControl, eUSERFORM, Me.Caption)
End Sub
      '#####################################
      '### Evénement Exit des ComboBoxes ###
      '#####################################
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call UnHookMouse
End Sub
Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call UnHookMouse
End Sub
Private Sub ComboBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call UnHookMouse
End Sub
Private Sub ComboBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call UnHookMouse
End Sub
Private Sub ComboBox5_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call UnHookMouse
End Sub
Private Sub ComboBox6_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call UnHookMouse
End Sub
Private Sub ComboBox7_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call UnHookMouse
End Sub
'/// Fin ajout pmo ///

D'autre part le module modHooKWheelMouse a été rempli par le code suivant
VB:
'------------------------------------------------------------------------------------------------------------
' Source    : Philippe734 http://www.vbfrance.com//code.aspx?ID=54334
' Module    : modHookWheelMouse
' Date      : 27/05/2012
' But       : Permet d'utiliser la molette de la souris avec ComboBox ou ListBox dans une feuille ou UserForm
'
' Prise en charge de la molette de la souris pour ComboBox et ListBox d'une feuille excel ou d'une UserForm.
' Un fichier à ajouter dans vos documents excel pour utiliser la molette. On peut trouver facilement un code
' source pour utiliser la molette de la souris avec ComboBox ou ListeBox dans une UserForm. Mais j'ai eu des
' difficultés pour trouver un code source afin d'utiliser la molette avec ces objets insérés dans une feuille
' excel. Donc, rien d'extraordinaire, la méthode est basée sur un hook classic. Sauf que le handle hooké a
' justement été l'élément que j'ai galéré à identifier afin que ces deux objets puissent utiliser la molette.
' Le code du module n'est pas de moi. Je l'ai un peu modifié pour le rendre facilement réutilisable.
'------------------------------------------------------------------------------------------------------------

Option Explicit

Private Declare Function FindWindow& Lib "user32" Alias "FindWindowA" ( _
  ByVal lpClassName As String, ByVal lpWindowName As String)
Private Declare Function FindWindowEx& Lib "user32" Alias "FindWindowExA" ( _
  ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String)
Private Declare Function GetWindowLong& Lib "user32" Alias "GetWindowLongA" ( _
  ByVal hWnd As Long, ByVal nIndex As Long)
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)
Private Declare Function CallNextHookEx& Lib "user32" ( _
  ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any)
Private Declare Function UnhookWindowsHookEx& Lib "user32" ( _
  ByVal hHook As Long)

Public Enum OWNER
  eSHEET = 1
  eUSERFORM = 2
End Enum

Private Type POINTAPI
  X As Long
  Y As Long
End Type

Private Type MSLLHOOKSTRUCT
  pt As POINTAPI
  mouseData As Long
  flags As Long
  time As Long
  dwExtraInfo As Long
End Type

Private Const HC_ACTION = 0
Private Const WH_MOUSE_LL = 14
Private Const WM_MOUSEWHEEL = &H20A
Private Const GWL_HINSTANCE = (-6)

Private udtlParamStuct As MSLLHOOKSTRUCT

' permet de savoir si le hook est activé ou pas
Public plHooking As Long

' sera associé à votre ComboBox/ListBox
Public CtrlHooked As Object
'

Private Function GetHookStruct(ByVal lParam As Long) As MSLLHOOKSTRUCT
CopyMemory VarPtr(udtlParamStuct), lParam, LenB(udtlParamStuct)
GetHookStruct = udtlParamStuct
End Function

Private Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'en cas de mouvement très rapide,
'évitons les crash en désactivant les erreurs
On Error Resume Next
If (nCode = HC_ACTION) Then
  If wParam = WM_MOUSEWHEEL Then
    LowLevelMouseProc = True
    With CtrlHooked
      ' déplace l'ascenseur en fonction de la molette
      ' l'info est stockée dans lParam
      If GetHookStruct(lParam).mouseData > 0 Then
          .TopIndex = .TopIndex - 3
      Else
          .TopIndex = .TopIndex + 3
      End If
    End With
  End If
  Exit Function
End If
LowLevelMouseProc = CallNextHookEx(0&, nCode, wParam, ByVal lParam)
On Error GoTo 0
End Function

Public Sub HookMouse(ByVal ControlToScroll As Object, ByVal SheetOrForm As OWNER, Optional ByVal FormName As String)
Dim hWnd As Long
Dim hWnd_App As Long
Dim hWnd_Desk As Long
Dim hWnd_Sheet As Long
Dim hWnd_UserForm As Long
Const VBA_EXCEL_CLASSNAME = "XLMAIN"
Const VBA_EXCELSHEET_CLASSNAME = "EXCEL7"
Const VBA_EXCELWORKBOOK_CLASSNAME = "XLDESK"
Const VBA_USERFORM_CLASSNAME = "ThunderDFrame"
'---
' active le hook s'il n'avait pas déjà été activé
If plHooking < 1 Then
  ' retourne l'handle d'excel
  hWnd_App = FindWindow(VBA_EXCEL_CLASSNAME, vbNullString)
  Select Case SheetOrForm
    Case eSHEET
      'trouve son fils
      hWnd_Desk = FindWindowEx(hWnd_App, 0&, VBA_EXCELWORKBOOK_CLASSNAME, vbNullString)
      'trouve celui de la feuille
      hWnd_Sheet = FindWindowEx(hWnd_Desk, 0&, VBA_EXCELSHEET_CLASSNAME, vbNullString)
      hWnd = hWnd_Sheet
    Case eUSERFORM
      'trouve la UserForm
      hWnd_UserForm = FindWindowEx(hWnd_App, 0&, VBA_USERFORM_CLASSNAME, FormName)
      If hWnd_UserForm = 0 Then
          hWnd_UserForm = FindWindow(VBA_USERFORM_CLASSNAME, FormName)
      End If
      hWnd = hWnd_UserForm
  End Select
  Set CtrlHooked = ControlToScroll
  ' il n'y a pas de hInstance d'application, alors on utilise GetWindowLong pour obtenir l'hInstance
  plHooking = SetWindowsHookEx(WH_MOUSE_LL, AddressOf LowLevelMouseProc, GetWindowLong(hWnd, GWL_HINSTANCE), 0)
End If
End Sub

Public Sub UnHookMouse(Optional dummy As Byte)
' désactive le hook s'il existe
If plHooking <> 0 Then
  UnhookWindowsHookEx plHooking
  plHooking = 0
  Set CtrlHooked = Nothing
End If
End Sub
 

Pièces jointes

  • Suivi conducteurs Eco-conduite + FCO+CQC+Permis_pmo.xlsm
    51.5 KB · Affichages: 83

JM27

XLDnaute Barbatruc
Bonjour
@pmo
Très bien ton petit programme pour déroulant.
j'aurais rajouté un petit truc en plus ( mais ce n'est qu'un détail)

Private Sub ComboBox1_Enter()
Me.ComboBox1.dropDown
Call HookMouse(Me.ActiveControl, eUSERFORM, Me.Caption)
End Sub

Attention toutefois si ton déroulant se trouve dans un cadre(frame) cela ne fonctionne pas : pourquoi ???? (testé sur une de mes applis, il m'a fallu chercher pendant 2 heures pourquoi cela ne fonctionnait pas)
 
Dernière édition:

JM27

XLDnaute Barbatruc
Salut
PMO
j'ai un peu cherché mais j'ai pas trouvé, ( je pense que c'est au passage de la variable : eUSERFORM)
éventuellement je peux créer un fichier exemple.
Si tu peux regarder , mais c'est pas très important ni urgent ( j'avais supprimé la frame)
En plus j'envisage d'intégrer aussi une recherche intuitive dans ces combo , mais il me manque le courage (déja réalisé dans un fichier : https://www.excel-downloads.com/threads/problème-de-séléction-du-choix-dans-saisie-semi-automatique.20009333/page-2#post-20069378
merci
 

Pièces jointes

  • Exemple.xlsm
    82.4 KB · Affichages: 40
Dernière édition:

PMO2

XLDnaute Accro
Salut JM27,
J'ai fait une autre approche.
Le problème étant d'arriver à définir quel est le Control actif au sein d'une Frame, j'ai fabriqué un Timer Window avec les APIs qui lance une procédure récurrente (GetActiveControl) et qui fournit le contrôle actif à la procédure de Hook de roulette souris.
Tu trouveras :
1) des ajouts/modifs signalés par des '/// dans la fenêtre de code du UserForm
2) un nouveau module modGetActiveControlPMO

Fais de nombreux essais pour voir si tu ne rencontres pas des exceptions (problèmes Windows) et tiens moi au courant.
 

Pièces jointes

  • Exemple_pmo.xlsm
    102.8 KB · Affichages: 37

PMO2

XLDnaute Accro
Je sais ! les APIs c'est très très rébarbatif et incompréhensible. Mais quand on arrive à les utiliser cela donne des perspectives très étendues et un univers grandiose s'ouvre.
Essaie de faire tourner le programme pour vérifier s'il fonctionne.
 

PMO2

XLDnaute Accro
Salut JM27,
J'ai de nouveau regardé ton classeur exemple et j'ai compris ce qui cloche. C'est une bonne nouvelle car cela va te dispenser du Timer par les APIs.
Il faut fournir au 1er paramètre de la fonction HookMouse l'objet lui-même et NON PAS Me.ActiveControl
VB:
Private Sub ComboNomUtilisateur_Enter()
     Me.ComboNomUtilisateur.DropDown
     Call HookMouse(ComboNomUtilisateur, eUSERFORM, Me.Caption)
End Sub
 

Pièces jointes

  • Exemple_pmo sans APIs Timer.xlsm
    98.6 KB · Affichages: 55

Discussions similaires

Statistiques des forums

Discussions
314 180
Messages
2 106 906
Membres
109 726
dernier inscrit
Marie.dpt