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
Re @Dranreb

j'ai trouver c'est bon


VB:
Option Explicit

Sub test()
    Dim a, b, c
    a = "Lettre A"
    b = "Lettre B"
    c = "Lettre C"
  
    ' A l'endroit = "Lettre A" / "Lettre B" / "Lettre C"
    Étalage("a", "b", "c") = Étalage(a, b, c)
    MsgBox "a = """ & a & """, b = """ & b & """, c = """ & c & """"
  
    ' A l'envers = "a" / "b" / "c"
    Étalage(a, b, c) = Étalage("a", "b", "c")
    MsgBox "a = """ & a & """, b = """ & b & """, c = """ & c & """"
  
End Sub

Property Let Étalage(ParamArray Éléments() As Variant, ByRef VArray As Variant)
Dim N As Integer
    For N = 0 To UBound(Éléments)
        Éléments(N) = VArray(N)
    Next N
End Property

Property Get Étalage(ParamArray Éléments() As Variant) As Variant
    Étalage = Éléments
End Property
 
Dernière édition:

laurent950

XLDnaute Barbatruc
A l'endroit
1697499262687.png


a l'envers
1697499291494.png


Alors la je ne vois pas le code me donne cela ?

Voila ce que je comprend
C'est une procédure qui permet d'affecter les valeurs de plusieurs variables en utilisant une Property Let en fonction de l'ordre dans lequel elles sont appelées.

La Property Let Étalage peut affecter les valeurs aux variables dans l'ordre où elles sont appelées. La Property Get Étalage récupère les valeurs dans le même ordre. Le code fourni fonctionne comme prévu, en fonction de l'ordre dans lequel on appelle les variables.
 

Dranreb

XLDnaute Barbatruc
Oui, donc le code que vous appelez "à l'endroit" n'a rien fait du tout, les variable a, b, c sont simplement restées telles qu'initialisées. Et en affichant "a", "b", "c" elles aurait toujours leurs valeurs constantes : la Let n'aurait pas pu les modifier. La Let ne peut fonctionner à l'envers de la Get qu'avec des variables tandis que la Get peut fonctionner à l'envers de la Let soit avec des variables déjà initialisées soit avec des constantes ou d'autres expressions.
 
Dernière édition:

dysorthographie

XLDnaute Accro
bonjour,
désolé pour le temps passé mais je fouettai mes chats:eek:

on a la facheuse tendance à oublier qu'entre le Let et le Get il y à une variable d'écart!
VB:
Property Let toto(Value)
titi = Value
End Property
Property Get toto()
    toto = titi
End Property

avec passage de paramètres
Code:
Private titi, Dico As Object
Property Let toto(Value)
titi = Value
End Property
Property Get toto()
    toto = titi
End Property
Property Let toto2(a, Value)
    If TypeName(Dico) = "Nothing" Then Set Dico = CreateObject("Scripting.Dictionary")
    Dico(a) = Value
End Property
Property Get toto2(a)
    If TypeName(Dico) = "Nothing" Then Set Dico = CreateObject("Scripting.Dictionary")
    toto2 = Dico(a)
End Property
Sub test()
toto = toto + 1
toto2("a") = toto2("a") + 1

Debug.Print toto, Dico("a")
End Sub
 

laurent950

XLDnaute Barbatruc
on a la facheuse tendance à oublier qu'entre le Let et le Get il y à une variable d'écart!
Bonjour @dysorthographie

Tous d'abord je te remercie vraiment pour ce complément d'information avec le module de classe @dysorthographie ta réponse est vraiment très agréable et cela complète mes connaissances.

j'ai compris le principe par contre dans qu'elle situation utilisé ce genre de process qui sembles assez complexe et pointu ?
tu as peut être utilisé ce cas dans une situation particulière a un moment dans un code ? pour ma part je découvre et je n'en ai pas d'idées ?
 

laurent950

XLDnaute Barbatruc
Re je complète cette astuce avec le module de classe (Let avec Set) et Set

Property Get - utilisée pour récupérer une propriété d'une classe. Permet d'obtenir la valeur d'une propriété scalaire ou d'objet. Vous permet de retourner une valeur de propriété ou une référence de propriété. Agir avant la récupération. Renvoyer une valeur calculée.

Property Let - utilisée pour attribuer une valeur à une propriété d'une classe. Permet de définir la valeur d'une propriété scalaire. Vous permet de définir une nouvelle valeur de propriété. Agir après la définition. Effectuer une validation des données.

Property Set - utilisée pour attribuer un objet à une propriété d'une classe. Permet de définir une référence pour une propriété d'objet.Vous permet de définir une nouvelle référence de propriété.


Module standard(Module1)
VB:
Sub Test()
Dim f As Worksheet
    Set f = ThisWorkbook.Worksheets(ActiveSheet.Name)
Dim r As Range
    Set r = f.Range("A1:E20")
Dim Text As String
    Text = "Une chaîne de caractères"

Dim Stock As New ClasseLetGetSet ' Stock le type d'objet

    Stock.Property_Name = Text
    MsgBox Stock.Property_Name
  
    Set Stock.Property_Name = r
    MsgBox Stock.Property_Name.Address
End Sub

un module de classe(ClasseLetGetSet)
Code:
'Property - Variant
Private vValue As Variant

Property Get Property_Name() As Variant
    If IsObject(field_vValue) Then
        Set Property_Name = vValue
    Else
        Property_Name = vValue
    End If
End Property

' You could use either Let or Set
Property Let Property_Name(vData As Variant)
    vValue = vData
End Property

Property Set Property_Name(vData As Variant)
    Set vValue = vData
End Property

Code:
' Propriété - Collection
Private colValeur As Collection

' Obtenir la valeur de la propriété
Property Get NomDeLaPropriete() As Collection
    Set NomDeLaPropriete = colValeur
End Property

' Vous devriez utiliser Set car Collection est un type de données de référence
' Définir la valeur de la propriété
Property Set NomDeLaPropriete(colDonnees As Collection)
    Set colValeur = colDonnees
End Property

VB:
' Propriété - Objet
Private oValeur As Object

' Obtenir la valeur de la propriété
Property Get NomDeLaPropriete() As Object
    Set NomDeLaPropriete = oValeur
End Property

' Vous devriez utiliser Set car Object est un type de données de référence
' Définir la valeur de la propriété
Property Set NomDeLaPropriete(oDonnees As Object)
    Set oValeur = oDonnees
End Property

Code:
' Propriété - Date
Private dtValeur As Date

' Obtenir la valeur de la propriété
Property Get NomDeLaPropriete() As Date
    NomDeLaPropriete = dtValeur
End Property

' Vous devriez utiliser Let car Date est un type de données de valeur
' Définir la valeur de la propriété
Property Let NomDeLaPropriete(dtDonnees As Date)
    dtValeur = dtDonnees
End Property

Code:
' Propriété - Chaîne
Private sValeur As String

' Obtenir la valeur de la propriété
Property Get NomDeLaPropriete() As String
    NomDeLaPropriete = sValeur
End Property

' Vous devriez utiliser Let car String est un type de données de valeur
' Définir la valeur de la propriété
Property Let NomDeLaPropriete(sDonnees As String)
    sValeur = sDonnees
End Property
 
Dernière édition:

Discussions similaires