XL 2016 Depuis un Module Standard pouvoir Récupérer la Photocopie d'une Classe (dont/Avec) la collection qui est incluse dans le Module de Classe.

laurent950

XLDnaute Barbatruc
Bonjour Le Forum,

J'ai réalisé un Module de classe (CPays) avec une Variable de Type Collection (Coll) qui inclut dans le Module de classe.

Le Principe avec une boucle For je viens Créer une nouvelle instance à chaque itération
de l'objet Pays, dont je me sers pour remplir cette classe.

Je souhaite une fois cette classe remplie consigner cette classe dans la collection qui elle est incluse dans le module de classe.

Par la suite je souhaite appeler cette collection depuis le module standard, car cette collection se trouve dans le module de classe, avec un code pour y retrouver la photocopie de la classe correspondante a ce qui a était précédemment enregistré et remplis !

J'ai réalisé la macro, mais cela ne fonctionne pas.

En Exemple :
j'ai écrit le code, dans la zone de texte sur la Feuil à côté du tableau structurée.
la collection se situe dans le module standard, et cela me renvois les bon résultat.
je souhaite l'inverse la collection dans le module de classe et aucune collection dans le module standard.

Je poste le code qui ne fonctionne pas ci-dessous avec le fichier joint.

Si vous avez l'explication et même la solution je vous remercie car je ne trouve pas la solution après plusieurs recherches ?

Module Standard : Ci-Dessous

VB:
Sub CollectionDansModuleDeClasse()

Dim data As Variant ' ............................................................. 1)
data = Sheets("Collections").ListObjects(1).DataBodyRange.Value2 ' ................ 1)
Dim i As Long ' ................................................................... 1)

Dim PaysGlobal As New ClsPays ' ................................................... 2)

Dim Pays As ClsPays ' ............................................................. 3)

For i = 1 To UBound(data, 1) ' .................................................... 1)
    Set Pays = PaysGlobal.Item(data(i, 1))
    Set Pays = Pays
    Pays.Code = data(i, 1) ' ...................................................... 4)
    Pays.Nom = data(i, 2) ' ....................................................... 4)
    Pays.Capitale = data(i, 3) ' .................................................. 4)
Next i

For i = 1 To UBound(data, 1)
    Set Pays = Pays.TransferCollection(data(i, 1)) ' .............................. Bloque) Un seule Item est remplis avec mauvais code !
        Debug.Print Pays.Code, Pays.Nom, Pays.Capitale
Next i
End Sub

Module De Classe(ClsPays) : Ci-Dessous

Code:
Private mCode As String
Private mNom As String
Private mCapitale As String
Private mCLn As Collection
'
Property Get Code() As String
    Code = mCode
End Property
Property Let Code(ByVal NewValue As String)
    mCode = NewValue
End Property
'
Property Get Nom() As String
    Nom = mNom
End Property
Property Let Nom(ByVal NewValue As String)
    mNom = NewValue
End Property
'
Property Get Capitale() As String
    Capitale = mCapitale
End Property
Property Let Capitale(ByVal NewValue As String)
    mCapitale = NewValue
End Property
'
Property Get PhtosCopieClassWithKey() As String
    Capitale = mCapitale
End Property
'
Public Function TransferCollection(ByVal NewValue As String) As ClsPays
   Set TransferCollection = mCLn(NewValue)
End Function
Private Sub Class_Initialize()
   Set mCLn = New Collection
   End Sub
Public Function Item(ByVal NewValue As String) As ClsPays
   On Error Resume Next
   Set Item = mCLn(NewValue)
   If Err Then
      Set Item = New ClsPays
      Set Item = Me
      mCLn.Add Item, NewValue
   End If
   End Function
 

Pièces jointes

  • Test Module de classe Inclus Object Collection.xlsm
    31.7 KB · Affichages: 6
Dernière édition:

laurent950

XLDnaute Barbatruc
@Dranreb

Après avoir passé du temps a analyser votre fonction Gigogne je suis arrivé a réalisé cela :

Ensuite j'arrive pas a extraire la collection dans la variable de classe Fixe :
' Le Module de Classe --------->>> Fixe = RubGlobale
' Avec un Module de Classe ---->>> Variable = SsRub

Toute est bien enregistrer dans RubGlobal.
1693148151538.png


J'ai passé du temps pour arrivé jusque ici. j'y suis presque.
 

Pièces jointes

  • TempP0 (Laurent 2).xlsm
    26.5 KB · Affichages: 3

dysorthographie

XLDnaute Accro
bonjour,
dans ton module de class
VB:
Property Get ReturnSsRub() As Collection
    Set ReturnSsRub = CLn
