XL 2010 Dictionnaire-pas trouver d'explication

cathodique

XLDnaute Barbatruc
Bonjour,

à la recherche d'une solution, j'ai consulté un tas de discussions et effectuer des recherches de tutos sur le net.
Je n'ai pas compris pourquoi les lignes en fin de code plantent.
Alors que celles qu'on affecte à une variable ne plantent pas.

VB:
Sub ElementsDictionnaire()
    Dim NBd As Long, dl As Long
    Dim ShCpt As Worksheet, ShDep As Worksheet
    Dim c As Range, DLib As Object
    Set ShCpt = Worksheets("comptes")
    Set ShDep = Worksheets("Depenses")

    With ShCpt
        NBd = ShCpt.Cells(ShCpt.Rows.Count, 1).End(xlUp).Row
        Set DLib = CreateObject("Scripting.Dictionary") 
        For Each c In .Range("C6:C" & NBd)
        If Not DLib.Exists(c.Value) Then DLib.Add c.Value, c.Offset(, 1)
        Next c
    End With
'lignes ci-dessous fonctionnent bien
k = DLib.keys
i = DLib.items
For n = 0 To DLib.Count - 1
MsgBox k(n) & ", " & i(n)
Next n

'lignes ci-dessous plantent
For n = 0 To DLib.Count - 1
MsgBox DLib.keys(n) & ", " & DLib.items(n)
Next n

End Sub
En vous remerciant beaucoup.:)
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je ne sais pas vraiment pourquoi ça plante, mais c'est peut être aussi bien comme ça.
Un Dictionary ne possède pas les tableaux keys et items. Il est obligé de les reconstituer intégralement chaque fois que ces propriétés en lecture seule sont invoquées. Et c'est une opération relativement longue. J'ai moi même abandonné leur utilisation, dans certains domaines de mes modules de service, justement à cause de ça: leur incapacité à rendre rapidement une clé ou un item d'après sa position.
 

Dranreb

XLDnaute Barbatruc
C'est toujours mieux en effet.
Et mettez Option Explicit en tête de vos modules, et typez convenablement les variables que vous vous obligez ainsi à déclarer. Ça aussi ça peut contribuer à ce que ça ne plante plus.
Mais comme dit, même alors, je le déconseille.
Les Collection, elles, permettent d'accéder positionnellement à un des leurs membres. En revanche elles n'acceptent que des clés String, et ne savent pas les renvoyer, ni toutes ni une.
 

cathodique

XLDnaute Barbatruc
Dranreb:), jpb388:),

Merci pour vos explications, j'apprécie.

Effectivement, comme tu ne proposes, c'est bon ça fonctionne. Mais pourquoi?

Je voudrais bien comprendre comment fonctionne la "bête":D

L'option explicit y est, c'est juste au moment du copier que je ne l'ai pas prise. Merci pour le rappel.

Bon week-end.
 

Dranreb

XLDnaute Barbatruc
J'ai un peu réfléchi.
Votre Scénario: liaison tardive: Travaillant complètement à l'aveugle, le compilateur prépare un code pour la recherche et l'exécution d'une méthode nommée "Key" dans un objet de nature totalement inconnue supposée admettre un paramètre, n en l'occurrence. Ça plante à l'exécution parce que la méthode n'admet aucun paramètre.
Le bon scénario: liaison anticipée: le compilateur trouve tout de suite que la méthode Keys d'un objet Dictionary n'admet aucun paramètre mais renvoie un tableau et en déduit les instructions adéquates pour considérer n comme un indice dans ce tableau !
 
Dernière édition:

klin89

XLDnaute Accro
Bonjour à tous, :)

remplace :
VB:
'lignes ci-dessous plantent
For n = 0 To DLib.Count - 1
    MsgBox DLib.keys(n) & ", " & DLib.items(n)
Next n
par ceci :
VB:
For n = 0 To DLib.Count - 1
        MsgBox DLib.keys()(n) & ", " & DLib.items()(n)
Next n
klin89
 

cathodique

XLDnaute Barbatruc
Dranreb:), comme à d'habitude tes interventions sont très pertinentes. Merci beaucoup pour tes explications et ton aide.

Klin89:):D, un grand merci pour ton partage de tes compétences. Là, il me reviens que j'avais déjà vu cette notation, sur une discussion à laquelle tu avais répondu. Que je n'avais hélas, pas retenu.

Merci à vous de m'avoir éclairé, j'apprécie vraiment.

Bonne soirée.
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

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