Evenement Scrollbar dans un ActiveX

Modeste geedee

XLDnaute Barbatruc
Bonjour, une fois n'est pas coutume, j'ai besoin d'aide...:rolleyes:
afin de synchroniser 2 listes parallèles(couleur/texte), je cherche à détecter ou bien simuler un évènement sur une scrollbar de textbox ou combobox
la synchro (couleurs) s'effectue en décalé par événement mousemove sur la liste mais pas lors du déplacement du curseur(scrollbar)

- j'ai bien tenté une scrollbar contigüe mais je n'arrive pas à la superposer afin de masquer celle existante qui reste toujours en premier plan
en pièce jointe mise en situation succincte de la problématique (pour une mise en oeuvre beaucoup plus complexe)...
merci à vos lumières...;)

upload_2017-11-30_0-47-22.png

upload_2017-11-30_0-50-37.png
 

Pièces jointes

  • scrollbar.xlsm
    24.7 KB · Affichages: 34

Staple1600

XLDnaute Barbatruc
Bonjour Modeste geedee

J'aimerais bien pouvoir te dépanner comme tu as pu le faire dans certains de mes posts mais je maîtrise mal les modules de classe (car je suppute que c'est une voie à explorer)

Sinon j'aurais une suggestion.
Si tu mettais directement dans les labels colorés en caption ColorIndexN, tu n'aurais besoin que d'un seul scrollbar, non ?
Ou alors mettre dans la propriété ControlTipText des labels le ColorIndexN

Qu'en penses-tu?
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Sinon j'aurais une suggestion.
Si tu mettais directement dans les labels colorés en caption ColorIndexN, tu n'aurais besoin que d'un seul scrollbar, non ?
Ou alors mettre dans la propriété ControlTipText des labels le ColorIndexN
Qu'en penses-tu?
;) plutôt qu'un module de classe j'aurai voulu mettre "simplement" ma scrollbar au premier plan pour cacher celle de la ListBox.
je m'en suis sorti pour l'instant en mimant une ListBox au prix de "simplement" 2 procs événementielles par item visible ...
:cool:
 

Pièces jointes

  • scrollbar.xlsm
    24.7 KB · Affichages: 28

Si...

XLDnaute Barbatruc
Bon_jour

Un "truc" pour cacher la barre de défilement : placer le contrôle dans un cadre (Frame) moins large. Encore faut-il tout synchroniser (retour 1).

On peut toujours se déplacer dans la liste : le bouton gauche reste appuyé pendant le déplacement de la souris pour éviter un contrôle ScrollBar (retour 2).

Dans le dernier fichier, il n'y a plus de contrôle ListBox (mais revoir les couleurs de la police).
 

Pièces jointes

  • Copie de scrollbar-1.xlsm
    22.3 KB · Affichages: 26
  • Copie de scrollbar-2.xlsm
    22.7 KB · Affichages: 20
  • ScrollbarFond(UsF).xlsm
    22.4 KB · Affichages: 21
  • ScrollbarFond2(UsF).xlsm
    20.9 KB · Affichages: 24

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Dans le dernier fichier, il n'y a plus de contrôle ListBox (mais revoir les couleurs de la police).
un grand merci pour l'intérêt porté à mes élucubrations...;)
pour tes 2 premieres propositions quelques problèmes de synchro...:(
pour la dernière proposition, c'est un peu ce dont vers quoi je me suis orienté, mais comme expliqué précédemment si l'on veux plusieurs infos par item il faut multiplier les procs événementielles...

j'en suis rendu là :rolleyes: :
il manque encore le surlignage de l'item sélectionné
upload_2017-12-4_22-1-28.png
 

Pièces jointes

  • scrollbar.xlsm
    31.9 KB · Affichages: 44
Dernière édition:

Si...

XLDnaute Barbatruc
Re
pour la dernière proposition, c'est un peu ce dont vers quoi je me suis orienté, mais comme expliqué précédemment si l'on veux plusieurs infos par item il faut multiplier les procs événementielles...
Regarde la pièce jointe 1001918

Pour ce dernier cas, je pensais que Staple (curieux de tout ;)) allez te proposer son Module de classe comme, par exemple, celui du fichier joint; mais tu voulais rester dans la "simplicité"o_O...

Nota : la barre de défilement ne sert, ici, qu'à défiler. Ta photo n'est pas tirée de ce classeur donc je n'ai rajouté qu'un contrôle.
 

Pièces jointes

  • Scrollbar&Moduledeclasse.xlsm
    23.2 KB · Affichages: 34

Dranreb

XLDnaute Barbatruc
Bonsoir.
Un truc qui a l'air de marcher pas mal :
VB:
Option Explicit
Private Fermer As Boolean, TopIdx As Integer

Private Sub UserForm_Activate()
Dim I As Integer
TopIdx = -1
Do
   If ListBox1.TopIndex <> TopIdx Then
      TopIdx = ListBox1.TopIndex
      For I = 1 To 10
         Me("Label" & I).BackColor = ThisWorkbook.Colors(TopIdx + I)
         Next I
      End If
   DoEvents
   Loop Until Fermer
Unload Me
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then Fermer = True: Cancel = True
End Sub
Remarque: le DoEvents est indispensable pour que le reste de la programmation (tous évènements) puisse fonctionner.