End Property
dans ton code
Code:
' Cela ne fonctionne pas
    Dim SsRub2 As Rubrique
    For Each SsRub In RubGlobale.ReturnSsRub
        Debug.Print SsRub.Code
        Debug.Print SsRub.Nom
        Debug.Print SsRub.Capitale
        For Each SsRub2 In SsRub.ReturnSsRub
            ' Set SsRub = SsRub.Item(SsRub.Code)
            Debug.Print SsRub2.Code
            Debug.Print SsRub2.Nom
            Debug.Print SsRub2.Capitale
        Next
    Next
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Ah, oui, je n'avais pas vu. Moi aussi je dois toujours préciser .Co à mes SsGr pour les explorer. J'aurais bien aimé que ce soit une propriété par défaut, mais il n'y a pas de dispositif simple pour le faire accepter, en tout cas pas pouvant être commandé depuis VBE.
 

laurent950

XLDnaute Barbatruc
@dysorthographie je vous remercie pour ce complément dans le module de classe qui me manquait, pour récupérer la collection de la classe RubGlobale.

Maintenant cela fonctionne parfaitement, cela fonctionne bien pour cette étape de récupération.

Par contre lorsque je suis dans le Module standard, j'ai du fais une boucle qui récupére les codes pays sans doublon dans la collection de la classe RubGlobale.

donc :
si la liste des codes pays et sans doublons, l'intégralité du tableau n'est pas récuperer dans la collection de la variable RubGlobale.

Je sais pas comment récupérer les doublons, les codes qui sont en double, je suis un peux perdu ici.
Dim RubGlobale As New Rubrique ' Module de Classe Fixe avec As New
Dim SsRub As Rubrique ' ......... Module de Classe Recréer par itération dans la boucle.
dans la boucle
Set SsRub = RubGlobale.Item(TSpl)

Si c'est possible de modifier la boucle dans le module standard pour récupérer les codes pays en doublons.

J'avais cette idée
Un Code pays sans doublon = Ranger dans la collection de la RubGlobale
Un Code pays en doublon = ranger dans la sous collection de la RubGlobal (Système Chainé)

Mais c'est complexe pour moi

Merci @dysorthographie pour votre aide précieuse.
 

laurent950

XLDnaute Barbatruc
@Dranreb Merci pour vos codes que vous m'avez offert, j'ai chercher a comprendre se système d'imbrications des classes dans une collection.

J'ai réalisé le code en Poste #61 mais je suis passé a côté de quelques choses, je récupéres les classes qui correspondent au code pays (mais uniquement sans doublons) je ne sais pas récupérer l'intégralité des codes avec les doublons pour tous remplir.
Ah, oui, je n'avais pas vu. Moi aussi je dois toujours préciser .Co à mes SsGr pour les explorer.

@Dranreb Merci pour cette dernière explication en Poste #65

Si vous pouvez me corriger le code en Poste #61 pour tous récupérer avec les doublons ce serait vraiment extra chouette.

Merci
Laurent
 

Dranreb

XLDnaute Barbatruc
Avec ma fonction Gigigne c'est facile: comme il explore les données dans l'ordre des codes pays grâce à l'indexation prélable, if repère facilement les doublons et les met dans un même SsGr jusqu'à ce que le code change.
 

laurent950

XLDnaute Barbatruc
@Dranreb , @dysorthographie

Après Plusieurs test j'ai enfin réussit a sortir quelques choses.
@dysorthographie votre Poste #64 ainsi que le Poste #69 m'a aidé a trouver une solution
@Dranreb Votre Poste #68 m'a aidé aussi ainsi que toutes les explications de vos Postes précédent.

Pour récupérer les codes Pays sans doublon.

Module Standard(Module1)

VB:
Option Explicit
Sub ConcatDésign()
' Extraction des Codes Pays sans Doublons.
   Dim TDon() As Variant ' ......... Récupère le contenu du tableau structuré dans un tableau 2D / TDon().
   Dim LD As Long ' ................ Compteur de la Boucle du TDon().
   Dim TSpl As String ' ............ Code Pays
   Dim RubGlobale As New Rubrique '  Module de Classe Fixe avec As New
   Dim SsRub As Rubrique ' ......... Module de Classe Recréer par itération dans la boucle.
'
' 1) Récupère le contenu du tableau des pays dans un tableau VBA à 2 dimensions
   TDon = Sheets("ModuleDeClasse AvecCollections").ListObjects(1).DataBodyRange.Value2
' 2) Boucle
      For LD = LBound(TDon, 1) To UBound(TDon, 1)
'       3) Code Pays / TSpl
        TSpl = TDon(LD, 1)
'          4) Créer des Modules de classe
'               Fixe     = RubGlobale
'               Variable = SsRub
            Set SsRub = RubGlobale.Item(TSpl)
