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:
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 ;)