1. Ce site utilise des "témoins de connexion" (cookies) conformes aux textes de l'Union Européenne. Continuer à naviguer sur nos pages vaut acceptation de notre règlement en la matière. En savoir plus.

Evenement Scrollbar dans un ActiveX

Discussion dans 'Trucs et astuces' démarrée par Modeste geedee, 30 Novembre 2017.

  1. Modeste geedee

    Modeste geedee XLDnaute Barbatruc

    Inscrit depuis le :
    8 Mars 2012
    Messages :
    5917
    "J'aime" reçus :
    707
    Sexe :
    Masculin
    Habite à:
    50.3257, 3.2486
    Utilise:
    Excel 2007 (PC)
    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:

  2. Staple1600

    Staple1600 XLDnaute Barbatruc

    Inscrit depuis le :
    24 Juin 2005
    Messages :
    22385
    "J'aime" reçus :
    809
    Habite à:
    Roahzon
    Utilise:
    Excel 2013 (PC)
    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?
     
  3. Modeste geedee

    Modeste geedee XLDnaute Barbatruc

    Inscrit depuis le :
    8 Mars 2012
    Messages :
    5917
    "J'aime" reçus :
    707
    Sexe :
    Masculin
    Habite à:
    50.3257, 3.2486
    Utilise:
    Excel 2007 (PC)
    Bonsour®
    ;) 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:

  4. Si...

    Si... XLDnaute Barbatruc

    Inscrit depuis le :
    7 Octobre 2010
    Messages :
    2656
    "J'aime" reçus :
    413
    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:

  5. Modeste geedee

    Modeste geedee XLDnaute Barbatruc

    Inscrit depuis le :
    8 Mars 2012
    Messages :
    5917
    "J'aime" reçus :
    707
    Sexe :
    Masculin
    Habite à:
    50.3257, 3.2486
    Utilise:
    Excel 2007 (PC)
    Bonsour®
    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:

    Dernière édition: 4 Décembre 2017
  6. Si...

    Si... XLDnaute Barbatruc

    Inscrit depuis le :
    7 Octobre 2010
    Messages :
    2656
    "J'aime" reçus :
    413
    Re
    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:

  7. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    12579
    "J'aime" reçus :
    735
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Bonsoir.
    Un truc qui a l'air de marcher pas mal :
    Code (Visual Basic):
    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: 5 Décembre 2017
  8. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    12579
    "J'aime" reçus :
    735
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Bonjour.
    Puis-je connaître la raison du délai si long à répondre à ma proposition ?
     
  9. Modeste geedee

    Modeste geedee XLDnaute Barbatruc

    Inscrit depuis le :
    8 Mars 2012
    Messages :
    5917
    "J'aime" reçus :
    707
    Sexe :
    Masculin
    Habite à:
    50.3257, 3.2486
    Utilise:
    Excel 2007 (PC)
    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
     
  10. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    12579
    "J'aime" reçus :
    735
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    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: 7 Décembre 2017
  11. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    12579
    "J'aime" reçus :
    735
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    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 :
    Code (Visual Basic):
    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
     
  12. Modeste geedee

    Modeste geedee XLDnaute Barbatruc

    Inscrit depuis le :
    8 Mars 2012
    Messages :
    5917
    "J'aime" reçus :
    707
    Sexe :
    Masculin
    Habite à:
    50.3257, 3.2486
    Utilise:
    Excel 2007 (PC)
    Bonsour®
    ???
    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:

  13. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    12579
    "J'aime" reçus :
    735
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    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 :
    Code (Visual Basic):
    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: 7 Décembre 2017
  14. Si...

    Si... XLDnaute Barbatruc

    Inscrit depuis le :
    7 Octobre 2010
    Messages :
    2656
    "J'aime" reçus :
    413
    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 ?
     

    Pièces jointes:

  15. Modeste geedee

    Modeste geedee XLDnaute Barbatruc

    Inscrit depuis le :
    8 Mars 2012
    Messages :
    5917
    "J'aime" reçus :
    707
    Sexe :
    Masculin
    Habite à:
    50.3257, 3.2486
    Utilise:
    Excel 2007 (PC)
    Bonsour®
    :(
    désolé mais après changement de page puis retour la synchro des labels colorés ne s'effectue plus !!!

    ??? pas vu la mention ...
     
  16. Si...

    Si... XLDnaute Barbatruc

    Inscrit depuis le :
    7 Octobre 2010
    Messages :
    2656
    "J'aime" reçus :
    413
    Re

    Suite à un arrêt forcé du progamme, j'ai eu le titre avec la mention (Récupéré) et dans cette version je n'avais pas encore ajouté la macro du retour (pour relancer la synchronisation)

    Code (Visual Basic):
    Private Sub MultiPage1_Change()
      ListBox1.ListIndex = 0: Synchro
    End Sub
     

    Pièces jointes:

  17. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    12579
    "J'aime" reçus :
    735
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Bonjour.
    En faisant une modif toute simple dans le classeur joint au #14 ça marcher chez moi.
    J'ai simplement mis en commentaire la condition derrière Loop
    Synchro continue donc tout simplement à tourner quand on change de page et ça ne gêne en rien le fonctionnement des ScrollBar de la Page 2, et quand on revient à la page 1 il est tout naturellement toujours opérationnel.
    Cela dit, c'est un tout petit peu plus fluide si au lieu de Range("Coloridx")(TopIdx + I, 3) on prend TColorIdx(TopIdx + I, 3), avec au début :
    Code (Visual Basic):
    Option Explicit
    Private MajIdx As Boolean, TopIdx As Integer, TColorIdx()
    Private Sub UserForm_Initialize()
        TColorIdx = Range("Coloridx").Value
        MultiPage1.Value = 0
    End Sub
     
    Dernière édition: 8 Décembre 2017
  18. Modeste geedee

    Modeste geedee XLDnaute Barbatruc

    Inscrit depuis le :
    8 Mars 2012
    Messages :
    5917
    "J'aime" reçus :
    707
    Sexe :
    Masculin
    Habite à:
    50.3257, 3.2486
    Utilise:
    Excel 2007 (PC)
    Bonsour®Merci SI... Merci Dranreb
    grâce à vos suggestions j'ai quasiment obtenu ce que je souhaitai ...;):rolleyes::):cool:
    reste plus qu'a intégrer tout ceci dans ...
    Je vous en ferai la primeur en cadeau de Noël
    :confused:en tant que Béta Testeurs :p

    j'ai réussi à l'occasion à stopper cette synchro inutile quand pas utilisée et qui me turlupinait en terme de ressources ;)
    Capture01.JPG

    Capture02.JPG
     
    Dernière édition: 9 Décembre 2017 à 00:47
  19. Modeste geedee

    Modeste geedee XLDnaute Barbatruc

    Inscrit depuis le :
    8 Mars 2012
    Messages :
    5917
    "J'aime" reçus :
    707
    Sexe :
    Masculin
    Habite à:
    50.3257, 3.2486
    Utilise:
    Excel 2007 (PC)
    Dernière édition: 11 Décembre 2017 à 00:29
  20. Staple1600

    Staple1600 XLDnaute Barbatruc

    Inscrit depuis le :
    24 Juin 2005
    Messages :
    22385
    "J'aime" reçus :
    809
    Habite à:
    Roahzon
    Utilise:
    Excel 2013 (PC)
    Bonsoir Modestee geedee

    Me rememorre-je quand sur mon écran apparut
    Waouh.jpg
    NB: J'avais plusieurs classeurs ouverts quand est survenu l'irrémédiable ;)
    Et pour fermer Excel obliger de passer par le gestionnaire des tâches.

    Ensuite, j'ai ouvert ton classeur seul et là pour le moment pas de soucis
    (à part d'ordre esthétique)
     

Partager cette page