Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Remplir un dictionnaire à partir d'un Array

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Pour commencer, je tiens à préciser aue l'Array n'est pas un tableau sur une feuille du classeur mais un Array créé dans une procédure.
J'ai donc un Array qui récupère tous les items d'une base de donnée (située, elle, sur une feuille du classeur). Dans cette base de données il y a 30 items.
Je voudrais remplir un dictionnaire avec cet Array.
L'Array s'appelle "ListeSolvTriés".
Le dictionnaire "listeST".
J'ai tenté de m'y prendre ainsi :
VB:
    For i = 0 To NbTotalSolv - 1  '"NbTotalSolv" : nombre d'items dans la base de données
        listeST.Keys(i) = ListeSolvTriés(i)
    Next
Ça ne marche pas : erreur '9' sous-indice hors intervalle (traduction)
Comment résoudre ce problème ?
 
Solution
Bonjour job,

J'ai essayé, ça n'a pas marché.
J'ai fini par trouver une solution. Je mets la procédure in extenso :
VB:
Sub DresseCombosListes(ComboName$)
'Mise à jour des ComboBox, dont le nom commence par "ComboListe" et dont le suffixe est <= "NbSolvants" (on ne tient compte que des ComboBox visibles sur la feuille),
'de la feuille "Données" qui puisent tous leurs items dans la même base de données (feuille "BD").
'Chaque item ne peut être choisi qu'une fois dans un seul ComboBox ; il disparaît automatiquement des listes des autres ComboBox.
'En somme, on ne peut pas choisir plusieurs fois le même item.
'- ComboName : le nom du ComboBox (parmi les ComboBox "ComboListe")
'BOISGONTIER / Magic_Doctor / job75 / Peter_SSs

    Dim i As...

job75

XLDnaute Barbatruc
Bonsoir Magic_Doctor,

Une procédure classique :
VB:
Sub Test()
Dim listeST As Object, ListeSolvTriés
Set listeST = CreateObject("Scripting.Dictionary") 'late binding
ListeSolvTriés = Array(1, 2, 1, 3)
For i = 0 To UBound(ListeSolvTriés)  '"NbTotalSolv" : nombre d'items dans la base de données
    listeST(ListeSolvTriés(i)) = ""
Next
[A1].Resize(, listeST.Count) = listeST.keys 'pour tester
End Sub
Bonne nuit.
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour job,

J'ai essayé, ça n'a pas marché.
J'ai fini par trouver une solution. Je mets la procédure in extenso :
VB:
Sub DresseCombosListes(ComboName$)
'Mise à jour des ComboBox, dont le nom commence par "ComboListe" et dont le suffixe est <= "NbSolvants" (on ne tient compte que des ComboBox visibles sur la feuille),
'de la feuille "Données" qui puisent tous leurs items dans la même base de données (feuille "BD").
'Chaque item ne peut être choisi qu'une fois dans un seul ComboBox ; il disparaît automatiquement des listes des autres ComboBox.
'En somme, on ne peut pas choisir plusieurs fois le même item.
'- ComboName : le nom du ComboBox (parmi les ComboBox "ComboListe")
'BOISGONTIER / Magic_Doctor / job75 / Peter_SSs

    Dim i As Byte, f1 As Worksheet, f2 As Worksheet, c, ListeSolvTriés As Object, listeST As Object, obj As Object

    Set f1 = Sheets("Données")
    Set f2 = Sheets("BD")
    Set ListeSolvTriés = CreateObject("System.Collections.ArrayList")
    Set listeST = CreateObject("Scripting.Dictionary")
    
    'Chargement du tableau "ListeSolvTriés"
    For Each c In f2.[ListeItems]
       ListeSolvTriés.Add c.Text
    Next
    ListeSolvTriés.Sort  'tri du tableau par ordre alphabétique
    
    'Chargement du dictionnaire "listeST" à partir du tableau "ListeSolvTriés"
    For Each c In ListeSolvTriés.ToArray
        listeST(c) = ""
    Next c
    
    For Each obj In f1.OLEObjects
        If TypeName(obj.Object) = "ComboBox" And ExtractText(obj.Name) = ExtractText(ComboName) Then _
            If obj.Name <> ComboName Then If ExtractNumber(obj.Name) <= NbSolvants + 1 Then _
                If listeST.Exists(obj.Object.Value) Then listeST.Remove obj.Object.Value
    Next
    
    f1.OLEObjects(ComboName).Object.List = listeST.Keys  'transfert du dictionnaire "listeST" dans la liste du ComboBox
    f1.OLEObjects(ComboName).Object.DropDown             'déroule la liste
End Sub
Plutôt que de devoir faire un "duplicata" de la base de donnée et ensuite la trier sur la feuille, je voulais voir s'il était possible de tout faire dans la macro. D'où la nécessité de transférer le contenu du tableau dans le dictionnaire. Ça a l'air de marcher.

A+
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…