'                Remplis Le Module de Classe Variable SsRub
                    SsRub.RemplirClasse TDon(LD, 1), TDon(LD, 2), TDon(LD, 3) ' Moi
                    SsRub.Txt = TDon(LD, 1)                                   ' ?
'               Ps : J'ai laisser cela = SsRub.Txt = TDon(LD, 1)
      Next LD
'
'     Pour Récupérer la collection :
'     Qui se trouve dans :
'     Le Module de Classe --------->>> Fixe = RubGlobale
'     Avec un Module de Classe ---->>> Variable = SsRub
      For Each SsRub In RubGlobale.ReturnSsRub
            Debug.Print SsRub.Code & " | ", SsRub.Nom & " | ", SsRub.Capitale
      Next SsRub
   End Sub

Le Module de Classe(Rubrique)
Code:
Option Explicit
Private LaParente As Rubrique
Private LesChapitres As String
Private LeTexte As String
Private mCode As String
Private mNom As String
Private mCapitale As String
Private mCLn As Collection
Private Sub Class_Initialize()
   Set mCLn = New Collection
   End Sub
Public Sub Init(ByVal Owner As Rubrique, ByVal Chapitres As String)
   Set LaParente = Owner
   LesChapitres = Chapitres ' Le Code Pays
   LeTexte = "?"
   End Sub
Public Function Item(ByVal Rub As String) As Rubrique
   On Error Resume Next
   Set Item = mCLn(Rub)
   If Err Then
      Set Item = New Rubrique
      Item.Init Me, Rub
      mCLn.Add Item, Rub
    End If
   End Function
'
Function Parent() As Rubrique
   Set Parent = LaParente
   End Function
Function Chapitres() As String
   Chapitres = Mid$(LesChapitres, 2)
   End Function
Dranreb
Property Let Txt(ByVal Texte As String)
   LeTexte = Texte
   End Property
Property Get Txt() As String
   Txt = LeTexte
   End Property
Public Sub RemplirClasse(ParamArray Ecrt() As Variant)
   mCode = Ecrt(0)
   mNom = Ecrt(1)
   mCapitale = Ecrt(2)
End Sub
' **************************************************************************************
' **************************************************************************************
' **************************************************************************************

Property Get ReturnSsRub() As Collection
    Set ReturnSsRub = mCLn
End Property
' **************************************************************************************
' **************************************************************************************
' **************************************************************************************

Property Get Code() As String
' Renvoi la valeur actuelle
   Code = mCode
End Property
Property Let Code(ByVal NewValue As String)
' Mise à jour de la valeur
   mCode = NewValue
End Property
'
Property Get Nom() As String
' Renvoi la valeur actuelle
   Nom = mNom
End Property
Property Let Nom(ByVal NewValue As String)
' Mise à jour de la valeur
   mNom = NewValue
End Property
'
Property Get Capitale() As String
' Renvoi la valeur actuelle
   Capitale = mCapitale
End Property

1693159931739.png
 

Pièces jointes

  • Sans Doublon Code Pays Module de classe Inclus Object Collection.xlsm
    50.7 KB · Affichages: 3
Dernière édition:

laurent950

XLDnaute Barbatruc
Pour récupérer les codes Pays Avec doublon.
La clé est changer avec celui de la ville
TSpl = TDon(LD, 3) ' Ville
Set SsRub = SsRub.Item(TSpl)

Module Standard(Module1)

Code:
Option Explicit
Sub ConcatDésign()
   Dim TDon() As Variant ' ......... Récupère le contenu du tableau structuré dans un tableau 2D / TDon().
   Dim LD As Long ' ................ Compteur de la Boucle du TDon().
   Dim TSpl As String ' ............ Code Pays
   Dim RubGlobale As New Rubrique '  Module de Classe Fixe avec As New
   Dim SsRub As Rubrique ' ......... Module de Classe Recréer par itération dans la boucle.
 
' 1) Récupère le contenu du tableau des pays dans un tableau VBA à 2 dimensions
   TDon = Sheets("ModuleDeClasse AvecCollections").ListObjects(1).DataBodyRange.Value2
' 2) Boucle
      For LD = LBound(TDon, 1) To UBound(TDon, 1)
'       3) Code Pays / TSpl
        TSpl = TDon(LD, 1)
'          4) Créer des Modules de classe
'               Fixe     = RubGlobale
'               Variable = SsRub
            Set SsRub = RubGlobale.Item(TSpl)
                TSpl = TDon(LD, 3) ' Ville
                Set SsRub = SsRub.Item(TSpl)
'                Remplis Le Module de Classe Variable SsRub
                    SsRub.RemplirClasse TDon(LD, 1), TDon(LD, 2), TDon(LD, 3) ' Moi
                    SsRub.Txt = TDon(LD, 1)
                    TSpl = Empty
