XL 2016 Activation molette souris dans ComboBox ?

Lorenzini

XLDnaute Occasionnel
Bonjour,

Quelqu'un saurait-il comment faire pour faire fonctionner la molette de la souris à l'ouverture d'un ComboBox ? ... ou plus précisément, m'expliquer (vu que je suis débutant en VBA) pourquoi il m'a surligné en rouge le bout de code que j'ai trouvé sur le web pour arriver à ces fins...
Erreur.jpg

Ce n'est pas la première fois que j'ai cette erreur et pour tout dire, il y'a même qq codes que j'ai purement et simplement laissé tombé jusque-là en me tournant vers d'autres approches "alternatives' et ~ équivalente...
C'est frustrant ; je ne sais pas quoi faire...
Merci d'avance à ceux/celles qui pourraient m'aider.
 

Pièces jointes

  • Controleur Pression Arterielle.xlsm
    186.5 KB · Affichages: 28
C

Compte Supprimé 979

Guest
Bonsoir Lorenzini,

Tu travailles avec une version 64bits d'office
Il faut donc mettre "PtrSafe" devant "Function"

Mais parfois, cela ne suffit pas, il faut alors mettre "LongPtr" aux déclarations "As Long"

Sinon, tu as ce sujet ;)

@+
 

eriiic

XLDnaute Barbatruc
Bonjour à tous,

de toute façon, vu qu'il n'y a pour ainsi dire aucun activex qui fonctionne en 64 bits, peu de chance que tu y arrives avec des contrôles Formulaires.
Si tu n'avais aucune raison impérieuse d'installer Office 64 bits (avoir windows en 64 bits n'est pas une raison valable), désinstalle-la pour installer la 32 bits.
eric
 
C

Compte Supprimé 979

Guest
Salut eriiic ;)

Si tu n'avais aucune raison impérieuse d'installer Office 64 bits (avoir windows en 64 bits n'est pas une raison valable), désinstalle-la pour installer la 32 bits
Le souci est souvent dans les boites (comme la mienne) ou ils t'obligent à avoir la version 64 bits
On finit par s'y faire et contourner les problèmes posés :p
 

laurent950

XLDnaute Barbatruc
Bonjour BrunoM45,
Je viens d'ouvrir votre fichier qui est vraiment super, j'ai une question.
Via la construction de l'Userform et les ComboBox ajouter, pour faire défiler la molette il faut juste ajouter ce Module (M_MouseWheelHook) et la connexion se fait directement ?
enfin depuis l'UserForm vers se Module il y a une connexion ?

Question 2 : Comment vous faite pour remplir les Combobox sans passez par une initialisation ? les valeurs sont écrite en dur dans l'Userform je crois que j'ai compris
 
Dernière édition:
C

Compte Supprimé 979

Guest
Bonsoir Laurent950

Bonjour BrunoM45,
Je viens d'ouvrir votre fichier qui est vraiment super
Merci ;-)
j'ai une question.
Via la construction de l'Userform et les ComboBox ajouter, pour faire défiler la molette il faut juste ajouter ce Module (M_MouseWheelHook) et la connexion se fait directement ?
Si les instructions figurant dans l'exemple sont bien mise dans l'USF, OUI

enfin depuis l'UserForm vers se Module il y a une connexion ?
Juste un appel de la procédure ;-)
 

laurent950

XLDnaute Barbatruc
Merci pour votre réponse Bruno,
ici c'est un appel de procédure :
* Private Sub ComboBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
* Button = Correspond à quoi ? ce Nombre et comment il est obtenu ?
* Shift = Correspond à quoi ? ce Nombre et comment il est obtenu ?
* X = Correspond à quoi ? Ce Nombre à virgule flottante et comment il est Obtenu ?
* Y = Correspond à quoi ? Ce Nombre à virgule flottante et comment il est Obtenu ?
* Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
* Cancel = Ces un Objet de l'userform qui renvois Vrai ou Faux = Mais dépend que quoi dans l'UserForm ?
* Private Sub ListBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
* Question idem ci dessus
* Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
* Question idem ci dessus

* Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
* Question idem ci dessus

