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 :

Remplir une ListBox à partir de valeurs d'une autre ListBox


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Par défaut Remplir une ListBox à partir de valeurs d'une autre ListBox
    Bonjour,

    je souhaite récupérer les valeurs d'une listbox dans une autre listbox.

    Voici mon code:
    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
     
    With usf_Dot
            .tbRefArt = LstLigDot.List(LstLigDot.ListIndex, 0) ' ref Article
            .tbDesignation = LstLigDot.List(LstLigDot.ListIndex, 1)  ' Designation
            .tbPdt = LstLigDot.List(LstLigDot.ListIndex, 2) ' Produit
            .tbStatutReglementaire = LstLigDot.List(LstLigDot.ListIndex, 3)  'Statut règlementaire
            .tbListePositive = LstLigDot.List(LstLigDot.ListIndex, 4)  'Liste positive
            .tbUnitecde = LstLigDot.List(LstLigDot.ListIndex, 5) ' Unite cde
            .tbStockStaci = LstLigDot.List(LstLigDot.ListIndex, 6) ' Stock
            .tbPoids = LstLigDot.List(LstLigDot.ListIndex, 7)  ' Poids
            '  .tbdatePeremption = LstLigDot.List(LstLigDot.ListIndex, 19) ' Date peremption
            'on récupère le nombre de lignes "réseau" présents dans la listbox LstLignesSel
            x = LstLignesSel.ListCount
            For i = 1 To x
                'Rajout d'une colonne
                LstLignesSel.ColumnCount = 2
               ' Récupération des valeurs présentes à partir de la colonne 11 + x
                LstLignesSel.AddItem
                LstLignesSel.List(i, 1) = LstLigDot.List(LstLigDot.ListIndex, i + 10)
            Next i
     End With
    Mon code plante à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LstLignesSel.List(i, 1) = LstLigDot.List(LstLigDot.ListIndex, i + 10)
    avec l'erreur Nom : 2019-12-12_16-57-06.jpg
