XL 2016 [Résolu] Dictionnaire de variable de type structure

pyfux

XLDnaute Occasionnel
Bonjour,

Je souhaite créer un dictionnaire contenant des variables de type structure:

Code:
Public Type typTypeValeur
     Code As String
     Desc As String
End Type

Public goTypeValeur As Dictionary

Puis pour l'alimentation:

Code:
With Worksheets("Dico_New")
     llRow = 3
     Do While Trim(.Range("P" & llRow).Value) <> ""
         
          Dim UnTypeValeur As typTypeValeur
          UnTypeValeur.Code = Trim(.Range("P" & llRow).Value)
          UnTypeValeur.Desc = Trim(.Range("Q" & llRow).Value)
         
          Call goTypeValeur.Add(UnTypeValeur.Code, UnTypeValeur)
         
          llRow = llRow + 1
     Loop
End With

Le problème c'est que la compilation de ce dernier bout de code indique:

Seuls les types définis par l'utilisateur et qui sont définis dans les modules d'objets publics peuvent être convertis depuis ou vers un variant.

Tout ce code est dans un module, les types et le dictionary sont en Public...

J'en conclus que je dois mettre tous ça dans un module de classe ! ????
Please help!
 

Dranreb

XLDnaute Barbatruc
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.
 
Dernière édition:

pyfux

XLDnaute Occasionnel
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!
 

mromain

XLDnaute Barbatruc
Bonjour pyfux, Lone-wolf, Dranreb, le forum


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

A+
 

Dranreb

XLDnaute Barbatruc
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.
 

pyfux

XLDnaute Occasionnel
Bonjour pyfux, Lone-wolf, Dranreb, le forum


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

A+
 

pyfux

XLDnaute Occasionnel
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.
 

Dranreb

XLDnaute Barbatruc
pas raconté que dans ma structure j'ai un array
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.
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 082
Messages
2 085 170
Membres
102 805
dernier inscrit
emes