Bonjour.
Quel problème ça vous poserait d'y ranger simplement des .Range("P:Q").Rows(llRow).Value ?
Ou à la rigueur des Array(Trim(TDon(L, 1)), Trim(TDon(L, 2))) si vous chargiez préalablement dans ce tableau dynamique TDon() la valeur de toute votre plage.
Bonjour.
Quel problème ça vous poserait d'y ranger simplement des .Range("P:Q").Rows(llRow).Value ?
Ou à la rigueur des Array(Trim(TDon(L, 1)), Trim(TDon(L, 2))) si vous chargiez préalablement dans ce tableau dynamique TDon() la valeur de toute votre plage.
Au final, je n'ai pas utilisé un dictionary mais un array.
Le problème c'est lorsque je souhaite accéder à un élément, je dois faire une boucle de parcours.
L'avantage du dictionary est que l'accès est direct via la clef.
Mon problème est vraiment important, j'aimerais avoir une solution car c'est un besoin assez classique d'accéder à une données (de type structure) via une clef.
Des curieux souhaitent creuser ce problème?
Merci d'avance!
Tu ne pourras pas ajouter des élément d’un type personnalisé dans un dictionnaire.
Une solution serait d’utiliser un module de classe pour définir tes "données structurées".
Voici par exemple un module de classe Cls_Valeur :
Code:
Option Explicit
'** Private members declaration *******************************
Private m_s_code As String
Private m_s_description As String
'**************************************************************
'** Properties definition *************************************
Public Property Let Code(p_s_code As String)
m_s_code = p_s_code
End Property
Public Property Get Code() As String
Code = m_s_code
End Property
Public Property Let Description(p_s_description As String)
m_s_description = p_s_description
End Property
Public Property Get Description() As String
Description = m_s_description
End Property
'**************************************************************
Et un exemple de stockage dans un dictionnaire :
Code:
Sub test()
Dim l_o_dico As Object 'Scripting.Dictionary
Dim l_o_unTypeDeValeur As Cls_Valeur
Dim l_l_i As Long
Set l_o_dico = CreateObject("Scripting.Dictionary")
For l_l_i = 1 To 3
Set l_o_unTypeDeValeur = New Cls_Valeur
l_o_unTypeDeValeur.Code = "Code " & CStr(l_l_i)
l_o_unTypeDeValeur.Description = "Description " & CStr(l_l_i)
l_o_dico.Add l_o_unTypeDeValeur.Code, l_o_unTypeDeValeur
Next l_l_i
End Sub
Joignez un modèle anonymisé de votre classeur, qu'on y voie plus clair.
Il faut utilisez un Dictionary, on peut y ranger toutes sortes de chose sauf un type structuré.
Ce n'est quand même pas difficile de transformer un enregistrement type structuré en quelque chose d'accepté par un Dictionary
Meme un objet irait, alors si vous y tenez définissez une classe plutôt qu'un type structuré, mais à on avis un Array à deux élément ferait largement l'affaire.
Remarque: si vous avez déjà constitué votre tableau, vous pouvez aussi juste en ranger les numéros de lignes dans le Dictionary.
Tu ne pourras pas ajouter des élément d’un type personnalisé dans un dictionnaire.
Une solution serait d’utiliser un module de classe pour définir tes "données structurées".
Voici par exemple un module de classe Cls_Valeur :
Code:
Option Explicit
'** Private members declaration *******************************
Private m_s_code As String
Private m_s_description As String
'**************************************************************
'** Properties definition *************************************
Public Property Let Code(p_s_code As String)
m_s_code = p_s_code
End Property
Public Property Get Code() As String
Code = m_s_code
End Property
Public Property Let Description(p_s_description As String)
m_s_description = p_s_description
End Property
Public Property Get Description() As String
Description = m_s_description
End Property
'**************************************************************
Et un exemple de stockage dans un dictionnaire :
Code:
Sub test()
Dim l_o_dico As Object 'Scripting.Dictionary
Dim l_o_unTypeDeValeur As Cls_Valeur
Dim l_l_i As Long
Set l_o_dico = CreateObject("Scripting.Dictionary")
For l_l_i = 1 To 3
Set l_o_unTypeDeValeur = New Cls_Valeur
l_o_unTypeDeValeur.Code = "Code " & CStr(l_l_i)
l_o_unTypeDeValeur.Description = "Description " & CStr(l_l_i)
l_o_dico.Add l_o_unTypeDeValeur.Code, l_o_unTypeDeValeur
Next l_l_i
End Sub
Joignez un modèle anonymisé de votre classeur, qu'on y voie plus clair.
Il faut utilisez un Dictionary, on peut y ranger toutes sortes de chose sauf un type structuré.
Ce n'est quand même pas difficile de transformer un enregistrement type structuré en quelque chose d'accepté par un Dictionary
Meme un objet irait, alors si vous y tenez définissez une classe plutôt qu'un type structuré, mais à on avis un Array à deux élément ferait largement l'affaire.
Remarque: si vous avez déjà constitué votre tableau, vous pouvez aussi juste en ranger les numéros de lignes dans le Dictionary.
Bonsoir Dandreb,
J'ai pour habitude d'utiliser les structures pour regrouper en mémoire des données qui devraient se trouver dans une vraie base de données (et pas dans Excel) si mon employeur voulait faire les choses correctement.
La question portait sur l'enregistrement d'une variable de type structure dans un dictionnaire. (Je ne vous ai pas raconté que dans ma structure j'ai un array ou potentiellement un autre dictionnaire... c'est mon problème)
Contourner le problème, ce n'est pas le résoudre. Après, je ne suis pas borné, si ce n'est pas possible, je mettrais mes données dans des classes.
Merci pour votre participation.
Bonne soirée.
Je n'ai jamais dit que vous aviez raconté ça.
Je dit seulement qu'un Type possède plusieurs champs dans un certain ordre, et un Array à une dimension aussi, ses éléments étant accédés par leur numéro d'ordre. Rien de plus facile donc de convertir une variable de votre Type en Array et vice versa. l'Array, lui, peut être rangé comme Item d'un Dictionary, c'est tout. Si vous ne voulez pas le voir dans votre procédure applicative, écrivez des petites procédures Property Let et Get qui s'occupent de la conversion.
Construite avec l'objet Dictionary, elle permet d'accéder directement (rapidement) à un engistrement par une clé. Elle peut remplacer avantageusement des tableaux de taille importante. Les ajouts et suppressions sont plus faciles à gérer que dans un tableau classique.