IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Listbox, problème de mise à jour après Evénement MouseUp


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut Listbox, problème de mise à jour après Evénement MouseUp
    Bonjour,

    Dans une feuille j'ai une listBox avec pas mal d'enregistrements.

    Ce que je voudrais c'est que tant que faire se peut (c'est à dire tant que je ne suis pas en tout début de liste ou en fin), la ligne sélectionnée soit toujours au milieu de la Listbox affichée.

    Ma Listbox affiche 18 valeurs, je considère donc que le milieu est au 9ieme élément.

    Pour ce qui est de quand j'utilise les flèches, ça marche avec ce code là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub ListBoxNomEC_Keyup(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        ' Force la ligne sélectionnée de la ListBoxNomEC à rester le plus possible au millieu de la listbox
     
        If Abs(Me.ListBoxNomEC.ListIndex - Me.ListBoxNomEC.TopIndex) > 9 Or (Abs(Me.ListBoxNomEC.ListIndex - Me.ListBoxNomEC.TopIndex) < 9 And Me.ListBoxNomEC.ListIndex >= 9) Then
            Me.ListBoxNomEC.TopIndex = Me.ListBoxNomEC.ListIndex - 9
        End If
     
    End Sub
    Mais je voudrais aussi que cela fonctionne sur un clic dans la liste, j'ai donc mis ce code là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub ListBoxNomEC_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     
        Select Case Button
            Case 1
                ' Si click gauche centrage de la sélection
                ListBoxNomEC.Selected(ListBoxNomEC.ListIndex) = True
                ListBoxNomEC.TopIndex = Me.ListBoxNomEC.ListIndex - 9
            Case 2
                ' Si clic droit, appel du formulaire de recherche
                UserFormRecherche.Show
            Case Else
                Exit Sub
            End Select
     
    End Sub
    Ça marche presque, sauf qu'après le passage dans ce module, la sélection se déplace sur l'endroit où j'ai cliqué au lieu de rester sur la ligne que je viens de placer au milieu de la liste (j'ai pourtant le temps de voir que la sélection se déplace bien à un moment donné sur la ligne que je viens de mettre au centre)....

    C'est comme si après avoir passé dans la MouseUp, il se passait encore quelque chose.

    J'ai essayé de déplacer le code dans le Listbox.clic, même punition, ça marche un pouillème de temps puis la sélection se déplace là ou j'ai cliqué.

    J'ai comme l'impression qu'il faudrait bloquer/inhiber un événement qui se produit après mon code, mais je ne vois pas lequel?

    Si quelqu'un a une idée, je suis preneur.

    PS: quand ça va marcher je sécuriserai la gestion de l'index pour ne pas avoir de problème en fin/début de liste comme fait dans le KeyUp.

    Merci d'avance de vos réponses.

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Ce que je voudrais c'est que tant que faire se peut (c'est à dire tant que je ne suis pas en tout début de liste ou en fin), la ligne sélectionnée soit toujours au milieu de la Listbox affichée.
    Tu m'expliqueras d'abord comment tu pourrais sélectionner la première ligne en l'affichant "au milieu".
    On verra ensuite.

  3. #3
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Bonjour unparia,

    Mon explication ne devait pas être super claire:
    - Prenons pour exemple une liste de 50 éléments, ma listbox affiche les 18 premiers avec aucun de sélectionné.
    - je sélectionne le 2ieme élément, la liste ne se décale pas car je suis sur un élément en dessous de 9.
    - avec la flêche du bas, je descend dans ma liste, tant que je suis inférieur ou égal au 9ieme élément, l'affichage ne bouge pas (en dehors de la ligne de sélection qui descend)
    - je continue de descendre vers le bas, à partir du 10ieme élémnet, à chaque fois que je fais une flèche vers le bas, le premier élément de la liste affiché se décale pour afficher les éléments de 2 à 19 puis 3 à 20 puis 4 à 21... avec le ligne sélectionnée qui reste au milieu de ma listbox (quand il n'y a aucun code, la sélection descend jusqu'au bas de la listbox et après elle se décale toute seule avec la ligne sélectionnée qui reste en bas de la listbox)
    - quand le 32ieme élément de la liste arrive en haut de la listbox, et que l'on continue à utiliser la flèche bas, la ligne de sélection commence à se déplacer du 9ieme élément affiché vers le 10ieme jusqu'à atteindre le 50ieme en bas de la listbox (qui est le 18ieme affiché)

    Et inversement avec la flêche du haut....

    Du coup quand ce sont les 18 premiers éléments de la liste qui sont affichés, si je clique sur un des 9 premiers, il ne doit rien se passer, par contre si je clique sur le 17ieme (avant dernier affiché) je voudrais que la liste affichée se centre sur le 17ieme élément (affichage des éléments 8 à 26).

    Avec le code que j'ai mis, ça centre bien la liste sur le 17ieme, je le vois bien sélectionné au milieu de ma liste une fraction de seconde puis soudainement, c'est le nouveau avant dernier au bas de la liste (là ou physiquement j'ai cliqué) qui se retrouve sélectionné (ça doit être le 25 de la liste globale: 17+9-1)

    Je ne sais pas si je suis plus clair?

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    a suposer que ta listbox offre la visibilité de 10 items
    le probleme c'est que quand tu click sur les listbox on a un petit soucis de focus et graphiquement ca fait un affichage du listindex erroné
    une solution comme ca sans etre sur que ca puisse coinsider avec la gestion des evement change si tu les utilise
    si tu est a listindex>5 et < listcount-5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        With ListBox1
            If .ListIndex >= 5 Then
                a = .ListIndex
                l = .List: .Clear: .List = l
                .TopIndex = a - 5: .ListIndex = a:
            Else: .TopIndex = 0
            End If
        End With
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Merci patricktoulon,

    Ça marche, il a fallu que j'adapte un peu parce que ma listbox était alimentée par une plage nommée déclarée directement dans la propriété ListFillRange de la listbox ce qui créait une erreur lors du .Clear.

    Ça donne donc ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Private Sub ListBoxNomEC_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     
        Select Case Button
            Case 1
                ' Si click gauche centrage de la sélection
                If Abs(Me.ListBoxNomEC.ListIndex - Me.ListBoxNomEC.TopIndex) > 9 Or (Abs(Me.ListBoxNomEC.ListIndex - Me.ListBoxNomEC.TopIndex) < 9 And Me.ListBoxNomEC.ListIndex >= 9) Then
                    Dim Index As Long
                    Index = Me.ListBoxNomEC.ListIndex
                    Me.ListBoxNomEC.Clear
                    Me.ListBoxNomEC.List = ThisWorkbook.Worksheets("Données Liste EC").Range("ListeEC").Value
                    Me.ListBoxNomEC.TopIndex = Index - 9
                    Me.ListBoxNomEC.ListIndex = Index
                End If
            Case 2
                ' Si clic droit, appel du formulaire de recherche
                UserFormRecherche.Show
            Case Else
                Exit Sub
            End Select
     
    End Sub
    Alors triplement bravo parce que:
    1: ça marche
    2: j'ai découvert la propriété .list de la listbox, quand je pense au nombre de listbox que j'ai patiemment remplies avec une boucle pour parcourir tous les éléments d'un range, j'en pleure
    3: il va falloir que je m'intéresse sérieusement à ta manière hyper condensée d'écrire ton code , parce que je connais bien le with/end with, mais je ne l'utilisais que pour de la mise en forme de cellules/graphiques et je n'avais jamais pensé à l'appliquer à un bloc comme toi, et le coup des : je ne connaissais pas.

    Donc merci pour le coup de main.

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Private Sub ListBoxNomEC_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     
        Select Case Button
            Case 1 ' Si click gauche centrage de la sélection
               With Me.ListBoxNomEC
               ' liste = .List
                If Abs(.ListIndex - .TopIndex) > 9 Or (Abs(.ListIndex - .TopIndex) < 9 And .ListIndex >= 9) Then
                    Dim Index As Long
                    Index = .ListIndex
                    .Clear
                    .List = ThisWorkbook.Worksheets("Données Liste EC").Range("ListeEC").Value
                    'en debloquant la ligne 6 on peur remplacer la ligne11  par la ligne 13
                    '.List = liste
                    .TopIndex = Index - 9
                    .ListIndex = Index
                End If
            End With
            Case 2
                ' Si clic droit, appel du formulaire de recherche
                UserFormRecherche.Show
            Case Else
                Exit Sub
            End Select
     
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Bonjour patricktoulon,

    OK, j'optimise l'écriture

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/04/2015, 14h10
  2. Réponses: 3
    Dernier message: 10/05/2007, 08h43
  3. Réponses: 2
    Dernier message: 04/04/2007, 12h14
  4. Problème de mise à jour de base de données
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 26/05/2004, 12h38
  5. problème de mise à jour de BD
    Par tidiane dans le forum Bases de données
    Réponses: 5
    Dernier message: 04/03/2004, 16h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo