XL 2010 Variable Tableau Module de Classe vers Module Standard

laurent950

XLDnaute Accro
Bonsoir,
Difficulté selon que l'ont type la variable tableau dans le module de classe à renvoyer dans le module standard :
Exemple avec 3 cas dont 1 qui fonctionne pas ?

VB:
J’essaie de faire passer une (variable tableau de type Double privé) d’un module de classe vers un module standard.

Pour exemple : J’ai fait avec 3 cas différents pour le renvoi avec la lecture GET du module de classe.

Cas N° 1 Fonctionne  Typé  Double :   Public Property Get TabDone()

Cas N° 2 Fonctionne Pas  Typé Double :  Public Property Get TabDone() as Double

Cas N° 3 Fonctionne   Typé Variant :  Public Property Get TabDone() as Variant


J’ai créé une table de multiplication pour le teste. Cette variable tableau privé du module de classe est remplis avec sa procédure :
             - result  qui se trouve dans le GET.

La procédure :  result  Remplis cette variable tableau Typé Double selon le Cas N°1 et N°2 ou Variant selon le cas N°3

1 - un module standard simple avec :

-  Une variable Tableau

-  La variable du Module de classe soit : resT

-  Et une fonction de lecture du module de classe Get : TabDone

-  La fonction qui renvois ce que je récupère du module de classe vers ma variable tableau :
               - TabCalcul = resT.TabDone

2 – Le module de classe est composé :

-  La propriété de lecture GET (Cas N°1 et N°2 en Double) et (Cas N°3 en Variant)

-   La procédure qui remplit la variable tableau vers le module de classe : result

-  J’ai donc testé 3 cas :

