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