ici Deux Variables qui renvois vers ce Module (M_MouseWheelHook) avec les appel a procédure demander en signification ci-dessus.

et donc qu'elle sont les fonctions des deux Fonction ci-dessous :
* UnHook_Mouse avec (ByVal Cancel As MSForms.ReturnBoolean)
* Hook_Mouse avec (ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Merci pour ce code complexe mais super interressant, et si je ne me trompe vous avez adapter a 32 Bits et 64 bits (Pour excel) dans le Module (M_MouseWheelHook)
 
C

Compte Supprimé 979

Guest
Oula

* Private Sub ComboBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
* Button = Correspond à quoi ? ce Nombre et comment il est obtenu ?
* Shift = Correspond à quoi ? ce Nombre et comment il est obtenu ?
* X = Correspond à quoi ? Ce Nombre à virgule flottante et comment il est Obtenu ?
* Y = Correspond à quoi ? Ce Nombre à virgule flottante et comment il est Obtenu ?
Il s'agit d'un évènement de la Combobox et ses valeurs retournées

* Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
* Cancel = Ces un Objet de l'userform qui renvois Vrai ou Faux = Mais dépend que quoi dans l'UserForm ?

Même chose pour les autres questions

et donc qu'elle sont les fonctions des deux Fonction ci-dessous :
* UnHook_Mouse avec (ByVal Cancel As MSForms.ReturnBoolean)
* Hook_Mouse avec (ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Hook, permet de capturer les évènements de la souris via les APIWindows
UnHook, désactive la capture d'évènements

Merci pour ce code complexe mais super interressant, et si je ne me trompe vous avez adapter a 32 Bits et 64 bits (Pour excel) dans le Module (M_MouseWheelHook)
Il y a les 2 versions ;-)
 

laurent950

XLDnaute Barbatruc
Merci Bruno,
C'est vraiment fort, je vous remercie pour ces précieuses explication.

Une question : qui concerne une variable Typé. Il semble qu'elle variable pt Typé soit emboîté dans une autres variable udtlParamStuct Typé ?

Type POINTAPI
X As Long ------------->> ' X est une variable Typé de pt As POINTAPI
Y As Long ------------->> ' Y est une variable Typé de pt As POINTAPI
End Type

Donc : X et Y sont des variables Typé (Mais Emboîtées) !
C'est a dire que :
X As Long ------------->> ' * udtlParamStuct.pt.X = (C'est pour une valeur Long)
Y As Long ------------->> ' * udtlParamStuct.pt.Y = (C'est pour une valeur Long)

Type MSLLHOOKSTRUCT 'Will Hold the lParam struct Data
pt As POINTAPI ------>>' Pt est une variable Typé de udtlParamStuct As MSLLHOOKSTRUCT
mouseData As Long ----->>' Pt est une variable Typé de udtlParamStuct As MSLLHOOKSTRUCT
flags As Long ------------>>' Pt est une variable Typé de udtlParamStuct As MSLLHOOKSTRUCT
time As Long ------------->>' Pt est une variable Typé de udtlParamStuct As MSLLHOOKSTRUCT
dwExtraInfo As Long ----->>' Pt est une variable Typé de udtlParamStuct As MSLLHOOKSTRUCT
End Type

Dim udtlParamStuct As MSLLHOOKSTRUCT

