Autres toutes versions tester le scrool avec la roulette sans passer par un hooking en addressof

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
la principal raison des crash excel quand on utilise le hooking de la souris pour avoir le mouse wheel(la roulette)
c'est que le looping avec le (CallnextHook)est asynchrone avec le captage du message de la souris
donc quand une erreur se produit(on va trop vite ou autre)
le looping lui continue parfois au moins une fois même en erreur
résultat comme on déplace le block type du message en mémoire ça crash

je vous propose de tester ceci
ici on va rester dans un do/loop vba classique et le message de la souris sera récupéré par un peekmessage
si il y a une erreur (du au message de la souris non conforme) normalement on a une erreur vba classique
et donc le do/loop est interrompu
donc pas de relance avec un message de la souris erroné donc pas de crash
Vous constaterez que j'augmente l'allocation de la mémoire aussi (64 bits double (longlong ou longPtr))(+2&)

d'autant plus que la dans cette démo je met tout dans le userform
ce qui n'est pas possible avec un code de hooking bien entendu
et ça peut avoir un avantage lorsque l'on veut distribuer un interface(userform) sans devoir l'accompagner de x modules

toujours pareil pour déterminer le rectangle je me sert de ma fonction perso du calendar que j'ai modifié pour ce besoins
donc testez et si ça fonctionne je ferais une ressource au propre

merci d'avance pour votre participation

j'en connais un qui vas ouvrir grand les yeux 🤣

Patrick
 

Pièces jointes

Solution
Bonjour @jurassic pork , @Dudu2 , @Nathe
j'ai mis le controlrelease en optionnel dans la démo (fonctionne aussi dans userform)
j'en ai profité pour mettre un multipage
et dans la page 1 du multipage j'ai mi un label violet
et c'est lui qui pilote le scroll de la page
comme ca on peut mettre un fond sur chaque page vu que ce control n'a pas de propertie backcolor
bien évidemment j'ai ajouté le textbox
dans cette démo donc on a le controlrelease optionnel
et le scroll piloté par un autre control
voila comme ça on est au même niveau que la V 3.0 avec iaccessible (All control working)

patrick
Bonjour @jurassic pork , @Dudu2 , @Nathe
j'ai mis le controlrelease en optionnel dans la démo (fonctionne aussi dans userform)
j'en ai profité pour mettre un multipage
et dans la page 1 du multipage j'ai mi un label violet
et c'est lui qui pilote le scroll de la page
comme ca on peut mettre un fond sur chaque page vu que ce control n'a pas de propertie backcolor
bien évidemment j'ai ajouté le textbox
dans cette démo donc on a le controlrelease optionnel
et le scroll piloté par un autre control
voila comme ça on est au même niveau que la V 3.0 avec iaccessible (All control working)

patrick
 

Pièces jointes

Re, votre rectification "Rectification ActiveX" vous pouvez la lancer à l'ouverture du classeur

VB:
Private Sub Workbook_Open()
    Dim oSheet As Worksheet
    Dim oShape As Shape, obj As OLEObject

    Set oSheet = ThisWorkbook.Worksheets("Feuil1")
    For Each oShape In oSheet.Shapes
        For Each obj In oSheet.OLEObjects
            If obj.Name = oShape.Name Then obj.Width = oShape.Width
            obj.Object.Font.Size = obj.Object.Font.Size
        Next
    Next
End Sub

Chez moi du coup, ça ne pose plus de soucis dès l'ouverture du classeur.
Nathe
 
ben il faut relancer le bouton c'est tout
le problème réside dans l’échange de fichier entres personnes qui n'ont pas la même config W/office
si le bouton ne règle pas le problème met toi en mode création et replace et resize les listbox c'est tout

Il faut suivre hein 😉

j'attends les retours de @jurassic pork

et c'est patricktoulon pas Mr patricktoulon 🤪
 
Re, votre rectification "Rectification ActiveX" vous pouvez la lancer à l'ouverture du classeur

VB:
Private Sub Workbook_Open()
    Dim oSheet As Worksheet
    Dim oShape As Shape, obj As OLEObject

    Set oSheet = ThisWorkbook.Worksheets("Feuil1")
    For Each oShape In oSheet.Shapes
        For Each obj In oSheet.OLEObjects
            If obj.Name = oShape.Name Then obj.Width = oShape.Width
            obj.Object.Font.Size = obj.Object.Font.Size
        Next
    Next
End Sub

Chez moi du coup, ça ne pose plus de soucis dès l'ouverture du classeur.
Nathe
C'est toujours un peu dangereux de lancer une macro à l'ouverture d'un classeur bien que celle-ci normalement ne va pas provoquer d'erreur. Et
puis normalement elle ne va servir qu'une fois quand on reçoit le fichier ou si on change sa configuration écran. Une fois qu'on a fait la correction et qu'on a enregistré le classeur plus la peine d'exécuter la macro.
 
C'est curieux, je n'ai pas reçu de message suite à vos posts !?

Ce système a quand même un gros défaut. C'est qu'il n'est pas évènementiel.
Quand on est dans une boucle de Scroll, rien ne peut se passer ailleurs. On ne l'a pas vu parce qu'on s'est concentré sur le Scroll.
Exemple: je scrolle un UserForm ou un Frame, impossible de traiter la saisie dans une TextBox du UserForm ou du Frame car on est dans la boucle de Scroll.

Le nouveau challenge, c'est d'essayer de le rendre pseudo-évènementiel.
Ou dans le pire des cas, au moins créer une fonction d'interruption ce qui n'est pas très compliqué.

Le Hook aurait-il encore un bel avenir ? Je ne peux pas le dire cas je n'ai traité que les ListBox, ComboBox e TextBox avec le Hook.
Il faudrait que j'essaie avec un Frame / MultiPage / UserForm.
 
Ça n'a rien à voir.
Tu peux modifier la TextBox, sélectionner un item de la ListBox ou de la ComboBox parce que c'est Excel qui le fait, ce n'est pas du code VBA.
Si on doit intervenir sur un choix de ListBox ou ComboBox en VBA, tant que le Scroll tourne on ne peut pas.
D'ailleurs je me demande même si les évènements Change et autres se déclenchent ou pas. Je ne pense pas.

Purée ! Tout ça pour ça !
 
En fait il semble que les évènements soient déclenchés bien qu'on soit dans la boucle de Scroll. En tous cas le Change.
Alors je ne comprends plus très bien ce qui se passe en VBA.
On a du code qui tourne pour le Scroll.
On a du code qui tourne déclenché par l'évènement.
 
je viens de faire le test sur listbox en effet la souris dessus empeche mon petit code de changer l'index par vba
mais bon quand on scroll on scroll
en tout cas tant que l'on peut
sélectionner dans un control list
modifier le text dans un textbox
je ne vois pas ou est le soucis
par contre effectivement avec ta version comme tu inclu le userform si ta souris est dans ce perimetre sur un control ou pas ça tourne toujours
c'est pour ça que j'ai dit hier il faut enlever le userform de l’équation chez moi quand la souris est dans l'userform tu peut lancer n'importe quel code en boucle modifiant les controls ca marche puisque le scroll est arrêté
je pourrais éventuellement ajouter un scrollStop qui serait lancer dans le vba modifiant les control et par consequent arrêtant le scroll
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

P
Réponses
1
Affichages
801
P
Retour