Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Général VBA
Général VBA Forum général VBA . Pour les logiciels spécifiques (Access, Excel, Word, ...), postez dans les bons sous forums.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/04/2011, 19h07   #1
Futur Membre du Club
 
Grégory MARTIN
Inscription : mars 2010
Messages : 72
Détails du profil
Informations personnelles :
Nom : Grégory MARTIN

Informations forums :
Inscription : mars 2010
Messages : 72
Points : 17
Points : 17
Par défaut VBA ClassModule et Default Member

Bonjour,

Soit mon module de classe appelé Class1 :

Code :
1
2
3
4
5
6
7
Private sText As String
Public Property Get Text() As String
    Text = sText
End Property
Public Property Let Text(txt as String)
    sText = txt
End Property
Quelles seraient les modifications à apporter au code pour que Text (Get) soit le default member ? Et ainsi pouvoir écrire :

Code :
1
2
3
4
5
Sub test()
    Dim o as New Class1
    o.Text = "hey"
    MsgBox o
End Sub
Ce qui donnerait le même résultat que :
Code :
1
2
3
Sub test2()
    MsgBox "hey"
End Sub
Bien entendu, il s'agit d'un projet plus complexe: si j'avais une Class2 je voudrais mettre des objets Class1 et Class2 dans une seule Collection et pouvoir faire une sorte de polymorphisme avec une default property (un peu comme toString() en java) qui me permettrait d'écrire les éléments de la collection dans un fichier plat.

J'ignore si c'est possible
Merci d'avance.
sunlover est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 21h10   #2
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 198
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 198
Points : 14 411
Points : 14 411
Envoyer un message via Skype™ à Pierre Fauconnier
Salut.

A ma connaissance, ce n'est pas possible en VBA (mais bien en VB6)...

Tu pourrais toujours utiliser une propriété nommée de manière identique dans les deux classes.

tu pourrais aussi utiliser une interface qui serait commun aux deux classes. Je t'invite à te reporter à cette discussion, et particulièrement au premier message qui expose justement ton cas...
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 09h39   #3
Rédacteur

 
Avatar de Maxence HUBICHE
 
Homme Maxence HUBICHE
Formateur et Développeur - Conseil en Informatique
Inscription : juin 2002
Messages : 3 687
Détails du profil
Informations personnelles :
Nom : Homme Maxence HUBICHE
Âge : 42
Localisation : France, Val d'Oise (Île de France)

Informations professionnelles :
Activité : Formateur et Développeur - Conseil en Informatique

Informations forums :
Inscription : juin 2002
Messages : 3 687
Points : 6 516
Points : 6 516
Envoyer un message via MSN à Maxence HUBICHE Envoyer un message via Skype™ à Maxence HUBICHE
Tu peux y parvenir, mais c'est compliqué.

Voici les étapes...
  • Exporter le module de classe
  • Supprimer le module de classe dans le projet
  • Ouvrir le fichier exporté dans un éditeur de texte (bloc-note par exemple...)
  • Trouver la ligne "Public Property Get Text() As String"
  • En dessous écrire le texte suivant : Attribute Text.VB_UserMemId = 0
  • Enregistrer le fichier
  • Fermer l'éditeur de texte
  • Importer le fichier dans le projet
__________________
1formaxion, une formation de qualité, des formateurs compétents
Mes tutoriels et vidéos :
Tableaux croisés dynamiques, Access les Bases, et les autres !
Maxence HUBICHE est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/04/2011, 10h34   #4
Futur Membre du Club
 
Grégory MARTIN
Inscription : mars 2010
Messages : 72
Détails du profil
Informations personnelles :
Nom : Grégory MARTIN

Informations forums :
Inscription : mars 2010
Messages : 72
Points : 17
Points : 17
Citation:
Envoyé par Maxence HUBICHE Voir le message
Tu peux y parvenir, mais c'est compliqué.
Merci ça marche
sunlover est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 14h35   #5
Futur Membre du Club
 
Grégory MARTIN
Inscription : mars 2010
Messages : 72
Détails du profil
Informations personnelles :
Nom : Grégory MARTIN

Informations forums :
Inscription : mars 2010
Messages : 72
Points : 17
Points : 17
Encore une question:

Si j'ai les classes A,B,C qui implémentent toutes fonction1 et fonction2 et que je veux une collection contenant par exemple:

A,B,C,B,A,C,A,A

Je veux pouvoir faire:

Code :
1
2
3
4
5
Dim col As New Collection
For Each o in col
val1 = o.fonction1()
val2 = o.fonction2()
Next o
Je suppose que je n'ai pas le choix et que je dois utiliser une interface...
seulement voilà, A contient juste une propriété Text et les autres classes contiennent beaucoup plus d'attributs. L'implémentation des fonctions 1 et 2 diffèrent d'une classe à l'autre.

