Propriétés d"une classe

sousou

XLDnaute Barbatruc
Bonjour à tous.
Pensez-vous qu'il soit possible de lister (dans une boucle par itération), les propriétés d'une class?
En fait je shouaite faire une procédure qui va remplir les propiétés d'un objet d'une class, et je ne connais pas le nombre de propiétés.

pour faire plus simple il me faudrait quelque chose comme cela:
for each p in maclass.properties
p=une valeur
next

Merci
 

laurent950

XLDnaute Accro
Bonjour Dranred et sousou,

J'ai une question pour Dranred qui est expert en programmation surtout les modules de classe dont j'apprend en se moment.
Ma question est la suivante qu'elle est le liens entre : ( Le constructeur et Le destructeur)
J'ai lu que :

Le constructeur est obligatoirement :
Private Sub class_Initialize()
...
End Sub

Le destructeur :
Private Sub class_Terminate()
...
End Sub

j'ai lu sur ce forum :
https://www.developpez.net/forums/d...ffice/general-vba/constructeur-module-classe/

qu'est ce qui est lié à la construction et destruction pour un module de classe ? je sais pas et surtout pas d'idée.
vous avez un petit exemple avec un fichier excel pour comprendre le principe et surtout l'utilisé par la suite pour un
code propre !


Merci par avance Dranred et peux être que cela pourra aussi servir à sousou (dont je peux aussi aidé si j'ai réponse à ces question bien sûr)
Pour sousou (c'est interressant) : https://sinarf.developpez.com/access/vbaclass/

cdt
Laurent
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Ça ne signifie pas que ces procédures sont obligatoires quand même ! Je n'ai pas souvenance d'en avoir eu besoin.
La Classe_Initialize permet d'initialiser des variables Private ou d'attribuer à certaines propriétés des valeurs initiales différentes de celles par défaut. C'est un rôle très semblable à l'UserForm_Initialize des UserForm.
La Classe_Terminate serait à utiliser pour modifier des éléments externes à l'objet. L'attribution de Nothing à la dernière variable se référant à un exemplaire suffit à simplement libérer les ressources mémoires qu'il utilisait.
 

laurent950

XLDnaute Accro
Ce que j'ai pu comprendre Dranred,
Par exemple en travaillant avec un projet dont ont pourrait utilisé les mêmes données sur toute un projet comme :
Les feuilles, ou des plages dont ont va utilisé souvent ou par exemple des constantes (tous cela commun est réutilisable spécifiques utilisé à tous le projet) nous pouvons alors créer un module de classe spécifique avec constructeur et destructeur ---->>>> est à partir d'autres classes faire appel a ses données (Comme une sorte de Héritage Parents vers Enfants)
Je sais pas si je fais fausse route (mais c'est une idée) cela peut être vrais / il existe une sorte d'héritage de classe en VBA ?
Grand Merci pour vos réponses à mes interrogation Dranred
Laurent
 

Dranreb

XLDnaute Barbatruc
Je ne vous suis guère. Pour utiliser des classes Excel il suffit de variables de leurs types définies avec la portée souhaitée.
Ce qui existe comme notion d'héritage c'est la possibilité de définir une sorte d'objet générique auquel doivent se conformer plusieurs modules de classes différents. Mais c'est peu utilisé à ma connaissance.
Je l'ai cependant mis en application en définissant un objet CAsso (contrôle associé) orchestrant des objets de différent types, car basés sur des contrôles MSForms de différents types. J'ai donc plusieurs variétés de CAsso: CAssoTBx, CAssoCBx, CassoCkx, CassoFrm… qui doivent tous obéir à un standard défini par le module d'interface Casso qui est seul visible coté utilisation.
 

laurent950

XLDnaute Accro
Je l'ai cependant mis en application en définissant un objet CAsso (contrôle associé) orchestrant des objets de différent types, car basés sur des contrôles MSForms de différents types. J'ai donc plusieurs variétés de CAsso: CAssoTBx, CAssoCBx, CassoCkx, CassoFrm… qui doivent tous obéir à un standard défini par le module d'interface Casso qui est seul visible coté utilisation.
C'est en faite un peux ma recherche c'est possible d'avoir votre fichier pour analyse et de décortiquer cette logique afin de mettre en application sur un programme que je construirais, bien sûr si vous êtes d'accord
En attendant je vous remercie pour toutes vos explications et les découvertes que je fais avec vos explication.
 

laurent950

XLDnaute Accro
Un grand merci Dranred,
vous êtes très agréable et d'une grande richesse de savoir. je viens juste voir votre message, vous êtes très réactif et j'étais figés sur la première page et aussi assoupis entre temps. et je découvre votre fichier copieux mais très intéressant.
Il est déjà tard mais je vais regarder demain et vous tenir au courant (Je vais essayer de faire un modèle bien fait et vous l'envoyer) c'est vraiment très riche est bien construit.
Je comprend le code dans l'ensemble en lecture, mais je vais regarder l'assemblage (j'utilise jamais ByRef ou ByVal = surement en tord) mais peux être que set = ByRef et Let = ByVal je vais tous regarder et apprendre et decortiqué
encore une fois Merci Dranred
cdt
Laurent
 

cathodique

XLDnaute Barbatruc
Bonjour,:)

Je voulais juste suivre cette discussion sans y interférer. N'ayant pas compris ce qu'il y a sur l'image jointe. Je m'immisce dans cette discussion pour poser une question à Dranreb. L'objet entouré, c'est quoi et comment le créer. Avec mes remerciements anticipés.
1026105

Bonne journée.;)
 

Dranreb

XLDnaute Barbatruc
Bonjour cathodique.
C'est un objet Worksheet. Le créer à proprement parler, Excel seul y est hablité. On peut seulement lui attribuer un nom mnémonique en changeant sa 1er propriété (Name) dans sa fenêtre de propriétés.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Le mode de transmission d'un argument, c'est une question de lieu de résidence de la donnée transmise vue de la procédure appelée.
ByRef: externe, ByVal: interne.
Le plus souvent, un paramètre de procédure devrait être défini ByVal. Il ne doit être laissé ByRef (option par défaut) que s'il s'agit d'un tableau, ou si la procédure appelante doit spécifier pour ce paramètre non pas une expression mais une variable, et que la procédure appelée est chargée de la modifier durablement.
Remarque: Pour une variable objet, ce qui consiste à la modifier c'est de l'initialiser par un Set, et non pas de changer des propriétés de l'exemplaire qu'elle désigne. Pour ne faire que ça, ByVal convient parfaitement.
Le traitement d'un paramètre laissé ByRef à tort aboutit à du code machine un peu idiot.
1026121

Ces explications concernent seulement les données de tailles fixes. L'accès au contenu proprement dit, toujours alloué en dehors de la pile, des Variant et String est réalisé dans un deuxième temps (voire un troisième, du coup, quand y a des passages ByRef inutiles).
De plus ByVal documente la programmation en indiquant dans l'instruction Sub, Function ou Property qu'il s'agit d'une donnée d'entrée, et que même si la procédure modifiera sa valeur, par simple commodité, ce ne sera pas dans l'intention de modifier le paramètre qui lui aura été transmis. C'est juste une variable de travail interne pourvue par la procédure appelante d'une valeur initiale.
 

cathodique

XLDnaute Barbatruc
Bonjour cathodique.
C'est un objet Worksheet. Le créer à proprement parler, Excel seul y est hablité. On peut seulement lui attribuer un nom mnémonique en changeant sa 1er propriété (Name) dans sa fenêtre de propriétés.
Bonjour Dranreb;),
:eek:Quelle gourde:eek: je suis, ça m'a paru bizarre de voir un truc sous Thisworkbook. Je n'ai pas remarqué la subtilité.
Ton fichier est très intéressant, je l'ai mis en lieu sûr afin de l'étudier quand j'aurai atteint le niveau adéquat.
Merci beaucoup.;)
 

laurent950

XLDnaute Accro
Bonjour Dranred,

Une petite synthèse de ce que j’ai compris :
-----------------------------------------------
  • ByRef et ByVal permettent d’indiquer comment passer des arguments à une procédure (Sub ou Function)
  • Et donc ByRef représente l’option par défaut et peut donc être implicite (c’est pour cela que je ne les utilise jamais « mais je viens de comprendre quelques choses d’intéressant »)
  • (j’ai trouvé deux exemple ByRef et ByVal)
  • ByRef”, implique qu’une référence à l’élément passé à la procédure est conservée, et que cet élément peut être modifié par la fonction
  • ByVal signifie au contraire que lors de la passation d’un argument, celui-ci est évalué, et que seule sa valeur est prise en compte. Il en résulte que l’élément passé à la procédure ne peut être modifié par celle-ci.
VB:
' Dans cet exemple Montant 10 n’est pas modifié avec ByVal (Montant Reste 10 dans Sub Calcul1)               
Sub Calcul1()
Dim Montant As Integer
Montant = 10
Produit1 Montant, 2
MsgBox "Montant = " & Montant, 32
End Sub
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sub Produit1(ByVal Nb As Integer, N As Integer)
Nb = Nb * N
End Sub

VB:
'Dans cet exemple Montant 10 est modifier avec ByRef(Montant Devient 20 dans Sub Calcul2)
Sub Calcul2()
Dim Montant As Integer
Montant = 10
Produit2 Montant, 2
MsgBox "Montant = " & Montant, 32
End Sub
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sub Produit2(ByRef Nb As Integer, n As Integer)
Nb = Nb * n
End Sub

En conclusion :
----------------
2 possibilités, selon le type de la variable
pour une variable de type par valeur (date, nombre, string (malgré qu'il soit objet), ou encore booléen)
avec byval, une copie de la valeur est passée, donc si la sub modifie la valeur, la valeur de l'appelant n'est pas modifié
avec byref, c'est le pointeur de la variable donc, si la sub modifie, la valeur, la valeur de l'appelant est modifiée aussi
byref est utile pour des paramètre des retour

Pour les types objets, c'est à peu près pareil byval passe une copie du pointeur et byref le pointeur
ans les 2 cas, c'est le même objet qui est pointé donc les modifs sont appliqués partout
par contre avec byref, si la sub mets la variable à nothing, l'appelant est aussi mis à nothing
J'espères que je suis dans le juste et que ce que je viens d'écrire est conforme à ce que j'ai compris (via 2 exemples et les sources)
Je viens de comprendre quelques choses d'essentiel.

Je vous remercie encore une fois Dranred.

cdt
Laurent
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
C'est à peu près bien résumé. Pour se fixer les idées, essayer de se faire une idée de ce qui se passe en mémoire.
Dans les deux cas l'appelant doit mettre queque chose dans une zone de la pile, qui contient l'adresse de retour dans le code exécutable de l'appelant, et d'autres zones de service, mais aussi toutes les variables locales de longueurs fixes utilisées en interne par la procédure. ByRef: c'est une adresse qui est mise dans la zone qui est alors une zone de service ne pouvant servir à d'autre fins, ByVal: c'est une valeur, et le statut de la zone est alors très exactement celui d'une variable locale, que l'appelant n'a fait qu'initialiser.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
C'est en faite un peux ma recherche
En fait je crois que non, même si vous avez trouvé quelques réponses dans mes codes, et si j'ai mis du temps à discerner ce que je crois avoir été votre souci.
Alors. Un exemplaire se crée toujours en mettant New devant le nom du type qui est en même temps le nom du module de classe.
Mais cet exemplaire peut bien sûr faire partie d'un ensemble dont le nombre n'est pas prédéfini.
On peut utiliser à souhait selon praticité et gouts une Collection, un Dictionary ou simplement un tableau. Tout ce qui peut contenir des Variant peut aussi contenir des objets.
Il n'y a pas de dispositif particulier (lié de près ou de loin au Class, _Initialize, _Terminate) pour assurer cette gestion d'un ensemble, c'est à la charge du programmeur, à l'aide des moyens d'actions propres à ces différentes formes d'ensembles.
 
Dernière édition:

laurent950

XLDnaute Accro
Bonjour Dranred,
Je n'etais pas a mon ordinateur aujourd'hui mais je lis tous vos message et je prend le temps de les comprendre. Je vais essayer d'étudier les classes. Pour l'instant je vais essayé de comprendre avec des petits exemple simple comme celui que j ai poster avec ByRef et ByVal. J'apprends vite et je mettrai en application une classe complète je vais la poster je vais avoir un peux de temps vendredi.
Dranred je vous remercie et vous êtes vraiment interressant avec une grande culture et maitrise du langage programmation.
Grand grand merci Dranred

Intéressant de comprendre ByRef et ByVal
Exemple :
VB:
Function TestByRef(ByRef Num1 As Integer, ByRef Num2 As Integer)
Num1 = Num1 + Num2
TestByRef = Num1
MsgBox "Intérieur Fonction TestByRef - Résultat : " & _
TestByRef, , "Résultat n° 1"
End Function

VB:
Function TestByVal(ByVal Num1 As Integer, ByVal Num2 As Integer)
Num1 = Num1 + Num2
TestByVal = Num1
MsgBox "Intérieur Fonction TestByVal - Résultat : " & _
TestByVal, , "Résultat n° 2"
End Function

VB:
Public Sub TestArg()
'La procédure ci-après lance les deux fonctions dans les mêmes conditions. Comparez les
'résultats dans les boîtes de dialogue.
' *****************************************************************
' ByRef intN1 Modifier = Valeur 55
Dim intN1 As Integer
Dim intN2 As Integer
intN1 = 22: intN2 = 33
tot1 = TestByRef(intN1, intN2)
MsgBox "Après Fonction ByRef : " & intN1 & " + " & intN2 & _
" = " & tot1, , "Résultat n° 3"
' *****************************************************************
' ByVal intN1 Non Modifier = Valeur 22
intN1 = 22: intN2 = 33
tot1 = TestByVal(intN1, intN2)
MsgBox "Après Fonction ByVal : " & intN1 & " + " & intN2 & _
" = " & tot1, , "Résultat n° 4"
tot1 = TestByVal(22, 33)
MsgBox "Après Fonction ByVal par valeurs directes: 22 + 33 =" _
& tot1, , "Résultat n° 5"
End Sub

Laurent
 
Dernière édition:

Discussions similaires

Réponses
3
Affichages
316
Réponses
2
Affichages
546

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16