VBA - Mystère sur dictionary

Hervé

XLDnaute Barbatruc
bonjour

pour repondre à un post, j'ai voulu utiliser un dictionary (j'aime bien ce bidule :))

un dictionary est une collection plus poussée, qui nécessite l'activation de la bibliothèque Microsoft Scripting Runtime dans Outils\Références.

le but de ce code est de faire le cumul de la colonne B suivant les items de la colonne A (sans créer de doublons), voir la piece jointe.

le code :

Code:
Public Sub toto()
'La bibliothèque Microsoft Scripting Runtime
' doit être coché dans Outils\Références...
Dim data As New Dictionary
Dim tablo, i As Integer

tablo = Range("a2:b" & Range("a65536").End(xlUp).Row)

For i = 1 To UBound(tablo)
    data.Item(tablo(i, 1)) = data.Item(tablo(i, 1)) + tablo(i, 2)
Next i

Range("H1", Cells(data.Count, "H")) = Application.Transpose(data.Items)
Range("G1", Cells(data.Count, "G")) = Application.Transpose(data.Keys)

End Sub
normalement, pour remplir une collection ou un dictionary on utilise la méthode .add, or ce code à l'air de fonctionner sans cette méthode :eek:

quelqu'un pourrait'il m'expliquer ce mystère ?

en piece jointe un petit fichier pour compléter mon propos (pensez à activer la référence).

en vous remerciant par avance.

salut
 

Pièces jointes

  • toto.zip
    9.1 KB · Affichages: 382
  • toto.zip
    9.1 KB · Affichages: 355
  • toto.zip
    9.1 KB · Affichages: 357

mutzik

XLDnaute Barbatruc
Re : VBA - Mystère sur dictionary

Bonjour Hervé,

excellente année à toi et aux tiens,
1. je ne connaissais pas dictionnary
2. j'ai essayé ton code, ca marche impec (mais cela tu le savais déja)

pour répondre à ta question (essayer du moins), je pense que dans ta boucle, ou tu écris

data.Item(tablo(i, 1)) = ...

cela doit correspondre à un .add puisque tu déclares data comme étant un dictionnary et que le vba est suffisamment intelligent pour comprendre (?) qu'il faut ajouter une nouvelle entrée à la collection data

mais toute cette prose reste à être confirmée (ou infirmée) par un vbéiste plus costaud que moi (cà va pas être trop dur à trouver, d'ailleurs ;-)

bye
 

Jacques87

XLDnaute Accro
Re : VBA - Mystère sur dictionary

Bonjour Hervé et d'abord je te présente tous mes voeux pour 2007.

En ce qui concerne ma question :

La propriété Item de l'objet Dictionary a pour syntaxe :
Dictionary.Item(clé) = nouvelItem

Si évidemment la clé est obligatoire (ce qui est lgique), l'argument "=nouvelItem" est quant à lui facultatif.
Toutefois si tu le spécifies, l'élément nouvelitem sera la nouvelle valeur associée à l'argument clé de ton Dictinary.
Ceci est une spécificité de l'objet Dictionary, spécificité qui n'a aucun effet avec l'objet collection.

Donc dans ton exemple, avec ta boucle, tu passes en revue chaque Item de ton Dictionary "data" et en spécifiant l'élément nouvelItem, tu remplaces automatiquement l'ancien par le nouveau (sans passer par Add).

Voila ce que j'en pense, en espérant être dans la vérité.

Amicalement

P.S. : Bonjour Bertrand et tous mes voeux pour cette nouvele année.
Il me semble que nous avons la même perception donc analyse en ce qui concerne l'objet Dictionary
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : VBA - Mystère sur dictionary

bonjour Hervé

l'explication est peut-etre dans la remarque péchée dans l'aide de Item

Remarques
Si l'argument key est introuvable lors de la modification d'un item, une nouvelle key est créée avec le newitem

en tous cas merci de nous avoir présenté le dictionary

pour ma part ,dès que jaurais commencé à integrer convenablement les tableaux , je tenterais de me familiatiser avec ce concept qui parait assez fabuleux
 

myDearFriend!

XLDnaute Barbatruc
Re : VBA - Mystère sur dictionary

Bonjour Hervé, mutzik, le Forum,

J'ai déjà essayé d'osculter cet objet il y a quelques temps, et j'ai pu découvrir également des choses intéressantes sur le sujet.

Par exemple, pour modifier un Item de l'objet, on utilise quelque chose comme ça :
Code:
[SIZE=2]MonDictionary.Item([I]Clé[/I]) = Valeur[/SIZE]
Il s'avère que si la clé indiquée n'est pas trouvée, on n'obtient pas une erreur comme on pourrait s'y attendre, mais un nouvel item correspondant à cette clé est automatiquement ajouté. C'est pourquoi ton code fonctionne.

Cordialement,

EDITION
Bonjour pierrejean, pardon je ne t'ai pas vu arriver...
EDITION N°2
Bonjour Jacques87, pareil que pour pierrejean, beaucoup de monde sur ce fil.

 
Dernière édition:

JCGL

XLDnaute Barbatruc
Re : VBA - Mystère sur dictionary

Bonsoir à tous, Mutzig
Salut Hervé,

Excellent, tu ne peux pas imaginer les horizons que m'ouvrent ton code.

Pas d'explication mais ça marche et pour moi c'est le principal :p


Bonne soirée
 
Dernière édition:

Hervé

XLDnaute Barbatruc
Re : VBA - Mystère sur dictionary

Bonjour à tous

tout d'abord bonne année 2007, et merci pour vos réponses.

voilà l'explication :

Si l'argument key est introuvable lors de la modification d'un item, une nouvelle key est créée avec le newitem

merci pierrejean de me fournir l'aide vba que j'ai perdu depuis l'installation d'excel 2007, faudra que je pense à régler ca :)