Affichages : 1724
Taille : 34,9 Ko

    Est-ce que quelqu'un voit quel peut être le problème?

    Merci d'avance,

    Frank

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonsoir,

    Un exemple simple de transfert entre 2 ListBox

    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
    Dim f
    Private Sub UserForm_Initialize()
      Set f = Sheets("BD")
      Me.Source.List = f.Range("A2:A" & f.[A65000].End(xlUp).Row).Value
      Me.Dest.List = f.Range("B2:B" & f.[b65000].End(xlUp).Row).Value
      ListeManque
    End Sub
     
    Private Sub b_prend_Click()
      If Me.Source.ListIndex <> -1 And Me.Source.ListCount > 0 Then
         Item = Me.Source '.List(i)
         Tbl = Me.Dest.List
         p = Application.Match(Item, Application.Index(Tbl, 0), 0)
         If IsError(p) Then Me.Dest.AddItem Item
         ListeManque
      End If
    End Sub
     
    Private Sub B_enlève_Click()
      If Me.Dest.ListCount > 0 And Me.Dest.ListIndex <> -1 Then Me.Dest.RemoveItem Me.Dest.ListIndex
      ListeManque
    End Sub

    Boisgontier
    Fichiers attachés Fichiers attachés

  3. #3
    Membre Expert
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Par défaut
    Bonjour Jacques,
    merci pour ta réponse, mais je cherche surtout à comprendre pourquoi mon code ne marche pas.

    Je vais être un peu plus précis sur mon besoin:

    la listbox LstLignesSel contient des données sur une colonne.
    La listbox LstLigDot contient des données sur plusieurs colonnes.

    je cherche à créer une deuxième colonne dans LstLignesSel et y intégrer des valeurs prises dans LstLigDot sur plusieurs colonnes.

    Basé sur le nombre de lignes dans LstLigDot, je sais sur combien de colonnes dans LstLigDot je dois travailler.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LstLigDot.List(LstLigDot.ListIndex, i + 10)
    ramène bien la valeur attendue, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LstLignesSel.List(i, 1)
    produit l'erreur indiquée dans mon premier message.

  4. #4
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Hum je pense que le problème est plus "vaste" que juste cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            x = LstLignesSel.ListCount
            For i = 1 To x
                'Rajout d'une colonne
                LstLignesSel.ColumnCount = 2
               ' Récupération des valeurs présentes à partir de la colonne 11 + x
                LstLignesSel.AddItem
                LstLignesSel.List(i, 1) = LstLigDot.List(LstLigDot.ListIndex, i + 10)
            Next i
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LstLignesSel.ColumnCount = 2
    cette propriéte peut-être renseignée en "disgnmode" (lorsque tu poses les composants sur le userform). Si tu souhaites la changer en cours de route, inutile de mettre cette ligne dans la boucle, il faut la mettre avant la boucle, le changement de nombre de colonne s'applique sur l'ensemble de la listbox/combobox.
    De plus VBA adapte automatiquement le nombre de colonne lors des appels à List(..,...) en écriture. Donc cette ligne peut simplement disparaitre.

    Cette ligne ajoute une nouvelle ligne, tu peux même préciser la valeur que tu veux mettre dans cette nouvelle ligne (1ere colonne) en paramètre.

    Du coup il me semble qu'il y a une incohérence
    Je déduit que LstLignesSel a déjà le nombre de lignes dont tu as besoin puisque x fait référence à LstLignesSel.listcount

    ça donnerait un truc comme ça (non testé) que tu peux mettre à la place de la partie de code citée en début de mon message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            For i = 0 To LstLignesSel.ListCount
               ' Récupération des valeurs présentes à partir de la colonne 11 + x
                LstLignesSel.List(i, 1) = LstLigDot.List(LstLigDot.ListIndex, i + 11)
            Next i
    [Edit]
    Attention aux borne de la boucle for, c'est une base 0 ici, donc la première ligne à l'index 0
    [/Edit]
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Membre Expert
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Par défaut
    Bonjour Qwazerty,

    merci pour les corrections.
    Malheureusement, cela ne suffit pas à solutionner mon problème, j'ai toujours la même erreur.

    Je me demande si le problème ne vient pas de la façon dont la listbox LstLignesSel est remplie à l'ouverture du formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    usf_Dot.cbLignes.Clear
      Set f = Sheets("data")
      Set mondico = CreateObject("Scripting.Dictionary")
      a = f.Range("H2:H" & f.[H65000].End(xlUp).Row)   ' tableau a(n,1) pour rapidité
      For i = LBound(a) To UBound(a)
        If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
      Next i
      '--avec tri
      temp = mondico.keys
      Call Tri(temp, LBound(temp), UBound(temp))
      usf_Dot.LstLignesSel.List = temp
    c'est peut-être le fait d'utiliser un tableau qui me pose problème lorsque je veux rajouter les données dans la colonne supplémentaire.

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Je ne pense pas non, si tu avais utiliser RowSource là oui ça aurait posé problème mais sinon logiquement non.

    Tu aurais un petit fichier qui produit cette erreur.

    [Edit]
    J'ai modifié un peu le code mais ça ne changera rien. Par contre je veux bien voir ta fonction Tri, à mon avis elle peut-être améliorée, il n'est pas utile de passer en paramètre les borne LBound et Ubound, il faut le faire à l'intérieur de ta procédure. Après il existe déjà pas mal de procédure qui propose de faire celà, tu en trouvera sur le site de BoisGontierJacques qui t'a répondu au début de la conversation.

    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
    Sub Essai()
    Dim F As Worksheet
    Dim MonDico As New Dictionary 'Plus pratique en phase de création du code. Il faut ajouter Microsoft scripting Runtime dans "Outils" "Références..."
    Dim a As Variant, Temp
    Dim i As Integer
     
        usf_Dot.cbLignes.Clear
        Set F = ThisWorkbook.Sheets("data")
        'Set MonDico = CreateObject("Scripting.Dictionary")
        a = F.Range("H2:H" & F.Cells(F.Rows.Count, "H").End(xlUp).Row).Value  ' tableau a(n,1) pour rapidité
        For i = LBound(a) To UBound(a)
          If a(i, 1) <> "" Then MonDico(a(i, 1)) = ""
        Next i
        '--avec tri
        If MonDico.Count > 0 Then
            Temp = MonDico.Keys
            Call Tri(Temp, LBound(Temp), UBound(Temp))
            usf_Dot.LstLignesSel.List = Temp
        End If
    End Sub
    [/Edit]
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/07/2015, 20h18
  2. Réponses: 8
    Dernier message: 10/02/2014, 14h57
  3. Réponses: 3
    Dernier message: 06/08/2012, 12h25
  4. [A-03] Se servir d'une table pour en remplir une autre
    Par keeepcoool dans le forum Modélisation
    Réponses: 9
    Dernier message: 26/12/2008, 12h44
  5. Réponses: 1
    Dernier message: 23/05/2007, 11h49

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