souci avec Dictionary et comptage

erics83

XLDnaute Impliqué
Bonjour,

j'ai un petit souci avec un code, pourtant simple d'un dictionnaire...
Code:
Sub Selectionparlieu()
Dim i As Long
Dim a As Long
Dim DicoEtab As New Dictionary

Set DicoEtab = CreateObject("scripting.dictionary")


For i = 2 To ActiveSheet.Range("T65536").End(xlUp).Row
If Cells(i, 32) = Feuil38.Cells(3, 2) Then 'va voir quelle agence sélectionnée
DicoEtab.Item(Cells(i, 20)) = Cells(i, 26)

End If
Next

[AN2].Resize(DicoEtab.Count) = Application.Transpose(DicoEtab.Keys)
[AO2].Resize(DicoEtab.Count) = Application.Transpose(DicoEtab.Items)
Il se met en erreur au niveau de
Code:
[AN2].Resize(DicoEtab.Count) = Application.Transpose(DicoEtab.Keys)
En regardant dans les variables, il s'arrête à la 256 alors qu'il y a 1068 réponses....en mettant erreur de compabilité...et je ne comprends pas pourquoi....

Merci pour votre aide,
 

erics83

XLDnaute Impliqué
Bonjour,

En fait, cela ne fonctionne pas.....ou du moins, cela ne me donne pas le résultat escompté.... : j'ai un fichier de données avec des établissement, par activité et par agence.

(je cherche à utiliser Dictionary et donc fait des essais....)

Je cherche simplement à :
lister les établissements qui sont rattachés à une agence (mise en Feuil8 B3) et les lister dans une autre colonne, avec son domaine d'activité.

J'ai donc essayé avec une macro "à l'ancienne" et j'ai essayé avec Dictionary et je n'ai pas les mêmes résultats...apparemment Dictionary ne prend que des référence unique...ou alors (et certainement) je fais une erreur....

merci pour votre aide,
(je mets en PJ un classeur test)
 

Pièces jointes

  • Classeur1.xlsm
    334.6 KB · Affichages: 26

Dranreb

XLDnaute Barbatruc
Bonjour.
Par définition les clés d'un Dictionary sont toujours uniques.
Le 2nde occurrence de "Etab1956" n'y sera donc plus ajoutée puisqu'elle y figure déjà. Cependant si l'item devait différer, il remplacerait celui spécifié la fois d'avant.
 

erics83

XLDnaute Impliqué
Merci Dranreb,

Un petit exemple ? j'ai essayé d'utiliser les Tableaux en regardant les exemples de JB, mais à chaque fois, les données sont déclarées
Code:
Sub Tab2D()
  Dim a(1 To 3, 1 To 2) ' 3 lignes x 2 colonnes
  a(1, 1) = 11
  a(1, 2) = 12
  a(2, 1) = 21
  a(2, 2) = 22
  a(3, 1) = 31
  a(3, 2) = 32
  For lig = LBound(a, 1) To UBound(a, 1)
     For col = LBound(a, 2) To UBound(a, 2)
        Cells(lig, col) = a(lig, col)
     Next col
  Next lig
End Sub
et donc, je ne sais pas trop comment les utiliser dans mon cas....

Merci pour votre aide,
 

Dranreb

XLDnaute Barbatruc
Non. Évitez d'utiliser Cells ou Range dans des boucles, sinon vous ne gagnez rien. Aussi bien en lecture qu'en écriture, la proprié Value d'un objet Range représentant plusieurs cellules contigües est (ou, en sortie, doit être) directement constituée d'un tableau à 2 dimensions d'éléments de type Variant. Dans les boucle, ne travaillez qu'avec les éléments des tableaux. Vous chargez au début celui d'entrée en une fois, vous déposez à la fin le résultant aussi en une fois. Là vous aurez des codes rapides.
 

gosselien

XLDnaute Barbatruc
Non. Évitez d'utiliser Cells ou Range dans des boucles, sinon vous ne gagnez rien. Aussi bien en lecture qu'en écriture, la proprié Value d'un objet Range représentant plusieurs cellules contigües est (ou, en sortie, doit être) directement constituée d'un tableau à 2 dimensions d'éléments de type Variant. Dans les boucle, ne travaillez qu'avec les éléments des tableaux. Vous chargez au début celui d'entrée en une fois, vous déposez à la fin le résultant aussi en une fois. Là vous aurez des codes rapides.
Très bon conseil, mais si le demandeur rame autant que moi avec les tableaux et dico, il n'avancera pas.
 

Dranreb

XLDnaute Barbatruc
Mon corrigé :
VB:
Sub SélectionParLieuRapide()
Dim TE(), LE&, TS(), LS&, Arg
TE = Feuil4.[T2:AF2].Resize(Feuil4.[T35536].End(xlUp).Row - 1).Value
ReDim TS(1 To UBound(TE, 1), 1 To 2)
Arg = Feuil8.Cells(3, 2).Value
For LE = 1 To UBound(TE, 1)
   If TE(LE, 13) = Arg Then
      LS = LS + 1
      TS(LS, 1) = TE(LE, 1)
      TS(LS, 2) = TE(LE, 7)
      End If: Next LE
Feuil4.[AN2].Resize(UBound(TS, 1), 2).Value = TS
End Sub
 
Dernière édition:

erics83

XLDnaute Impliqué
Merci gosselien, c'est clair que je galère, mais à force.....j'espère y arriver....lol

Merci Danreb, je pense avoir compris ce que vous me suggerez, j'ai donc essayé
Code:
Sub Selectionparlieudictionary()
Dim i As Long
Dim a As Long
Dim b As Long

Dim DicoEtab As New Dictionary
b = 1
Set DicoEtab = CreateObject("scripting.dictionary")
a = [T1:AF20000]
For i = 1 To 10000
If a.Offset(, 12) = Feuil8.Cells(3, 2) Then 'va voir quelle agence sélectionnée
b = b + 1
DicoEtab.Item(b) = a.Offset(, 6)
End If
Next
Mais le code bloque au niveau de a.offset.....
Suis-je sur la "bonne" piste ?

En vous remerciant pour votre aide,
 

erics83

XLDnaute Impliqué
Merci Danreb,

Nos post se sont croisés....je vais analyser votre code et essayer d'en comprendre la logique (pour pouvoir me "perfectionner" dans les tableaux....

Merci car votre code fonctionne parfaitement (évidemment...lol) et je vois comment déclarer les variables....

Merci,

merci pour votre aide,
 

erics83

XLDnaute Impliqué
Merci Danreb,

Je viens de comprendre la logique du code. En fait apparemment j'avais pris cette même logique..., mais les déclarations et le format du tableau n'étaient vraiment pas bons.....lol

Je commence à mieux comprendre comment les utiliser et sur je vais m'entrainer pour les ré-utiliser .....si à tout hasard, vous pouviez me conseiller un "bon" tuto (car sur le net, on est noyé...) sur ces tableaux, histoire de me perfectionner, cela serait vraiment gentil.

Merci,

Merci pour votre aide,
 

erics83

XLDnaute Impliqué
Merci Dranreb,

Effectivement, votre code est très clair, je pensais qu'il y avait d'autres subtilités avec les tableaux, mais si cela se résume à la "bonne" déclaration, à l'utilisation des variables comme vous me l'avez démontré, alors, je pense avoir tout compris, et j'ai hate de les ré-utiliser ...

merci,

merci pour votre aide,
 

Discussions similaires

Réponses
12
Affichages
247

Statistiques des forums

Discussions
312 196
Messages
2 086 098
Membres
103 116
dernier inscrit
kutobi87