-  Les Cas N°1 et N°3 Fonctionne Bien (Mais La propriété de lecture Get est écrite de deux façon différente en fonction du type de la (variable Tableau privé) suivant qu’elle est Typé Double ou Variant.

La question est la suivante pourquoi Le cas N° 2 ne Fonctionne pas pour cette variable tableau qui est Typé en double ?

Voir Cas N°3 Fonctionne très bien en Variant Mais Non compatible Pour le Type Double Cas N°2

Lorsque cette Variable est différente de Variant écrire comme l’exemple du cas N°1 ?

Y a-t-il une explication (Bien que je pense que le faite de pas noté le type de renvois pour le Cas N°1 doit être par Default de Type Variant ? mais j’en suis pas sur.

Merci à ceux qui auront la réponse à mon interrogation ?

Cas N° 1
Module standard : Test_Double_Fonctionne
VB:
Sub TestVarTabModuleDeClasse()
' Cas N° 1 Fonctionne avec l'ecriture du GET non Typé lors du renvois.
' -------------------------------------------------------------------
' Création du variable tableau de Type Double avec statut privé dans le Module de classe "CalqueCulatrice"
'       -----> Private mTabCalcul() As Double
' Puis renvois de cette variable Tableau dans le Module standard :
'      ------> Test_Double_Fonctionne
' Reception du resultat au moyen de la lecture du module de classe GET
'      ------> TabCalcul = resT.TabDone
' Fonctionne écrit ainsi.
' Public Property Get TabDone()
'      ------> Normalement l'écriture doit se faire ainsi :
'              -----------> Public Property Get TabDone() as Double
' Mais cela ne fonctionne avec cette écriture

' 1)
' Module de classe CalqueCulatrice
Dim resT As CalqueCulatrice
    ' resT Variable Typé Module du module de classe "CalqueCulatrice"
        Set resT = New CalqueCulatrice

' 2)
' Variable tableau Typé Double
Dim TabCalcul() As Double

' 3)
' TabCalcul (Tableau 2 D de type Double)
' Variable de lecture privé de la classe "Get TabDone" Typé en Renvois Double.
    TabCalcul = resT.TabDone

' 4)
' Copie dans la Feuille le résultat du tableau.
    Cells(4, 2).Resize(UBound(TabCalcul, 1), UBound(TabCalcul, 2)) = TabCalcul
End Sub

Cas N° 1
Module de classe : CalqueCulatrice
VB:
Private mTabCalcul() As Double
Public Property Get TabDone()
' Devrais être écrit ainsi : Public Property Get TabDone() as double (Mais Fonctionne pas) Voir Cas N°2
' ------------------------------------------------------------------------------------------------------
' Procedure qui remplis la variable tableau : mTabCalcul
    result

' Renvois du resultat du tableau "mTabCalcul" dans le module standard
    TabDone = mTabCalcul
End Property
Private Sub result()

' Dimension de la variable tableau 2 D Privé au module de classe "mTabCalcul".
    ReDim Preserve mTabCalcul(1 To 10, 1 To 10)

' Boucle pour les calcule des resultats stocké dans de la variable tableau 2 D Privé au module de classe "mTabCalcul".
    For i = LBound(mTabCalcul, 1) To UBound(mTabCalcul, 1)
        For j = LBound(mTabCalcul, 2) To UBound(mTabCalcul, 2)
            mTabCalcul(i, j) = i * j
        Next j
    Next i
   End Sub

Cas N° 2
Module de classe : CalqueCulatrice
VB:
Private mTabCalcul() As Double
Public Property Get TabDone() As Double
' Devrais être écrit ainsi : Public Property Get TabDone() (Fonctionne) Voir Cas N°1
' ----------------------------------------------------------------------------------
' Procedure
    result
' Renvois du resultat du tableau "mTabCalcul" dans le module standard
    TabDone = mTabCalcul
End Property
Private Sub result()

' Dimension de la variable tableau 2 D Privé au module de classe "mTabCalcul".
    ReDim Preserve mTabCalcul(1 To 10, 1 To 10)

' Boucle pour les calcule des resultats stocké dans de la variable tableau 2 D Privé au module de classe "mTabCalcul".
    For i = LBound(mTabCalcul, 1) To UBound(mTabCalcul, 1)
        For j = LBound(mTabCalcul, 2) To UBound(mTabCalcul, 2)
            mTabCalcul(i, j) = i * j
        Next j
    Next i
   End Sub

Cas N° 3
Module de classe : CalqueCulatrice
VB:
Private mTabCalcul() As Variant
Public Property Get TabDone() As Variant
' Devrais être écrit ainsi : Public Property Get TabDone() as Double (Fonctionne Pas Typé Double) Voir Cas N°2
' -------------------------------------------------------------------------------------------------------
' Devrais être écrit ainsi : Public Property Get TabDone() (Fonctionne Pas Typé Double) Voir Cas N°1
' -------------------------------------------------------------------------------------------------------
' Procedure
    result
' Renvois du resultat du tableau "mTabCalcul" dans le module standard
    TabDone = mTabCalcul
End Property
Private Sub result()

' Dimension de la variable tableau 2 D Privé au module de classe "mTabCalcul".
    ReDim Preserve mTabCalcul(1 To 10, 1 To 10)

' Boucle pour les calcule des resultats stocké dans de la variable tableau 2 D Privé au module de classe "mTabCalcul".
    For i = LBound(mTabCalcul, 1) To UBound(mTabCalcul, 1)
        For j = LBound(mTabCalcul, 2) To UBound(mTabCalcul, 2)
            mTabCalcul(i, j) = i * j
        Next j
    Next i
End Sub

laurent
 

Pièces jointes

  • Cas 1_Focnctionne_Avec_Double_VarTabModuleDeClasse.xlsm
    26.9 KB · Affichages: 29
  • Cas 2_FocnctionnePas_Avec_Double_VarTabModuleDeClasse.xlsm
    26.6 KB · Affichages: 17
  • Cas 3_Focnctionne_Avec_Variant_VarTabModuleDeClasse.xlsm
    26.4 KB · Affichages: 16
Dernière édition:

laurent950

XLDnaute Accro
Bonjour Dranreb,

J'y étais pas mais c'est noté, du coup cela va me permettre de paramétrer correctement mes variables, et j'ai bien compris mon erreur sur le Cas N°2.

J'ai chercher l'information que je n'avais pas trouvé, Je vous remercie encore Dranreb car vous êtes vraiment très fort, je saurais à présent renvoyer une variable tableau sans passer par un Variant.

Liens trouvé à l'instant.
https://docs.microsoft.com/fr-fr/of...ce/user-interface-help/property-get-statement

Laurent
 
Dernière édition:

laurent950

XLDnaute Accro
Bonsoir Dranred,

J'ai beaucoup travaillé sur les Module de classe, j'ai pas encore saisie complètement le polymorphisme et l'implémentation. alors j'ai essayer de créer des variables qui puissent se lire à travers les classes.


VB:
  J'ai fait un fichier exemple que je vais détailler ci-dessous :

      - 1) Soit un classeur Excel : Module Classe  Inter Classe.xlsm

                   a) Se classeur est composé de 2 Feuilles

                                a1) Fourniture 1 (avec une cellule remplis en B6 Fourniture 1)

                                a2) Fourniture 2 (avec une cellule remplis en A1 Fourniture 2)



     - 2) Ce fichier ne sert juste de test composé comme suit : 

                   a) un module standard :

                           il ne sert juste cas instancier :

                                    les deux variables du module de classe
                                        Public Vprojet As New VarIntitProjet
                                        Public ResultInfo As New ResultInfoClasseur
                                        
                                    Puis executer la procedure (Pour les test de lecture de classe à classe)
                                    
                                        Nom du module standard : Module1
                                        ' Variable module de classe public (Transversal au projet)
                                        Public Vprojet As New VarIntitProjet
                                        Public ResultInfo As New ResultInfoClasseur
                                        ' Procedure dans le module standar.
                                        Sub LectureInformation()
                                            ' cappel depuis le module de classe (ResultInfoClasseur)
                                                ResultInfo.execute
                                        End Sub
                                    
                                    
                                    
                    b) le module de classe VarIntitProjet
                            il sert a initialisé les variables
                                dans le test pour utilisé les informations stocké depuis nimporte qu'elle module de classe.
                                        
                                        Nom du module de classe : VarIntitProjet
                                        ' Variable privé au module de classe
                                        ' Le classeur actif ThisWorkbook
                                        Private m_wb As Workbook
                                        ' Les deux feuilles du classeur
                                        Public m_ws1 As Worksheet
                                        Public m_ws2 As Worksheet
                                        ' Tous tableau d'objet Worksheet
                                        Private m_TabFeui(1) As Worksheet
                                        ' Juste un élément du tableau worksheet
                                        Private m_TabCibleFeui(0) As Worksheet

                                        ' Renvois tous le tableau
                                        Property Get TabF() As Worksheet()
                                            TabF = m_TabFeui
                                        End Property

                                        ' Ici doit juste renvoyer un élément du tableau
                                        ' ne fonctionne pas !
                                        Property Let TabFIndic(i As Long)
                                            Set m_TabCibleFeui(i) = m_TabFeui(i)
                                        End Property
                                        'Property Get TabFIndic() As Variant
                                        '    Set TabFIndic(i) = m_TabCibleFeui(i)
                                        'End Property

                                        ' Ici initialisation des variables de la classe.
                                        Private Sub Class_Initialize()
                                            ' La variable du classeur actif ThisWorkbook (Privé)
                                            Set m_wb = ThisWorkbook
                                            ' Les variables pour les 2 Feuilles du classeur (Public)
                                            Set m_ws1 = m_wb.Worksheets("Fourniture 1")
                                            Set m_ws2 = m_wb.Worksheets("Fourniture 2")
                                            ' Le tableau qui est remplis avec les 2 Feuilles du classeur (Privé)
                                            ' Pour info : la lecture se fait en (public) avec
                                            ' Property Get TabF() As Worksheet()
                                            Set m_TabFeui(0) = m_wb.Worksheets("Fourniture 1")
                                            Set m_TabFeui(1) = m_wb.Worksheets("Fourniture 2")
                                        End Sub



                                
                    c) le module de classe ResultInfoClasseur
                            il sert a executer les différentes actions pour récupérer les informations dans l'autres classe.
                            
                            J'ai détaillé dans le code se qui fonctionne et se qui ne fonctionne pas.
                            
                                    Nom du module de classe : ResultInfoClasseur
                                    Private TransferTabFeui() As Worksheet

                                    Sub execute()
                                        ' Fonctionne
                                        ' Lecture directe (Public pour m_ws1 & m_ws2)
                                        MsgBox Vprojet.m_ws1.Name
                                        MsgBox Vprojet.m_ws2.Name
                                        ' ' Fonctionne
                                        ' Transfert de la variable tableau (Privé m_TabFeui vers le tableau privé TransferTabFeui)
                                        ' Property Get TabF() As Worksheet()
                                        TransferTabFeui = Vprojet.TabF
                                        MsgBox TransferTabFeui(0).Name
                                        MsgBox TransferTabFeui(1).Name
                                        
                                        'se dernier point ne fonctionne pas
                                        ' Ne fonctionne pas !
                                        ' Lecture de l'indice pour l'ecture du tableau
                                        'Property Get IndicTabF(i As Long) As Worksheet()
                                        Vprojet.TabFIndic = 0
                                        'MsgBox Vprojet.TabFIndic1(Vprojet.TabFIndic = 0).Name
                                    End Sub
