fonction Scripting.Dictionary

Pyrof

XLDnaute Occasionnel
Bonjour,

J'utilise beaucoup la fonction CreateObject("Scripting.Dictionary")
comme dans la document :

Dim a, d, i 'Crée des variables
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athènes" 'Ajoute des clés et des éléments.
d.Add "c", "Le Caire"
d.Add "b", "Belgrade"
a = d.keys 'Obtient les éléments

For i = 0 To d.Count -1 'Effectue une itération sur le tableau
Print a(i) 'Imprime un élément
Next

Seulement lorsque l'on fait un for to (ou each), il nous les liste suivant l'ordre d'insertion.
Je souhaiterai faire un tri alphabétique sur les clés.

Quelqu'un a t-il fait cela et comment

Merci
 

pierrejean

XLDnaute Barbatruc
Re : fonction Scripting.Dictionary

bonjour Pyrof

voici un essai de classement des clés

Code:
Sub test()
Dim a, d, i 'Crée des variables
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athènes" 'Ajoute des clés et des éléments.
d.Add "c", "Le Caire"
d.Add "b", "Belgrade"
a = d.keys 'Obtient les éléments
' classement des clés
For n = 1 To UBound(a)
 For m = n + 1 To UBound(a)
   If a(m) < a(n) Then
   temp = a(m)
   a(m) = a(n)
   a(n) = temp
   End If
 Next m
Next n
'Affichage
For i = 0 To d.Count - 1 'Effectue une itération sur le tableau
MsgBox (d(a(i))) 'Affiche un élément
Next
End Sub
 

jlgi

XLDnaute Nouveau
Re : fonction Scripting.Dictionary

bonjour,
Pour des raisons de rapidité d'execution, j'ai utilisé "sripting.dictionary".
j'ai créé un premier dico ayant comme "binome": "repère chemin de câbles" / "dimensions chemin de câbles"
Ensuite j'en ai créé un second tel que: " "repère chemin de câbles" / "Somme des surfaces des câbles y cheminant"

Donc j'ai deux dicos: (AA / BB) et (AA / CC)

Mon problème est que je ne parviens pas à faire correspondre les deux dicos en les reportant sur un onglet "RESULTAT" dans un tableau 2D: col A: "repère chemin de câbles", col B:"dimensions ChdC", col C: "surface utilisée"

Pourriez-vous m'aider
merci d'avance
 

Dranreb

XLDnaute Barbatruc
Re : fonction Scripting.Dictionary

Bonjour.

Utilisez des dictionnaires arborescents, voir modules appropriés de OutIdx, ils sont très facile à construire et à utiliser: leurs item contiennent au final les liste des numéros de lignes en correspondances avec les clés de tous les niveaux.

Edit: Salut pierrejean

J'ajouterai qu'avec deux dictionnaires arborescents à un seul niveau, il est possible de construire une version filtrée du second ne comportant que les n° de lignes associés à une clé donnée du premier, et que tout cela est effectué automatiquement dans le module de classe ComboBoxLiés. Celui cii permet un minimum de code dans un Userform, avec obtention, dans une procédure évènement Résultat, de la liste des n° des lignes communes à tous les choix.
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : fonction Scripting.Dictionary

Bonjour jlgi

Si dico1 est AA/BB , dico2 est AA/CC


Code:
a=dico1.keys
b=dico1.items
c=dico2.items
for n=lbound(a) to ubound(a)
 sheets("RESULTAT").range("A" & n+2)=a(n)
 sheets("RESULTAT").range("B" & n+2)=b(n)
 sheets("RESULTAT").range("C" & n+2)=c(n)
next

Edit :Salut Dranreb
 

Efgé

XLDnaute Barbatruc
Re : fonction Scripting.Dictionary

Bonjour à tous
Une proposition avec une propriété rarement utilisée:
VB:
Private Sub CommandButton1_Click()
Dim i&, T As Variant, Dico As Object
Set Dico = CreateObject("Scripting.dictionary")
With Sheets("Feuil1")
    T = .Range(.Cells(1, 1), .Cells(.Rows.Count, 7).End(3))
End With
For i = LBound(T, 1) To UBound(T, 1)
    Dico(T(i, 1)) = Array(T(i, 1), T(i, 3), T(i, 6))
Next i
Sheets("Feuil1").Cells(1, 12).Resize(Dico.Count, 3) = Application.Index(Dico.items, , 0)
End Sub
Cordialement
 

Pièces jointes

  • Classeur1.xlsm
    19.4 KB · Affichages: 82
  • Classeur1.xlsm
    19.4 KB · Affichages: 90
  • Classeur1.xlsm
    19.4 KB · Affichages: 88

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : fonction Scripting.Dictionary

Bonjour,

Module de classe donnant une liste triée

Classe Dictionnaire

http://boisgontierjacques.free.fr/fichiers/Cellules/ClasseDictionnaireDico.xls

http://boisgontierjacques.free.fr/fichiers/Cellules/DictTri.xls

Code:
Sub ListeSansDoublonsDicoTrié()
  Set d1 = New Dictionnaire
  a = Range("A2:B" & [A65000].End(xlUp).Row)
  For i = 1 To UBound(a)
    d1.ajout a(i, 1), a(i, 2)
  Next i
  '--- résultat dans le tableur
  Range("d2").Resize(d1.Count, 2) = d1.Tri
  '-- résultat dans un tableau
  a = d1.Tri
End Sub

JB
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : fonction Scripting.Dictionary

D'ailleurs possible que vous n'ayez pas besoin de Dictionary: La fonction GroupOrg du module MClassement de OutIdx pourrait suffire.
Elle a besoin des modules de classe TableIndex et SsGroup.
 

jlgi

XLDnaute Nouveau
Re : fonction Scripting.Dictionary

Bonjour et merci pierrejean

Ca marche et c'est super rapide.
En fait, je m'étais perdu dans l'aide excel qui n'a fait que m'embrouiller.
Je tiens à signaler que je suis novice en la matière et que ce forum m'aide énormément.

Merci encore à tous
 

Statistiques des forums

Discussions
312 309
Messages
2 087 108
Membres
103 472
dernier inscrit
garnoux57