Une interface qui reprendrait tous les attributs et propriétés de A,B,C m'obligerait à avoir toutes les propriétés de A,B,C dans chaque instance de A,B,C (vu l'absence de constructeurs) Donc pour A on aurait beaucoup de valeurs inutiles donc je n'aime pas.

Autre idée: 1 liste qui contiendrait le type A,B ou C, puis aller voir dans la liste de A si c'est A, de B si c'est B, etc. Je n'aime pas cette solution ça me semble lourd.

Faire une seule classe avec tous les attributs et faire plein de test ? Ça me semble encore plus laid que les deux 1ères propositions.

Comment faire ? Choisir un langage avec de l'héritage, je suppose.
sunlover est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 15h54   #6
Responsable Access
 
Avatar de Arkham46
 
Inscription : septembre 2003
Messages : 4 300
Détails du profil
Informations personnelles :
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : septembre 2003
Messages : 4 300
Points : 7 939
Points : 7 939
Bjr,

Citation:
Envoyé par sunlover Voir le message
Je veux pouvoir faire:

Code :
1
2
3
4
5
Dim col As New Collection
For Each o in col
val1 = o.fonction1()
val2 = o.fonction2()
Next o
Je suppose que je n'ai pas le choix et que je dois utiliser une interface...
On peut utiliser une variable Object dans une boucle "For Each".

Le code suivant fonctionne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
Function TestFunction()
Dim oColl As Collection
Dim oObj As Object
Set oColl = New Collection
oColl.Add New A
oColl.Add New B
For Each oObj In oColl
    oObj.function1
    oObj.function2
Next
End Function
Mais bien sûr il n'y a pas de complétion automatique ni de vérification du code.


Il y a (au moins) une discussion sur le polymorphisme sur ce forum que tu devrais retrouver avec une recherche.
Cela pourra peut-être t'aider.
__________________
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL

Blog Office Mon Site DVP
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 16h13   #7
Futur Membre du Club
 
Grégory MARTIN
Inscription : mars 2010
Messages : 72
Détails du profil
Informations personnelles :
Nom : Grégory MARTIN

Informations forums :
Inscription : mars 2010
Messages : 72
Points : 17
Points : 17
Bjr,

Oui, mais en ajoutant des instructions qui accèdent à des propriétés de mes classes pour mettre à jour un user-form, si je ne connais pas l'ordre de la succession d'objets A,B,C, alors je risque d'accéder à une propriété qui appartient à une autre classe et là
On error resume next pour poursuivre...
sunlover est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 16h27   #8
Responsable Access
 
Avatar de Arkham46
 
Inscription : septembre 2003
Messages : 4 300
Détails du profil
Informations personnelles :
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : septembre 2003
Messages : 4 300
Points : 7 939
Points : 7 939
Citation:
Envoyé par sunlover Voir le message
Bjr,

Oui, mais si je ne connais pas l'ordre de la succession d'objets A,B,C, alors je risque d'accéder à une propriété qui appartient à une autre classe et là
On error resume next pour poursuivre...
il y a aussi TypeOf :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Function TestFunction()
Dim oColl As Collection
Dim oObj As Object
Set oColl = New Collection
oColl.Add New A
oColl.Add New B
For Each oObj In oColl
    oObj.function1
    oObj.function2
    If TypeOf oObj Is A Then
        oObj.FunctionA
    ElseIf TypeOf oObj Is B Then
        oObj.FunctionB
    End If
Next
End Function
sinon il faut définir toutes les méthodes et propriétés et ne rien y faire si elles ne sont pas applicables à l'objet ...
__________________
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL

Blog Office Mon Site DVP
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 18h59   #9
Futur Membre du Club
 
Grégory MARTIN
Inscription : mars 2010
Messages : 72
Détails du profil
Informations personnelles :
Nom : Grégory MARTIN

Informations forums :
Inscription : mars 2010
Messages : 72
Points : 17
Points : 17
Merci pour votre aide.
sunlover est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 19h45   #10
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 198
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 198
Points : 14 411
Points : 14 411
Envoyer un message via Skype™ à Pierre Fauconnier
Salut.

Arkham a parlé de polymorphisme, et tu pourrais effectivement y arriver avec la création d'une interface, celle-ci ne reprenant que les propriétés, fonctions ou méthodes communes aux différentes classes.

Il faut que les signatures des fonctions soient les mêmes pour les différents objets.