Ps : Impossible de créer une nouvelle discutions, je joint se message à la suite de se que j'avais déjà créer car c'est une suite qui me
semble logique.

Si vous avez cette solution Dranred, je serais ravis.

Je travaille toujours sur cette idée de tableaux a trié depuis une autres classe, j'avance doucement un grand merci si vous arrivé à me dépanner.
l'idée et de récupérer directement la case d'un tableau avec sont idice :
soit : La case 0 du tableau dans le module de classe
le soucis c'est que par exemple 0 est considéré comme un nombre soit Long
et que l'élément de la case est renvoyer comme un objet Workseets
et il y a une incompatibilité de type
Pour : MsgBox Vprojet.TabFIndic1(Vprojet.TabFIndic = 0).Name
Property Let TabFIndic(i As Long)
et
Property Get TabFIndic() As Variant
il y a un soucis que je ne sais pas résoudre ?
cdt
Laurent
 

Pièces jointes

  • Module Classe Inter Classe.xlsm
    22.8 KB · Affichages: 7

Dranreb

XLDnaute Barbatruc
Bonsoir.
Très nébuleuses toutes vos idées, je trouve …
Oui ou non TabFIndic est elle une simple propriété (c'est à dire sans paramètre dans la Get et juste le faux paramètre formel représentant la valeur à lui attribuer dans la Let ou plutôt la Set dans ce cas) ou une méthode (c'est à dire avec un argument, tel qu'un indice, à préciser en premier, aussi bien dans la Get que dans la Set) ?
Dans le dernier cas ces deux procédures seraient cohérentes entre elles :
VB:
Property Set TabFIndic(ByVal I As Long, ByVal Wsh As Worksheet)
   Set m_TabCibleFeui(I) = Wsh
   End Property
Property Get TabFIndic(ByVal I As Long) As Worksheet
   Set TabFIndic = m_TabCibleFeui(I)
   End Property
 
Dernière édition:

laurent950

XLDnaute Accro
Bonjour Dranred,

Je vous remercie pour cette solution que je vais essayer d'intégrer à mon projet. j'y vais pas à pas c'est vrais mais je suis vraiment très content de vous lire et d'ajouter vos solutions à mes programmes. encore une fois un grand merci Dranrerd

cdt
Laurent
 

laurent950

XLDnaute Accro
Bonjour Dranred,

Suite à votre Poste #5 qui m'a donné d'autres idées j'ai fait des test:

J'ai beaucoup détaillé ci-dessous avec un exemple simple, je l'ai aussi fait pour les personnes de se forum et aussi enrichire cette
discution sur les modules de classes (se que j'ai essayé de détaillé au maximum servira peut être à d'autres aussi) et aussi pour
qui m'aidé ci souvent et je vous en remercie Dranred

J'ai donc fait deux fichier :
L'un deux fonctionne mais n'est pas conforme a votre modéle précédement indiqué dans votre poste #5

VB:
       J'ai un message d'erreur excel :
            Boite de dialogue Titre : Microsoft Visual Basic Applications.
                Erreur de compilation:
             
                Les définitions des procédures de propriété pour la même
                propiété sont incohérentes ou contiennent un paramètre
                optionnel ou un ParamArray ou un paramètre final non valide
                dans Property Set.

Si vous savez comment contourné cette erreur, je serais vraiment ravis de découvrir encore
un peux plus des possibilités de VBA et des Module de classe.

VB:
    J'ai J'ai fait deux fichiers :
            1 sur le modéle de votre poste #5 Fichier : V1_LectureEcriture Avec Let et Set en module de classe - Fonctionne Pas.xlsm
                Cela vient de mois car je n'arrive pas a le faire fonctionné malgré mes nombreux test infructueux.
             
            2 sur un test dérivé de Votre poste #5 : V1_LectureEcriture Avec Let et Set en module de classe - Fonctionne.xlsm
                Cela fonctionne, mais c'est dérivé est non conforme à l'explication de votre poste #5
             
             
            L'idée est de pouvoir Ecrire et Lire avec la même variable Property dans le module de classe soit :
                    Public Property Set EcritureTabBd
                    Public Property Let EcritureTabBd
                    Public Property Get EcritureTabBd
                 
            Ma question est la suivante Comment arrivé au bon Resultat en rapport avec votre Poste #5
            J'ai trouvé un cours qui indique que l'ont peux y arrivé comme vous avez expliqué.
                Lien internet :
                        https://tissotemmanuel.developpez.com/articles/vba/modules-de-classe/
                        Paragraphe : IV-A-5. Propriété de type Variant
                 
            Je suis dans l'impossibilité de pouvoir réalisé mon exemple avec cette structure.
         
            Je tiens a vous remercier pour toute cette aide appartoter et votre temps passé Dranred.
         
                 
' ************************************************************************************************************************************************
' ************************************************************************************************************************************************
' ************************************************************************************************************************************************                 
        Donc en Rapport avec ce qui est non Conforme au Poste #5
     
                Et pour y arrivé j'ai utilisé des nom différent : (J'ai détaillé ci-dessous l'enmble des modules)
                    Public Property Set EcritureTabBd
                    Public Property Let EcritureTabBd
                    Public Property Get LectureTabBd
                     
                        J'ai détaillé ci-dessous l'enmble des modules
                        de la feuille du classeur excel : V1_LectureEcriture Avec Let et Set en module de classe - Fonctionne.xlsm
                 
  je me suis inspiré du Let et du Get (et je me suis dit pourquoi pas un Set)

  donc Voici mon idée :

            Créer une variable tableau : pour le test du fichier Excel (2 Lignes et 2 colonnes)
         
            Le contenu de la feuille excel du classeur:
                1 Feuille : Nom de l'onglet = Feuil1
                2 Les cellules A1:D4 = Sont Remplis.
             
            Le test va remplire la variable tableau m_TabStock() : Détaillé dans le programme ci-dessous.
                3 Comment et avec quoi est remplis cette variable tableau : cf ci-dessous
                    ' Explication des Informations à remplir (Pour Test)
                    ' Ligne 0 du tableau :
                    '   Case 0,0                        = Variable Objet : Nom de la Feuille (Variable Objet)
                    '   Case 0,1                        = Variable Natif : Le texte de la cellule A1
                    ' Ligne 1 du tableau :
                    '   Case 1,0                        = Variable Natif : Pour la forme le texte de la cellule D4
                    '   Case 1,1                        = Variable Objet : La plage de la cellule A1:D4
         
    Voila le tableau créer de Type VARIANT :
                Pourquoi VARIANT C'est justement pour utilisé les accesseur :
                       (Let et Set) en Ecriture pour les : Let Variable natif et Set Variable Objet
                       (Get)        en Lecture = Mais aussi bien pour les (Let et Set)
                    
    Donc Pour comprendre se que je veux stocké pour les Tests avec se fichier Excel j'explique ci-dessous :
            Dans le fichier Excel Joint j'ai besoin de stocké : 4 Variables
                    2 Variables Natif (Long Ou String Ou Interger etc.........)
                    2 Variables Objet (Worksheet Ou Range Ou Worksbook etc....)
                 
                 
    Le module standard qui sert à appeler les 2 classes (ci-dessous détaillé)
 
                ' Déclaration des variables des Modules de classes visibles dans tous le projet
                Public StockInformation As New StockInformation
                Public TestRemplir As New TestRemplirTableau

                ' Ce Module de sert à écrire dans des variables tableau depuis des classes
                Sub test()
                    ' Ici Procédure pour Remplire la variable tableau (Avec Let et Get)
                    TestRemplir.EcritureInfoDansTableau
                    ' Ici Procédure pour Lire la variable tableau (Avec Let et Get)
                    TestRemplir.LectureInfoDansTableau
                End Sub
                 
    Donc Je vais faire deux Modules de classe :
            StockInformation :
                  Ce Module de classe contient la variable tableau :
                        m_TabStock() de type privé au module de classe que j'instensie en variant et donc (2 Lignes / 2 colonnes) : cf ci dessous.
                        Private m_TabStock(1, 1) As Variant
                 
                    Toujours : dans ce module
                        La création de deux Fonctions :
                             Celle qui va servire à écrire (Et là justement en Fonctions du (Let ou du Set)
                                Tous dépends de la variable que l'on va affecter à la case du tableau.
                     
                                    Donc les procedures Property : (Ici Obligé d'écrires 2 procedures) pour lécriture.
                                     
                                        ' Ecriture vers une variable Tableau de type Variant (Pour variable Natif)
                                            Public Property Let EcritureTabBd(i As Integer, j As Integer, Var As Variant)
                                                m_TabStock(i, j) = Var
                                            End Property
                                     
                                        ' Ecriture vers une variable Tableau de type Variant (Pour variable Objet)
                                            Public Property Set EcritureTabBd(i As Integer, j As Integer, Var As Variant)
                                                Set m_TabStock(i, j) = Var
                                            End Property
                                         
                            Celle qui va servire à Lire (Et là justement en Fonctions du (Let ou du Set)
                                        ' Lecture depuis une variable Tableau de type Variant (Natif Ou Objet)
                                        ' Avec un test sur cette variable Tableau (Précedement remplis) de son contenu.
                                     
                                        Public Property Get LectureTabBd(ByVal i As Long, ByVal j As Long) As Variant
                                            If IsObject(m_TabStock(i, j)) Then
                                                Set LectureTabBd = m_TabStock(i, j)
                                            Else
                                                LectureTabBd = m_TabStock(i, j)
                                            End If
                                           End Property


            TestRemplirTableau :
                    Ce Module de simple n'a rien de compliqué et ne sert juste à effectuer les tests de la classe (StockInformation)
                            Comment est composé se Module de classe :
                                    Une variable de type privé a la classe
                                            m_FStruct qui va stocké l'adresse du classeur avec ThisWorkbook
                                            Private m_FStruct As Workbook
                                        Donc Pour exemple je me sert de la classe : Class_Initialize()
                                        Pour stocké cette information : cf ci-dessous.

                                            Private Sub Class_Initialize()
                                                Set m_FStruct = ThisWorkbook    ' Mise en mémoire du classeur actif (Celuis de la Macro VBA)
                                            End Sub
                                                                 
                                    Puis la partie intéressente ou je vais stocké les informations dans les différentes cases du tableau.
                                    avec la procedure de la classe : EcritureInfoDansTableau (Cf ci-dessous)
                                  
                                    Alors Pour Info :
                                            Le choix de l'écriture dans la case réservé au tableau se fait avec la classe : StockInformation
                                                Si c'est un Set Ou Si par default C'est un Let :
                                                        Public Property Let EcritureTabBd
                                                                    Ou
                                                        Public Property Set EcritureTabBd
                                         
                                            Sub EcritureInfoDansTableau()
                                                Set StockInformation.EcritureTabBd(0, 0) = m_FStruct.Worksheets(Sheets(1).Name) ' Set car Objet
                                                    StockInformation.EcritureTabBd(0, 1) = Cells(1, 1)                          ' Pas besoin de Set (Variable Natif : Donc Let par default)
                                                    StockInformation.EcritureTabBd(1, 0) = Cells(4, 4)                          ' Pas besoin de Set (Variable Natif : Donc Let par default)
                                                Set StockInformation.EcritureTabBd(1, 1) = Range(Cells(1, 1), Cells(4, 4))      ' Set car Objet
                                            End Sub

                                    Puis la maintenant ce qui est intéressent ces de lires les informations dans les différentes cases du tableau.
                                    avec la procedure de la classe : LectureInfoDansTableau (Cf ci-dessous)                                         
                                         
                                            Le choix de lecture dans la case réservé au tableau se fait avec la classe : StockInformation
                                                Si c'est un Set Ou Si par default C'est un Let :
                                                        Public Property Let LectureTabBd
                                                                    Ou
                                                        Public Property Set LectureTabBd
                 
                                            Sub LectureInfoDansTableau()
                                                MsgBox StockInformation.LectureTabBd(0, 0).Name         ' Set car Objet : Donc choix de la reférence à extraire de l'objet (Ici Nom : .name) Nom onglet
                                                MsgBox StockInformation.LectureTabBd(0, 1)                ' Ici Variable Natif : Donc Texte cellule A1
                                                MsgBox StockInformation.LectureTabBd(1, 0)                ' Ici Variable Natif : Donc Texte cellule D4
                                                MsgBox StockInformation.LectureTabBd(1, 1).Address         Set car Objet : Donc choix de la reférence à extraire de l'objet (Ici Adresse : .Address) A1:D4
                                            End Sub

Cdt
Laurent
 

Pièces jointes

  • V1_LectureEcriture Avec Let et Set en module de classe - Fonctionne.xlsm
    21.2 KB · Affichages: 3
  • V2_LectureEcriture Avec Let et Set en module de classe - Fonctionne Pas.xlsm
    19.3 KB · Affichages: 4

Dranreb

XLDnaute Barbatruc
Bonjour.
Les property Set et Let doivent toujours avoir un argument de plus que la Get correspondante, du même type que ce que celle ci retourne, généralement passé ByVal. À l'utilisation, au lieu de le spécifier comme dernier paramètre, on le met à droite du signe '=' de l'affectation. C'est pourquoi je parle de faux paramètre formel représentant la valeur à lui attribuer.
 

laurent950

XLDnaute Accro
Bonjour Dranred,
C'est se que j'ai fait dans le classeur V2 joint en poste #7

soit : Les property Set et Let doivent toujours avoir un argument de plus (ici 3 arguments)
Set StockInformation.EcritureTabBd(0, 0) = m_FStruct.Worksheets(Sheets(1).Name)
StockInformation.EcritureTabBd(0, 1) = Cells(1, 1)

soit : Les property Get un argument de moins (ici 2 arguments)
MsgBox StockInformation.EcritureTabBd(0, 0).Name
MsgBox StockInformation.EcritureTabBd(0, 1)

Pour :
VB:
Public Property Get EcritureTabBd(ByVal i As Long, ByVal j As Long) As Variant
    If IsObject(m_TabStock(i, j)) Then
        Set EcritureTabBd = m_TabStock(i, j)
    Else
        EcritureTabBd = m_TabStock(i, j)
    End If
   End Property

Public Property Let EcritureTabBd(ByVal i As Integer, ByVal j As Integer, ByVal Var As Variant)
    m_TabStock(i, j) = Var
End Property

Public Property Set EcritureTabBd(ByVal i As Integer, ByVal j As Integer, ByVal Var As Variant)
    Set m_TabStock(i, j) = Var
End Property

C'est donc ici que j'ai pas compris pourquoi cela ne fonctionne pas ? j'y ai passé tellement de temps que peux être je ne vois pas mon erreur
et je but sans justement trouvé ce qui est faux dans cette procedure.

j'ai ajouté ByVal : dans le code : Fichier V2 corrigé en V3 avec ByVal

Vous pouvez me dire ou cela coince Dranred, car franchement je trouve pas ?

je vous remercie pour cette nouvelle explication.

cdt laurent
 

Pièces jointes

  • V3_LectureEcriture Avec Let et Set en module de classe - Fonctionne Pas.xlsm
    19.4 KB · Affichages: 8
Dernière édition:

Dranreb

XLDnaute Barbatruc
Oui mais les autres paramètre ne sont pas du même type que dans la Get ni du même mode de passage. Remarque: je déplore énormément qu'il soit interdit de passer des arguments correspondants ByVal dans la Get et ByRef dans la Let. Mais c'est comme ça. Dans les nouvelles versions de Visual Basic Studio ça ne s'est pas arrangé, c'est pire: il est devenu purement et simplement interdit de passer ByRef les arguments d'une procédure Property Let. Il est donc devenu impossible de faire du 'modifier les paramètres de telle sorte que…' qui était pourtant bien commode. Et j'en ai conclu que ce langage a baissé depuis VB6 …
 

laurent950

XLDnaute Accro
Merci Dranred, Bonjour au Forum,

Et donc en conclusion des Postes #5 à Postes #11

si tous les paramètre sont (Obligatoirement du même type que dans la Get) pour le même mode de passage.
VB:
ps : aussi si j'ai bien compris pour :
               je déplore énormément qu'il soit interdit de passer des arguments correspondants ByVal dans la Get et ByRef dans la Let
                                  Ou Je passe tous en ByVal
                                  Ou je passe tous en ByRef
                                                        Pour la Get / Let / Set  
                                                                        Donc pas de mélanges au même titre que tous mes arguments conforme au Get Variant
                                                                                                     Soit tous mes arguments en Variant pour Get / Let / Set
             Si j'ai bien compris cette fois mes erreurs de types de mes variables (comme les erreurs précédente a ce poste #11)
VB:
  Comme la correction ci-dessous : en fichier corrigé version V4
           - C'est incompréhensible et cela est expliqué nul part :
                         Pourquoi ByVal i As Variant (Sa coince = Message Micrososft) mais ByVal i As Variant (Ca passe)
           - je suis du même avis (mais il y a forcément une raison a ces restrictions) et je ne sais pas ou trouver toutes
             ces astuces sur la toile:
Je vous remercie vraiment Dranred de votre grand savoir et aussi de m'apporter toutes sorte de solutions à mes soucis VBA.
VB:
Public Property Get EcritureTabBd(ByVal i As Variant, ByVal j As Variant) As Variant
If IsObject(m_TabStock(i, j)) Then
Set EcritureTabBd = m_TabStock(i, j)
Else
EcritureTabBd = m_TabStock(i, j)
End If
End Property

Public Property Let EcritureTabBd(ByVal i As Variant, ByVal j As Variant, ByVal Var As Variant)
m_TabStock(i, j) = Var
End Property

Public Property Set EcritureTabBd(ByVal i As Variant, ByVal j As Variant, ByVal Var As Variant)
Set m_TabStock(i, j) = Var
End Property
J'espères que cette discutions assez compléte sur le Let / Set / Get va servir au autre membre du forum

Ps : Si j'ai oublié quelques choses Dranred avec plaisir d'apprendre encore.
Grand Merci a Dranred

Fichier V2 Maintenant conforme au Poste #7 (Donc Fichier V2 Corigé en V4)

cdt
Laurent
 

Pièces jointes

  • V4_LectureEcriture Avec Let et Set en module de classe - Fonctionne Avec Variant.xlsm
    21.5 KB · Affichages: 11
Dernière édition:

laurent950

XLDnaute Accro
Justement : comme cela ça ne fonctionne pas.
Des indices je les mets normalement As Long, pas As Variant, sauf si je veux pouvoir accepter une clé de Dictionary ou queque chose du genre.

VB:
Fichier V3 comme vous me dite en ByVal i As Long (Mais cela ne fonctionne pas)
Fichier V4 comme j'ai modifié en ByVal i As Variant (Bizarrement cela fonctionne)
VB:
C'est pour cela que le fichier V3 du Poste #9 ne fonctionne pas :
                  Public Property Get EcritureTabBd(ByVal i As Long, ByVal j As Long) As Variant
Mais pour le fichier V4 du  poste #11 lui fonctionne
                  Public Property Get EcritureTabBd(ByVal i As Variant, ByVal j As Variant) As Variant

C'est que j'ai fait sur le dernier fichier V4 tous en variant et cela fonctionne Bizzarement !

cdt
Laurent
 

laurent950

XLDnaute Accro
C'est le fichier V3 qui doit être corrigé, mais impossible car je ne suis arrivé juste a faire fonctionné le fichier V4 en passant tous en variant,

Si vous savait faire ce correctif sur le fichier V3 en utilisant ByVal i As Long et faire fonctionné se module je suis preneur car j'y ai passé vraiment du temps et j'y suis pas arrivé autrement que lorsque j'ai tous corrigé en Variant sur la version V4

en faite les deux fichier
V2 et V3 fonctionne pas (Poste #7 = fichier V2 et Poste#9 fichier = V3)

j'ai passé tous en Variant en référence au fichier Poste #11 = V4)

Ps : Je détail pour la cohérence du fils de la discutions pour d'autres qui ont aussi envie d'apprendre et si retrouver dans se fil.

Si vous pouvez corrigé l'un de ces deux fichier pour le faire fonctionné je serais ravis car franchement j'y arrive pas et j'ai fait tellement d'essaie différents que je n'ai plus d'idée (ma dernière celle du fichier V4)

Laurent
 

Discussions similaires

Réponses
29
Affichages
773

Statistiques des forums

Discussions
312 103
Messages
2 085 312
Membres
102 860
dernier inscrit
fredo67