et donc : mouseData, flags , time , dwExtraInfo
C'est a dire des variable Typé (Mais non Emboîté)
* udtlParamStuct.mouseData = (C'est pour une valeur Long)
* udtlParamStuct.flags = (C'est pour une valeur Long)
* udtlParamStuct.time = (C'est pour une valeur Long)
* udtlParamStuct.dwExtraInfo = (C'est pour une valeur Long)

La question est la suivante : qu'elle est l’intérêt d’emboîté une variable Typé ?
* Une avec Dim pour : Dim udtlParamStuct As MSLLHOOKSTRUCT
* L'autres Sans (Public/Private/Dim) Pour : pt As POINTAPI (Mais emboîté)

NB pour moi : lien du fil en relation avec ce poste qui est un complément : (avec le lien ci-dessous)
Titre : Mouse Wheel Hook (faire défiler le contenu d'une combobox/listbox avec la roulette)
Auteur : BrunoM45 #Poste 1
Fichier : A Jours pour Excel en 32 bits ou 64 bits


Un Grand Merci à BrunoM45

Laurent950
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour
si ça vous intéresse voici le mien de module mollette souris

dans un module stansard
VB:
Option Explicit
#If VBA7 Then
    Private Declare PtrSafe Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Private Declare PtrSafe Function FindWindowEx Lib "USER32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
    Private Declare PtrSafe Function GetWindowLong Lib "USER32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
    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
    Private Declare PtrSafe Function SetWindowLong Lib "USER32" Alias "SetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr

#Else
    Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function FindWindowEx Lib "USER32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    Private Declare Function GetWindowLong Lib "USER32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) 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) 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
    Private Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

#End If



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)
        Debug.Print Timer, "Hook ON"
    End If
End Sub
Public Sub UnHookMouse()
' désactive le hook s'il existe
    If plHooking <> 0 Then
        UnhookWindowsHookEx plHooking
        plHooking = 0
        Set CtrlHooked = Nothing
        Debug.Print Timer, "Hook OFF"
    End If
End Sub

dans l'userform
exemple avec un listbox
VB:
Private Sub UserForm_Activate()
For i = 1 To 100
ListBox1.AddItem i
ComboBox1.AddItem i
Next
End Sub


Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Call HookMouse(ListBox1, eSHEET)
End Sub
Private Sub ListBox1_LostFocus()
    UnHookMouse
End Sub
 
Private Sub ListBox1_Enter()
      Call HookMouse(Me.ListBox1, eUSERFORM, Me.Name)
End Sub
Private Sub ListBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  UnHookMouse
End Sub

;)
 

patricktoulon

XLDnaute Barbatruc
re
hoh le pauvre Laurent il a rien compris ;) :D:rolleyes::D
x et y ne sont pas emboîtés

les variable "type" sont concue pour donner plusieurs valeur a une variable en gros on créée une structure
exemple
VB:
 private  type propert
 age as long
 adresse as string
 telelephone as string
 email as string
 end type



sub test
dim laurent as new propert
with laurent
.age=35
.adresse= "par la bas"
.telephone="06 03 05 42 06"
.email="laurentjypigepasunemiette@ bambou.fr"
end with
msgbox laurent.age
end sub

tu dois commencer a comprendre pourquoi je t'ai dis que ton usine a gaz que tu est en train de concevoir avec tes tableaux est inutile et pourquoi j'y mettrais pas les mains ;)
 

laurent950

XLDnaute Barbatruc
Bonjour Patricktoulon, BrunoM45.

* Patricktoulon : Je te remercie pour la réponse à ma question, et l'exemple de la conception de la variable Type en Poste#13.
Pour le Poste #14 il est excellent et Propre, la variable Type est en association
avec les fonctions. (J'ai compris que ce n'est pas emboîté) est qu'elle est conçue pour donner plusieurs valeurs à une variable.
Ps : Pour l'UserForm que j'ai commencé, je suis convaincu que le code que j'ai commencé à écrire, n'est pas des plus faciles à maintenir, et je comprends ton point de vue.

Aussi je te remercie Patricktoulon pour cette aide précieuse qui m'aide beaucoup sur des points qui me sont bloquants et donc j'essaie d’appréhender autrement suite à tes explications qui sont très claires et bien expliquées.

ps : le code (module mollette souris) que tu as joint est vraiment formidable.

ps : Merci aussi a BrunoM45 pour la création de son poste est les explications qu'il m'a aussi données en Poste #6 et Poste #10

Merci Patricktoulon
pour les explications en Poste #12 et Poste #13

Laurent950
 
Dernière édition:

Lorenzini

XLDnaute Occasionnel
Bonsoir Lorenzini,

Tu travailles avec une version 64bits d'office
Il faut donc mettre "PtrSafe" devant "Function"

Mais parfois, cela ne suffit pas, il faut alors mettre "LongPtr" aux déclarations "As Long"

Sinon, tu as ce sujet ;)

@+
Merci pour ces précieux conseils Bruno, je vais de suite tester çà !
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 104
dernier inscrit
JEMADA