Il faudrait donc préciser ce que tu veux dire par
Citation:
L'implémentation des fonctions 1 et 2 diffèrent d'une classe à l'autre.
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 23h11   #11
Futur Membre du Club
 
Grégory MARTIN
Inscription : mars 2010
Messages : 72
Détails du profil
Informations personnelles :
Nom : Grégory MARTIN

Informations forums :
Inscription : mars 2010
Messages : 72
Points : 17
Points : 17
Citation:
Envoyé par Pierre Fauconnier Voir le message
Salut.

Il faut que les signatures des fonctions soient les mêmes pour les différents objets.

Il faudrait donc préciser ce que tu veux dire par
Le type de retour doit être le même aussi je suppose ?

Je veux dire que le code de fonction1 dans A peut différer de celui de fonction1 dans B, tout en ayant la même signature.
sunlover est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 06h24   #12
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 198
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 198
Points : 14 411
Points : 14 411
Envoyer un message via Skype™ à Pierre Fauconnier
Oui, le type de retour doit être identique, mais tu peux utiliser Variant ou Object, ce qui te laisse des possibilités.

Soit

l'interface iInterface suivant
Code :
1
2
3
4
5
6
7
Option Explicit
 
Function Fonction1(Texte As String) As String
End Function
 
Function Fonction2(Montant As Currency) As Currency
End Function
la classe cClasse1 suivante
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Option Explicit
 
Implements iInterface
 
Private mNom As String
 
Private Function iInterface_Fonction1(Texte As String) As String
  iInterface_Fonction1 = Right(Texte, 2)
End Function
 
Private Function iInterface_Fonction2(Montant As Currency) As Currency
  iInterface_Fonction2 = Montant * 2
End Function
 
Property Get Nom() As String
  Nom = mNom
End Property
 
Property Let Nom(Nom As String)
  mNom = Nom
End Property
et la classe cClasse2 suivante
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Option Explicit
 
Implements iInterface
 
Private mLibelle As String
Private mLocalisation As String
 
Private Function iInterface_Fonction1(Texte As String) As String
  iInterface_Fonction1 = Left(Texte, 3)
End Function
 
Private Function iInterface_Fonction2(Montant As Currency) As Currency
  iInterface_Fonction2 = Montant / 2
End Function
 
Property Get Libelle() As String
  Libelle = mLibelle
End Property
 
Property Let Libelle(Libelle As String)
  mLibelle = Libelle
End Property
 
Property Get Localisation() As String
  Localisation = mLocalisation
End Property
 
Property Let Localisation(Localisation As String)
  mLocalisation = Localisation
End Property
Tu remarques que cClasse1 et cClasse2 interfacent iInterface, mais les fonctions développées dans les classes sont différentes, bien que de même signature. Outre les fonctions de l'interface, cClasse1 et cClasse2 n'exposent pas les mêmes propriétés.

Voici un code qui crée des objets bien distincts cClasse1 et cClasse2 et qui les chargent dans une collection.

[EDIT]
Après, le code boucle sur les objets de la collection (en supposant qu'ils sont tous de type iInterface, sinon, plantage) pour en exploiter les fonctions [/EDIT].

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit
 
Sub Test()
  Dim MonObjet1 As New cClasse1
  Dim Monobjet2 As New cClasse2
  Dim MaCollection As New Collection
  Dim ObjetInterface As iInterface
 
  MonObjet1.Nom = "Gauche"
  With Monobjet2
    .Libelle = "Droite"
    .Localisation = "Ici"
  End With
 
  MaCollection.Add MonObjet1
  MaCollection.Add Monobjet2
 
  For Each ObjetInterface In MaCollection
    Debug.Print ObjetInterface.Fonction1("Bonjour")
    Debug.Print ObjetInterface.Fonction2(20000)
  Next ObjetInterface
End Sub
Là, tu es certain d'utiliser la fonction interfacée propre à chaque objet. Tu remarques que lorsque tu utilises MonObjet1 en tant que cClasse1, tu n'as accès qu'à ses propriétés "cClasse1", alors que lorsque tu l'utilises en tant que iInterface, tu n'as accès qu'à ses propriétés "iInterface".
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 10h41   #13
Futur Membre du Club
 
Grégory MARTIN
Inscription : mars 2010
Messages : 72
Détails du profil
Informations personnelles :
Nom : Grégory MARTIN

Informations forums :
Inscription : mars 2010
Messages : 72
Points : 17
Points : 17
Merci pour vos explications claires. Elles m'ont aiedées à mieux comprendre le fonctionnement de VBA.
sunlover est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h34.


 
 
 
 
Partenaires

Hébergement Web