'               Ps : J'ai laisser cela = SsRub.Txt = TDon(LD, 1)
      Next LD

'     Ici Je cherche a récupérer la collection :
'     Qui se trouve dans :
'     Le Module de Classe --------->>> Fixe = RubGlobale
'     Avec un Module de Classe ---->>> Variable = SsRub
   
' Moi
Dim SsRub2 As Rubrique
      For Each SsRub In RubGlobale.ReturnSsRub
        For Each SsRub2 In SsRub.ReturnSsRub
            Debug.Print SsRub2.Code & " | ", SsRub2.Nom & " | ", SsRub2.Capitale
        Next SsRub2
      Next SsRub
   End Sub

Module de Classe(ModuleDeClasse AvecCollections)

Code:
Option Explicit
Private LaParente As Rubrique
Private LesChapitres As String
Private LeTexte As String
Private mCode As String
Private mNom As String
Private mCapitale As String
Private mCLn As Collection
Private Sub Class_Initialize()
   Set mCLn = New Collection
   End Sub
Public Sub Init(ByVal Owner As Rubrique, ByVal Chapitres As String)
   Set LaParente = Owner
   LesChapitres = Chapitres ' Le Code Pays
   LeTexte = "?"
   End Sub
Public Function Item(ByVal Rub As String) As Rubrique
   On Error Resume Next
   Set Item = mCLn(Rub)
   If Err Then
      Set Item = New Rubrique
      Item.Init Me, Rub
      mCLn.Add Item, Rub
    End If
   End Function
'
Function Parent() As Rubrique
   Set Parent = LaParente
   End Function
Function Chapitres() As String
   Chapitres = Mid$(LesChapitres, 2)
   End Function
Dranreb
Property Let Txt(ByVal Texte As String)
   LeTexte = Texte
   End Property
Property Get Txt() As String
   Txt = LeTexte
   End Property
Public Sub RemplirClasse(ParamArray Ecrt() As Variant)
   mCode = Ecrt(0)
   mNom = Ecrt(1)
   mCapitale = Ecrt(2)
End Sub
' **************************************************************************************
' **************************************************************************************
' **************************************************************************************

Property Get ReturnSsRub() As Collection
    Set ReturnSsRub = mCLn
End Property
' **************************************************************************************
' **************************************************************************************
' **************************************************************************************

Property Get Code() As String
' Renvoi la valeur actuelle
   Code = mCode
End Property
Property Let Code(ByVal NewValue As String)
' Mise à jour de la valeur
   mCode = NewValue
End Property
'
Property Get Nom() As String
' Renvoi la valeur actuelle
   Nom = mNom
End Property
Property Let Nom(ByVal NewValue As String)
' Mise à jour de la valeur
   mNom = NewValue
End Property
'
Property Get Capitale() As String
' Renvoi la valeur actuelle
   Capitale = mCapitale
End Property

1693159862996.png
 

Pièces jointes

  • Avec Doublon Code Pays Module de classe Inclus Object Collection.xlsm
    58.3 KB · Affichages: 4
Dernière édition:

laurent950

XLDnaute Barbatruc
Bonsoir @dysorthographie

Merci pour ce code, j'ai essayé mais il y a une classe qu'il me manque.
Je pense que c'est cette classe :
'La classe "system.collections.sortedlist" qui est absente
VB:
Private Sub Class_Initialize()
Set ColPays = CreateObject("System.Collections.SortedList")
End Sub

Par contre ici.
Le For Commence plus a 1 car l'en-tête du tableau structuré n'est pas pris en compte.
Code:
With [Tableau134] ' Tableau Structuré
    For i = 1 To .Rows.Count '
        Debug.Print .Cells(i, "A"), .Cells(i, "B"), .Cells(i, "C")
        CCCP.Add .Cells(i, "A"), .Cells(i, "B"), .Cells(i, "C")
    Next
End With

Pour comprendre cela car la macro c'est arrêté a l'initialisation.
CCCP.Add .Cells(i, "A"), .Cells(i, "B"), .Cells(i, "C")
C'est un système chainé comme expliqué plus haut avec exemple dans vos Poste ?

Encore Merci pour ce code @dysorthographie
 

dysorthographie

XLDnaute Accro
Bonsoir,
CreateObject("System.Collections.SortedList") fait parti d'un frawork VB.net qui de nos jours est très souvent installé.

Je ne vais pas te demander de télécharger et installer ce framework

SortedList permet de trier de façons alphabétique les clés de la collection. C'est comme les dictionary mais trié.
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
315 087
Messages
2 116 083
Membres
112 654
dernier inscrit
SADIKA