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![]()
Partager