Edit: Plus besoin de ScrollBar, évidemment, puisque tout changement du TopIndex de la ListBox est détecté.
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Bonjour Bernard,
les vicissitudes de la vie aussi bien familiales que médicales ... ;o(
font que consultant régulièrement le forum, je ne suis pas toujours en possession de mon propre PC et des alertes attachées
et encore moins de la disposition d'Excel...
je n'ai pu essayé d'adapter ta proposition que tard hier soir...
- visuellement cela correspond tout à fait à ce que je cherchais et t'en remercie
- cependant ... devant s'intégrer dans un process plus complexe la boucle dont on ne sort que par un UNLOAD ne me convient pas.
@plus
 

Dranreb

XLDnaute Barbatruc
Bonjour.
On peut en sortir aussi par un Me.Hide, pas de problème.
On peut définir un Boolean Masquer pour tester s'il faut sortir par Unload Me ou par Me.Hide et le mettre à True dès qu'on veut masquer. Terminer la boucle par Loop Until Masquer Or Fermer puis derrière faire If Fermer Then Unload.Me Else Me.Hide
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
On n'a même pas besoin de variable Masquer. Pour que ce soit le plus transparent possible pour le reste de la programmation on peut faire comme ça :
VB:
Option Explicit
Private FermetureDemandée As Boolean, TopIdx As Integer

Private Sub UserForm_Activate()
Dim I As Integer
TopIdx = -1
Do While Me.Visible
   If ListBox1.TopIndex <> TopIdx Then
      TopIdx = ListBox1.TopIndex
      For I = 1 To 10
         Me("Label" & I).BackColor = ThisWorkbook.Colors(TopIdx + I)
         Next I
      End If
   DoEvents
   Loop
If FermetureDemandée Then Unload Me
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If Me.Visible Then Me.Hide: FermetureDemandée = True: Cancel = 1
End Sub

Private Sub ListBox1_Click()
Dim Couleur As Double
Couleur = ListBox1.Value
Label11.BackColor = Couleur
Label12.Caption = Couleur
Label13.Caption = "&h" & Application.Dec2Hex(Couleur, 6)
Label14.Caption = "(" & Int(Couleur Mod 256) & "," & Int(Couleur / 256) Mod 256 & ", " & Int(Couleur / 256 ^ 2) Mod 256 & ")"
End Sub
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
On n'a même pas besoin de variable Masquer. Pour que ce soit le plus transparent possible pour le reste de la programmation on peut faire comme ça :]
???
oui, mais ma problématique c'est :
sur un multipage , pouvoir changer de page pour effectuer d'autres procs ...
:(:mad: attention plantage probable lors du changement de page !!!!
 

Pièces jointes

  • scrollbar.xlsm
    41.1 KB · Affichages: 106

Dranreb

XLDnaute Barbatruc
D'accord alors oui, ce serait idiot de laisser tourner la boucle si la page qui contient la ListBox n'est plus visible. (enfin… à voir. Si ça ne gêne pas, ça resterait plus simple quand même)
Donc ça ne peut plus être la UserForm_Activate mais une procédure lancée par la UserForm_Activate éventuellement et surtout aussi par la MultiPage1_Change.
Au lieu de Do While Me.Visible ça sera Do While ListBox1.Parent.Visible
Mais il faut prévoir que le déchargement du UserForm soit fait par la procédure à la fin si la boucle est en train de tourner. Pour éviter un plantage justement.
Genre :
VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If ListBox1.Parent.Visible Then Me.Hide: FermetureDemandée = True: Cancel = 1
End Sub
Et toujours à la fin de la procédure: If FermetureDemandée Then Unload Me

En espérant que ListBox1.Parent.Visible devienne False suite au Me.Hide
À tester.

(Avec mon code proposé au #11, PLANTAGE PROBABLE ou PLANTAGE CONSTATÉ ?
La boucle ne fait plus rien que des DoEvents après tout, je ne vois pas ce qui gênerait)
 
Dernière édition:

Si...

XLDnaute Barbatruc
re
oui, mais ma problématique c'est :
sur un multipage , pouvoir changer de page pour effectuer d'autres procs ...
:(:mad: attention plantage probable lors du changement de page !!!!

Ce n'est pas un problème que de changer de page (le fichier joint contient une mention qui explique bien ce qui s'est passé avec le tien).
Je n'ai pas examiné les barres de la page 2.

Remarque : donc toujours avec le contrôle ListBox et pas de Module de Classe ?
 

Pièces jointes

  • scrollbar (Récupéré).xlsm
    30.6 KB · Affichages: 25

Modeste geedee

XLDnaute Barbatruc
Bonsour®
re
Ce n'est pas un problème que de changer de page (le fichier joint contient une mention qui explique bien ce qui s'est passé avec le tien).
Je n'ai pas examiné les barres de la page 2.
Remarque : donc toujours avec le contrôle ListBox et pas de Module de Classe ?
:(
désolé mais après changement de page puis retour la synchro des labels colorés ne s'effectue plus !!!

??? pas vu la mention ...
 

Statistiques des forums

Discussions
312 084
Messages
2 085 193
Membres
102 810
dernier inscrit
mohammedaminelahbali