j'ai continué à explorer cette objet, et vous livre un code qui renvoi en colonne G la liste sans doublons de la colonne A.

Code:
Public Sub toto()
Dim data
Dim tablo, i As Integer

Set data = CreateObject("Scripting.Dictionary")

tablo = Range("a2:a" & Range("a65536").End(xlUp).Row)
ReDim Preserve tablo(1 To UBound(tablo), 1 To 2)

For i = 1 To UBound(tablo)
    data.Item(tablo(i, 1)) = data.Item(tablo(i, 1))
Next i

Range("G1", Cells(data.Count, "G")) = Application.Transpose(data.Keys)

End Sub

plus besoin d'activer la référence dans outil, puisque l'on crée directement l'objet dictionnary (pas belle la vie).

on pourrait egalement se passer du redim en trichant sur l'initialisation du tablo (Range("a2:b"...))

ca devrait nous changer de l'éternel collection et des on error :)

je vous salut bien bas.
 

Hervé

XLDnaute Barbatruc
Re : VBA - Mystère sur dictionary

re re :):)

Mieux, ce code fonctionne egalement pour extraire une liste sans doublon :

Code:
Public Sub toto()
Dim data
Dim tablo, i As Integer

Set data = CreateObject("Scripting.Dictionary")

tablo = Range("a2:a" & Range("a65536").End(xlUp).Row)

For i = 1 To UBound(tablo)
    data.Item(tablo(i, 1)) = data.Item(tablo(i, 1))
Next i

Range("G1", Cells(data.Count, "G")) = Application.Transpose(data.Keys)

End Sub

pourquoi allez chercher compliqué....

salut
 

CB60

XLDnaute Barbatruc
Re : VBA - Mystère sur dictionary

Bonsoir
Je ne vais pas faire avancer votre smilblick ( pas assez de compétence), mais je tenais à vous remercier tous pour ce travail et les explications.
J'ai seulement ajouté une instruction pour effacer la colonne "G" avant de recopier les doublons.

Range("g2:g" & Range("a65536").End(xlUp).Row).ClearContents

Donc merci Hervé, Mutzig, Jacques, PierreJean, MDF et JCGL.
Bonne soirée
 

ChTi160

XLDnaute Barbatruc
Re : VBA - Mystère sur dictionary

Bonjour le Fil
Bonjour Le Forum

Arfff une belle brochette d'Amis auquels je présente
mes Meilleurs Voeux pour cette nouvelle Année
et un Accessit particulier pour HERVE qui commence cette Année de Façon
admirable
Merci mon Ami cela relance ma curiosité Lol :p
Bonne Journée
 

mutzik

XLDnaute Barbatruc
Re : VBA - Mystère sur dictionary

Bonjour à tous,

je sais bien qu'il n'y a pas de question bète, mais que fait cette instruction
data.Item(tablo(i, 1)) = data.Item(tablo(i, 1))
sinon de dire que a = a
ou est-ce simplement pour créer un nombre d'items dans dictionnary autant que dans tablo()
 

ChTi160

XLDnaute Barbatruc
Re : VBA - Mystère sur dictionary

Salut Bertrand
si je peux me permettre tu as la réponse plus haut

Dictionary.Item(clé) = nouvelItem
donc tu affectes comme clé la valeur elle même ,comme pour les collections
Collection.Add nouvelItem, Cstr(nouvelItem) la clé
Code:
Sub test()
Dim Col As Collection
Dim L As Byte
Set Col = New Collection
On Error Resume Next
For L = 1 To 4
  Col.Add L, CStr(L)
Next
On Error GoTo 0
End Sub

bonne fin de Journée
 

Discussions similaires

Statistiques des forums

Discussions
312 502
Messages
2 089 042
Membres
104 010
dernier inscrit
Freba