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 :

Problème utilisation ListBox Multicolonnes avec AddItem et .List [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2018
    Messages : 35
    Par défaut Problème utilisation ListBox Multicolonnes avec AddItem et .List
    Bonjour à tous !

    J'ai une problématique avec un outil ActiveX ListBox.
    Voilà j'effectue un formulaire sur une feuille avec des cellules nommées. Ces cellules permettent, à chaque fois qu'elles sont sélectionnées, d'afficher des informations sur la ListBox.
    Sur le fonctionnel, il charge des tableaux structurés dans des variables tableaux puis il les affiches sur une ListBox selon la cellule sélectionnée.
    La ListBox est donc dynamique car nombreux chargement/déchargement + Multicolonnes. J'utilise les deux méthodes pour les charger à savoir .List et .AddItem selon les cas


    Le soucis c'est que j'ai un code erreur d'exécution 380 "Impossible de définir la propriété .List Valeur de propriété non valide" à chaque fois que je passe d'une ListBox de 1 colonne alimentée avec .List à plusieurs avec .AddItem alors que mes paramètres ListBox.ColumnCount sont définies à chaque fois. C'est comme si c'était impossible d'ajouter une nouvelle colonne.

    Ma ListBox est donc inutilisable avec la méthode .AddItem et je suis obliger de repasser sur une alimentation ListBox via .List en multicolonnes pour régler le problème (ou rebooter le classeur). Ce qui est problématique car cela bloque l'utilisateur à ne pas cliquer n'importe où.
    Je souhaite garder AddItem pour certains cas, je trouve que c'est plus flexible.

    Donc est-ce que l'utilisation des deux méthodes d'alimentation de données avec des colonnes aléatoires (.List et .AddItem) sur une ListBox sont réellement possibles ensemble ? Il y a t'il une erreur dans mon code ou une meilleur manière d'aborder les choses ?

    Je vous poste la partie du code bloquant :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    Option Explicit
    Option Compare Text 
    Option Base 1 
     
    Dim Tbl_Prêteur As Variant, Tbl_Société As Variant, Tbl_Fonction As Variant, Tbl_SD As Variant, Tbl_Localisation As Variant, Tbl_Type As Variant 'Annuaires
    Dim Tbl_BDDclés As Variant, Tbl_SuiviLots As Variant 'Autres
     
    Dim La As Object, Ll As Object 'ListBox
    Dim Etat_import As Byte
     
    Public Cible As Variant 
     
    Sub Import_Données()
     
    Tbl_Prêteur = Sheets("Annuaires").Range("T_Prêteur[#All]")
    Tbl_Société = Sheets("Annuaires").Range("T_Société[#All]")
    Tbl_Fonction = Sheets("Annuaires").Range("T_Fonction[#All]")
    Tbl_SD = Sheets("Annuaires").Range("T_SD[#All]")
    Tbl_Localisation = Sheets("Annuaires").Range("T_Localisation[#All]")
    Tbl_Type = Sheets("Annuaires").Range("T_Type[#All]")
    Tbl_BDDclés = Sheets("BDD clés").Range("T_BDDclés[#All]")
    Tbl_SuiviLots = Sheets("Suivi des lots").Range("T_SuiviLots[#All]")
     
    Etat_import = 1
     
    End Sub
     
    Sub Test_ListBox()
     
    Dim A As Long, B As Long 'Variables pour les boucles
    Dim Tbl_Tampon As Variant, Val_Tampon As Variant, x As Long, trv As Byte 'Variables pour filtre ListBox
     
    'Set = Sert à attribuer une référence d'objet à une variable
    'La ou Ll = Emplacement de la ListBox Annuaire et Lot
    Set La = ThisWorkbook.Worksheets("Formulaires").LBox_Annuaire
    Set Ll = ThisWorkbook.Worksheets("Formulaires").LBox_Lots
     
    'Nettoyage de la ListBox à chaque nouvelle sélection
    La.Clear
    Ll.Clear
     
    If Etat_import = 0 Then Exit Sub 'On sort de la procédure si les données ne sont pas chargées
     
    'Importation du Prêteur dans Annuaire
    If Cible = Range("C_Prêteur").Address Then
        La.ColumnCount = 2
        La.ColumnWidths = "" 'Réinitialisation largeur de colonne
        La.List = Tbl_Prêteur
     
    'Importation de la Société dans Annuaire
    ElseIf Cible = Range("C_Société").Address Then
        La.ColumnCount = UBound(Tbl_Société, 2) 'Nombre de colonne selon l'indice le plus haut du tableau
        La.ColumnWidths = "125; 175; 100; 75; 50" 'Ajustement manuel de la taille des colonnes
        La.List = Tbl_Société
     
    'Importation du Type dans Annuaire
    ElseIf Cible = Range("C_Type").Address Then
        La.ColumnCount = 2
        La.ColumnWidths = "" 'Réinitialisation largeur de colonne
        La.List = Tbl_Type
     
    'Importation N°clé selon la cellule "Type" ET le stock disponible
    ElseIf Cible = Range("C_Nclé").Address Then
        x = 1
        Val_Tampon = Range("C_Type") 'Variable de mémoire pour la cellule type clé
        For A = 2 To UBound(Tbl_Type) '1er Boucle pour Contrôle que le type de clé existe dans l'annuaire
            If Val_Tampon = Tbl_Type(A, 1) Then 'On autorise la boucle B si la valeur est trouvé
                trv = 1
            ElseIf A = UBound(Tbl_Type) And trv = 0 Then 'Si la boucle se termine sans rien trouvé
                La.AddItem "Le type de clé n'est pas présent dans l'Annuaire. Impossible d'effectuer une recherche de disponibilité"
            End If
        Next A
     
        If trv = 1 Then 'Autorisation boucle
            La.ColumnCount = 2
            La.ColumnWidths = "75; 50" 'Réinitialisation largeur de colonne
            For B = 2 To UBound(Tbl_BDDclés) '2e Boucle pour Contrôle la base de donnée des clés
                If Tbl_BDDclés(B, 4) = Val_Tampon And Tbl_BDDclés(B, 5) = "Stock" And Tbl_BDDclés(B, 8) = "" Then 
                    If x = 1 Then 'Ajout des en-têtes dès la première clé trouvée
                        La.AddItem Tbl_BDDclés(1, 2) 'Ajout Date Création. La première ligne vaut 0.
    '****C'est ici ou ça bloque si précédemment la ListBox a été alimenté pour une colonne par .List
                        La.List(La.ListCount - 1, 1) = Tbl_BDDclés(1, 3) 'Ajout N° clé
    '*****************************************************************************
                    End If
                    La.AddItem Tbl_BDDclés(B, 2)
                    La.List(La.ListCount - 1, 1) = Tbl_BDDclés(B, 3)
                   x = x + 1 'On incrémente le tableau si besoin
     
                ElseIf B = UBound(Tbl_BDDclés) And x = 1 Then 'Condition dès que la boucle est fini et aucun item trouvé
                    La.AddItem "Ce type de clé n'est pas présent en stock"
     
                End If
            Next B
        End If
     
    End If
     
    End Sub

    Merci d'avance de votre retour

  2. #2
    Membre très actif
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 376
    Par défaut
    Bonjour,

    Si vos tableaux Tbl_Type et Tbl_BDDclés ont plus d'une dimension, il vous faut indiquer laquelle vous prenez pour vos boucles, en l'occurrence ici c'est la première.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        For A = 2 To UBound(Tbl_Type,1) '1er Boucle pour Contrôle que le type de clé existe dans l'annuaire
            If Val_Tampon = Tbl_Type(A, 1) Then 'On autorise la boucle B si la valeur est trouvé
                trv = 1
            ElseIf A = UBound(Tbl_Type,1) And trv = 0 Then 'Si la boucle se termine sans rien trouvé
                La.AddItem "Le type de clé n'est pas présent dans l'Annuaire. Impossible d'effectuer une recherche de disponibilité"
            End If
        Next 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
     
            For B = 2 To UBound(Tbl_BDDclés,1) '2e Boucle pour Contrôle la base de donnée des clés
                If Tbl_BDDclés(B, 4) = Val_Tampon And Tbl_BDDclés(B, 5) = "Stock" And Tbl_BDDclés(B, 8) = "" Then 
                    If x = 1 Then 'Ajout des en-têtes dès la première clé trouvée
                        La.AddItem Tbl_BDDclés(1, 2) 'Ajout Date Création. La première ligne vaut 0.
    '****C'est ici ou ça bloque si précédemment la ListBox a été alimenté pour une colonne par .List
                        La.List(La.ListCount - 1, 1) = Tbl_BDDclés(1, 3) 'Ajout N° clé
    '*****************************************************************************
                    End If
                    La.AddItem Tbl_BDDclés(B, 2)
                    La.List(La.ListCount - 1, 1) = Tbl_BDDclés(B, 3)
                   x = x + 1 'On incrémente le tableau si besoin
     
                ElseIf B = UBound(Tbl_BDDclés,1) And x = 1 Then 'Condition dès que la boucle est fini et aucun item trouvé
                    La.AddItem "Ce type de clé n'est pas présent en stock"
     
                End If
            Next B

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2018
    Messages : 35
    Par défaut
    Bonjour E KERGRESS et merci pour ce retour rapide.

    Alors pour information toute mes variables tableaux, aussi bizarre que ça puisse paraître, sont prise en compte en deux dimension avec la méthode Range("MonTableau[#All]"). Même si mon tableau structuré ne comporte que une colonne cela donne ça --> Tbl_Type(1, 1) ; Tbl_Type(2, 1) ; Tbl_Type(3, 1) …. Je ne saurai expliqué pourquoi mais cela fonctionne.

    La première boucle Tbl_Type permet juste de rechercher un type si existant ou non. Elle n'a aucune incidence sur la suite car si non trouvé pas de 2e boucles pour Tbl_BDDclés
    La seconde boucles Tbl_BDDclés est multiples colonnes donc l'objectif est d'afficher au moins deux colonnes sur la listbox.

    En l'occurrence les dimensions sont bien définis car le code fonctionne sauf dans le cas de figure Affichage ListBox 1 Colonne (.List) à Affichage ListBox plusieurs Colonnes (.AddItem)

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2018
    Messages : 35
    Par défaut
    Re bonjour à tous,

    Etant donné le nombre de réponse je vais essayer d'être plus directe sur ce problème
    J'ai reproduit l'erreur en simulant une partie de mon fichier. Fichier ci-joint.
    Comme indiqué avec la méthode .AddItem si précédemment le nombre de colonne est inférieure à l'alimentation des données actuelles cela déclare une erreur. J'aimerai comprendre pourquoi d'un point de vue technique.

    Je pourrai contourner le problème mais cela devient un peu lourd sur le traitement.. La méthode AddItem est pratique pour du cas par cas.

    Encore merci d'avance de votre retour.

    Option Explicit
    Option Base 1

    Dim Tbl_Prêteur As Variant, Tbl_Société As Variant, Tbl_Fonction As Variant
    Dim La As Object

    Public Cible As Variant

    Dim Etat_import As Byte

    Sub Import_données()

    Tbl_Prêteur = Sheets("Annuaires").Range("T_Prêteur[#All]")
    Tbl_Société = Sheets("Annuaires").Range("T_Société[#All]")
    Tbl_Fonction = Sheets("Annuaires").Range("T_Fonction[#All]")

    Etat_import = 1

    End Sub

    Sub Test()

    Dim A As Long
    Set La = ThisWorkbook.Worksheets("FeuilTest").ListBox1

    La.Clear

    If Etat_import = 0 Then Exit Sub 'On sort de la procédure si les données ne sont pas chargées

    'Alimentation par .List
    If Cible = Range("C_Prêteur").Address Then
    La.ColumnCount = 1
    La.ColumnWidths = "" 'Réinitialisation du paramètre largeur de colonne
    La.List = Tbl_Prêteur

    'Alimentation par .List
    ElseIf Cible = Range("C_Société").Address Then
    La.ColumnCount = UBound(Tbl_Société, 2) 'Nombre de colonne selon l'indice le plus haut du tableau
    La.ColumnWidths = "125; 175; 100; 75; 50" 'Ajustement manuel de la taille des colonnes
    La.List = Tbl_Société

    'Alimentation par .AddItem
    ElseIf Cible = Range("C_Fonction").Address Then
    La.ColumnCount = 2
    La.ColumnWidths = "75; 50" 'Réinitialisation du paramètre largeur de colonne
    For A = 1 To UBound(Tbl_Fonction)
    La.AddItem Tbl_Fonction(A, 1)
    La.List(La.ListCount - 1, 1) = Tbl_Fonction(A, 2)
    Next A

    End If

    End Sub
    Fichiers attachés Fichiers attachés

  5. #5
    Membre très actif
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 376
    Par défaut
    Bonjour,

    Je n'ai pas d'erreur chez moi.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2018
    Messages : 35
    Par défaut
    Citation Envoyé par E KERGRESSE Voir le message
    Bonjour,

    Je n'ai pas d'erreur chez moi.
    Ah ??

    Et si tu passes de l'étape 2 à l'étape 4 directement ? Ou que tu passes aléatoirement sur chaque cellules ?

    Moi ça me le fait regarde :
    Nom : Capture ListBox.PNG
Affichages : 305
Taille : 15,3 Ko

    Nom : Capture ListBox 2.PNG
Affichages : 285
Taille : 12,9 Ko

  7. #7
    Membre très actif
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 376
    Par défaut
    J'ai bien constaté l'erreur. Regardez si ce code fonctionne chez vous.

    Si vous avez besoin d'utiliser la méthode Additem, c'est que vous avez besoin de filtrer certaines lignes. J'ai donc pris le cas où on éliminait les enregistrements vides dans la table T_Fonction. Pour cela j'ai utilisé une variable tableau intermédiaire que j'ai dû ensuite transposer pour charger la 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    Sub Test3()
     
    Dim IndexTbl As Integer
    Dim A As Long
    Dim Tbl_F2() As Variant
     
    Set La = ThisWorkbook.Worksheets("FeuilTest").ListBox1
     
    La.Clear
     
    If Etat_import = 0 Then Exit Sub 'On sort de la procédure si les données ne sont pas chargées
     
    'Alimentation par .List
    If Cible = Range("C_Prêteur").Address Then
    La.ColumnCount = 1
    La.ColumnWidths = "" 'Réinitialisation du paramètre largeur de colonne
    La.List = Tbl_Prêteur
     
    'Alimentation par .List
    ElseIf Cible = Range("C_Société").Address Then
    La.ColumnCount = UBound(Tbl_Société, 2) 'Nombre de colonne selon l'indice le plus haut du tableau
    La.ColumnWidths = "125; 175; 100; 75; 50" 'Ajustement manuel de la taille des colonnes
    La.List = Tbl_Société
     
    'Alimentation par .AddItem
    ElseIf Cible = Range("C_Fonction").Address Then
     
           La.ColumnCount = 2
           La.ColumnWidths = "75; 50" 'Réinitialisation du paramètre largeur de colonne
     
           IndexTbl = 1
           For A = LBound(Tbl_Fonction, 1) To UBound(Tbl_Fonction, 1)
               Debug.Print A & " : " & Tbl_Fonction(A, 1) & ", " & Tbl_Fonction(A, 2)
               If Tbl_Fonction(A, 1) <> "" Then
                   ReDim Preserve Tbl_F2(2, IndexTbl)
                   Tbl_F2(1, IndexTbl) = Tbl_Fonction(A, 1)
                   Tbl_F2(2, IndexTbl) = Tbl_Fonction(A, 2)
                   IndexTbl = IndexTbl + 1
               End If
           Next A
           La.List = WorksheetFunction.Transpose(Tbl_F2)
     
    End If
     
    End Sub

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2018
    Messages : 35
    Par défaut
    Yes code qui fonctionne à merveille merci E KERGRESSE. Je vais l'adapter au projet.


    Je considère que mon problème est résolu mais par contre plane tout de même un mystère sur cette compatibilité entre .List et .AddItem sur une même ListBox. On contourne le problème sans le résoudre malheureusement.
    Si tu as une idée E KERGRESSE ou si quelqu'un à une suggestion technique sur cette incompatibilité je suis fortement preneur car c'est comme ça qu'on apprend je pense

    Merci encore de ton suivi et sur ce bonne fête de fin d'année !

  9. #9
    Membre très actif
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 376
    Par défaut
    Si j'ai du transposer la matrice, c'est donc que les lignes et les colonnes sont inversées. Voilà la raison.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2018
    Messages : 35
    Par défaut
    Euh non c'est incorrect. Si vous avez du transposer pour ce cas de figure c'est parce-que vous ne pouvez pas redimensionner une variable tableau à la 1er dimension.
    Regardez le code que j'ai posté avant, il n'y avait aucune inversion.

    Mais c'est pas grave car ce bout de code "WorksheetFunction.Transpose()" je ne l'ai jamais utilisé et je dois dire que c'est plutôt intéressant dans le cas d'un traitement sur un nombre de ligne inconnu tout en filtrant les données. Donc merci quand même

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

Discussions similaires

  1. Listbox multicolonne avec saisie quantité
    Par misterjuicelink dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/11/2021, 11h22
  2. [XL-2010] Filtrer une ListBox multicolonne avec la fonction Find
    Par julien2929 dans le forum Excel
    Réponses: 3
    Dernier message: 03/06/2016, 09h40
  3. Réponses: 5
    Dernier message: 01/12/2014, 17h12
  4. Alimenter une listbox multicolonnes avec un tableau de variables
    Par windsor dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/08/2009, 19h23
  5. Boucle avec une listbox multicolonne
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/08/2006, 21h45

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