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

Excel Discussion :

Problème récupèration de données dans listBox VBA [XL-2007]


Sujet :

Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Par défaut Problème récupèration de données dans listBox VBA
    Bonjour à tous,

    Je suis dans une sacrée impasse , je viens alors vers vous pour que vous veniez à mon secours.
    Je vous explique : j'ai une listBox qui contient différentes valeurs de resistance, self etc.. Ces données sont récupérées à partir de la colonne F d'un tableau Excel. Jusque la rien de sorcier, sauf que je dois trier cette liste de manière à ce que les valeurs soit affichée en ordre croissant. Toujours rien de compliqué. Et la, problème; en effet je souhaite récupérer la ligne correspondante à la valeur de la résistance pour en extraire d'autres données, si je n'effectue pas de tri par ordre croissant sur la listBox, il m'est facile de récupérer la ligne correspondante à la valeur (voir code ci dessous) , mais lorsque le tri est effectué, l'index de l'élément de la listBox sélectionné ne fais plus du tout référence à l'index avant que le tri ne soit fait . Je ne sais pas si j'ai été très clair dans mes explications, je vous donne le code correspondant si cela peut vous aider à comprendre.

    Merci de votre aide.

    Private Sub boutonRechercheResistance_Click()
    Dim i As Integer
    i = 0
    listBoxFichesApprochantes.Clear
    labelTypeRecherche.Caption = "R"
    For j = 2 To nbLignesFeuille
    valeurColonneResistance = Range("F" & j).Value
    valeurEtatFiche = Range("D" & j).Value
    listBoxFichesApprochantes.AddItem (valeurColonneResistance) & " " & (valeurEtatFiche)
    tabLignesCorrespondantesFichesApprochantes(i) = CInt(j)
    i = i + 1
    Next j
    Me.listBoxFichesApprochantes.List = triCroissant(Me.listBoxFichesApprochantes.List)
    End Sub

    Private Sub listBoxFichesApprochantes_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    'recuperation de l'index de la liste resistance selectionné par l'utilisateur
    indexSelectionListeFichesApprochantes = listBoxFichesApprochantes.ListIndex
    'recuperation de la ligne correspondante
    numeroLigneChoisie = tabLignesCorrespondantesFichesApprochantes(indexSelectionListeFichesApprochantes)
    MsgBox numeroLigneChoisie
    Unload Me
    fiche_reglage.Show
    End Sub

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    une solution toute simple.

    tu crée une seconde colonne dans ta listbox, que tu n'affiches pas

    quand tu charges les valeurs dans ta listbox (en colonne 1), tu mets dans la colonne 2 la ligne s'y rapportant

    ainsi, tu peux trier tes éléments, tout en conserver l'information du numéro de la ligne source

    un exemple trivial, j'insère la valeur des Cellules A1 à A3 en colonne 1 et j'insère en colonne 2 le numéro de ligne source

    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
    Private Sub UserForm_Initialize()
        With Me.ListBox1
            ' deux colonnes
            .ColumnCount = 2
            ' taille des colonnes, 0 = on la voit pas
            .ColumnWidths = "50;0"
     
            k = 0
            For i = 1 To 3
                .AddItem
                .List(k, 0) = Cells(i, 1)
                .List(k, 1) = Cells(i, 1).Row
                k = k + 1
            Next i
        End With
    End Sub

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Par défaut
    Merci pour ton astuce de séparer la listBox en deux, mais ma méthode de tri ne fonctionne pas avec cette technique..

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    peux-tu nous montrer cette procédure TriCroissant ?

    quand tu dis que ça ne fonctionne pas, que se passe-t-il ? Message d'erreur ou les deux colonnes ne sont plus symétriques ?

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Par défaut
    Function triCroissant(liSte)

    'permet de trier les element par ordre croissant
    Dim First As Long, Last As Long
    Dim i As Long, j As Long
    Dim Temp
    First = LBound(liSte)
    Last = UBound(liSte)
    For i = First To Last - 1
    For j = i + 1 To Last
    If CDbl(Left(liSte(i, 0), 6)) > CDbl(Left(liSte(j, 0), 6)) Then
    Temp = liSte(j, 0)
    liSte(j, 0) = liSte(i, 0)
    liSte(i, 0) = Temp
    End If
    Next j
    Next i
    triCroissant = liSte
    End Function

    Cela m'affiche un message d'erreur. J'ai essaayé plusieurs solutions, soit les données sont triées et pas rattachés à un numéro de ligne, soit pas triées et bien rattachées

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    J'ai un peu modifié ta procédure de tri croissant

    chaque élément déplacé dans la colonne 1 génère le même déplacement dans la colonne 2

    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
    26
    27
    28
    unction triCroissant(liSte)
     
     'permet de trier les element par ordre croissant
     Dim First As Long, Last As Long
     Dim i As Long, j As Long
     Dim Temp
     Dim Temp2
     
     First = LBound(liSte)
     Last = UBound(liSte)
        For i = First To Last - 1
            For j = i + 1 To Last
                If CDbl(Left(liSte(i, 0), 6)) > CDbl(Left(liSte(j, 0), 6)) Then
     
                    Temp = liSte(j, 0)
                    Temp2 = liSte(j, 1)
     
                    liSte(j, 0) = liSte(i, 0)
                    liSte(j, 1) = liSte(i, 1)
     
                    liSte(i, 0) = Temp
                    liSte(i, 1) = Temp2
                End If
            Next j
        Next i
     
     triCroissant = liSte
     End Function

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

Discussions similaires

  1. [PDO] problème récupération de données dans un formulaire
    Par toutoutahtouha dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/08/2011, 14h05
  2. Réponses: 2
    Dernier message: 20/03/2009, 12h25
  3. Réponses: 1
    Dernier message: 04/06/2006, 16h08
  4. problème récupération de données dans des fichiers .DAT
    Par indymontpellier dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/04/2006, 07h54
  5. Problème de récupérations de données dans une table mysql
    Par Helpine dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 09/03/2006, 19h07

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