VBA : Classes-comment ajouter une fonction

flyjodel

XLDnaute Junior
Bonjour à tous, encore moi...

Je progresse à petits pas dans l'utilisation des classes, méthodes etc.

J'ai une classe qui me permet d'afficher différents éléments.
Je voudrais convertir certains de ces éléments "à la volée" lors de l'affichage.

Par exemple

Article est une classe
Dans Article, j'ai les propriétés suivantes :
- Article.Nom
- Article.Prix
- Article.Poids
etc...

je souhaite créer une méthode que j'appellerais en la rajoutant en suffixe à Article.Prix ou à Article.Poids, et qui multiplierait cette valeur par 1000.

Exemple : Article.Prix.MultiplieParMille aurait pour valeur : 1000*Article.Prix
idem pour: Article.Poids.MultiplieParMille aurait pour valeur : 1000*Article.Poids

L'idée c'est que la méthode MultiplieParMille puisse s'appliquer à n'importe quelle propriété numérique de Article. Et je voudrais pouvoir l'appeler en la mettant en "second suffixe" à la propriété de l'objet.

Est-ce possible (je sais que oui) ? et comment (ça je sais pas...) ?
Merci !



ps : en réalité mon projet est un brin plus complexe, et je suis entrain de passer d'une programmation en procédures à une programmation utilisant les classes, alors je susi parfois un peu perdu.
 
Dernière édition:

mromain

XLDnaute Barbatruc
Re : VBA : Classes-comment ajouter une fonction

Bonjour flyjodel, JB,


Voici un essai :

Code du module de classe (CLS_Article)
VB:
Private nomArticle As String
Private prixArticle As Double
Private poidsArticle As Double

'# Set / Let
Property Let Nom(nomS)
    nomArticle = nomS
End Property
Property Let Prix(PrixD)
    prixArticle = PrixD
End Property
Property Let Poids(PoidsD)
    poidsArticle = PoidsD
End Property

'# Get
Property Get Nom()
    Nom = nomArticle
End Property
Property Get Prix()
    Prix = prixArticle
End Property
Property Get Poids()
    Poids = poidsArticle
End Property


'# Méthodes
Public Function MultiplieParMille(valeur As Double) As Double
    MultiplieParMille = valeur * 1000
End Function
Code dans un module normal :
VB:
Sub Test()
Dim monArticle As CLS_Article

    Set monArticle = New CLS_Article
    
    monArticle.Nom = "test"
    monArticle.Poids = 120
    monArticle.Prix = 25
    
    MsgBox monArticle.MultiplieParMille(monArticle.Poids)
    MsgBox monArticle.MultiplieParMille(monArticle.Prix)
    
End Sub
a+
 
Dernière édition:

flyjodel

XLDnaute Junior
Re : VBA : Classes-comment ajouter une fonction

Bonjour et merci de vos réponses.

En effet, c'est ainsi que je procède pour mes calculs. Mais je me suis sans doute mal exprimé.

Je voudrais créer une "méthode de classes" qui multiplierait par mille tout ce que je lui donne à multiplier et qui s'utilise en tant que suffixe de l'appel de l'objet.

je voudrais lors de l'appel pouvoir l'utiliser de la manière suivante :
Code:
MsgBox( monArticle.Poids.MultiplieParMille )
au lieu de
Code:
MsgBox( monArticle.MultiplieParMille(monArticle.Poids) )

Je ne sais pas comment dire, disons "en second suffixe". Faut-il définir une classe de classes pour cela ? Mais dans ce cas je ne sais pas comment faire.

Dans VBA il existe déjà ce genre de choses, par exemple :
Code:
Feuille.Range("A1:A7").EntireRow.Copy

Par ailleurs, le site de JB est une vraie mine d'or !
 
Dernière édition:

mromain

XLDnaute Barbatruc
Re : VBA : Classes-comment ajouter une fonction

Dans VBA il existe déjà ce genre de choses, par exemple :
Code:
Feuille.Range("A1:A7").EntireRow.Copy
C'est parce que EntireRow renvoie un objet de type Range qui lui-même possède la méthode Copy.


Dans ce cas :
Code:
MsgBox(monArticle.Poids.MultiplieParMille)
Poids n'est pas un objet (simple variable - sûrement Double). Poids ne possède pas de méthodes.
Du coup, tu ne pourras pas avoir cette syntaxe.

a+
 
Dernière édition:

flyjodel

XLDnaute Junior
Re : VBA : Classes-comment ajouter une fonction

c'est pourquoi, je viens d'essayer de créer des méthodes pour Poids mais je ne sais finalement pas comment faire.

Classe Article :
Code:
Dim pNom As String
Dim pPrix As Single

[b][color=red]Dim pPoids As CPoids[/color][/b]

Public Property Get Nom()
    Nom = pNom
End Property

Public Property Let Nom(value)
    pNom = value
End Property



Public Property Get Poids()
    Poids = pPoids.Valeur
End Property

Public Property Let Poids(value)
    pPoids.Valeur = value
End Property

Classe CPoids :
Code:
Dim pValeur As Single

Public Property Get Valeur()
    Valeur = pValeur
End Property

Public Property Let Valeur(value)
    pValeur = value
End Property

Evidemment quand j'appelle
Code:
Chaise.Poids.Valeur = 7
ça ne marche pas...
 

flyjodel

XLDnaute Junior
Re : VBA : Classes-comment ajouter une fonction

entre temps, j'ai trouvé cet article, mais j'ai un peu de mal à l'appliquer :
VBA: propriété d'une classe dans une classe, entraide, FAQ, conseils, avis, Excel, Microsoft Office

"Ok. Je crois comprendre comment on fait.
J'ai simplement a créer un méthode qui retourne la classe B
dans la classe A

public Sub B() as cB
set B = m_B
end

et je pourrai écrire I = A.B.v
Il semble qu'on appelle cela héritage par délégation

... il me reste à essayer"
 

mromain

XLDnaute Barbatruc
Re : VBA : Classes-comment ajouter une fonction

Re,


Voici un deuxième essai :

> dans un premier Module de Classe (CLS_AttributMultipliable) :
VB:
Option Explicit


Private val As Double

Public Property Get Valeur()
    Valeur = val
End Property

Public Property Let Valeur(laValeur)
    val = laValeur
End Property



Public Function MultiplieParMille() As Double
    MultiplieParMille = val * 1000
End Function
> dans un second Module de Classe (CLS_Article) :
VB:
Option Explicit


Private leNom As String
Private lePoids As CLS_AttributMultipliable
Private lePrix As CLS_AttributMultipliable


'# constructeur
Private Sub Class_Initialize()
    Set lePoids = New CLS_AttributMultipliable
    Set lePrix = New CLS_AttributMultipliable
End Sub


'# Let / Set
Public Property Let Nom(nomS)
    leNom = nomS
End Property
Public Property Let Poids(poidsD)
    lePoids.Valeur = poidsD
End Property
Public Property Let Prix(prixD)
    lePrix.Valeur = prixD
End Property


'# Get
Public Property Get Nom()
    Nom = leNom
End Property
Public Property Get Poids()
    Set Poids = lePoids
End Property
Public Property Get Prix()
    Set Prix = lePrix
End Property
> dans un Module :
VB:
Sub test()
Dim monArticle As CLS_Article

    Set monArticle = New CLS_Article
    
    monArticle.Nom = "test"
    monArticle.Poids = 17
    monArticle.Prix = 12.5
    
    MsgBox monArticle.Poids.MultiplieParMille
    MsgBox monArticle.Prix.MultiplieParMille
    
End Sub
a+


Edit :


Par contre, si tu veux la vrai valeur du poids, tu devras écrire
VB:
MsgBox monArticle.Poids.Valeur
et non
VB:
MsgBox monArticle.Poids
 
Dernière édition:

flyjodel

XLDnaute Junior
Re : VBA : Classes-comment ajouter une fonction

C'est GENIAL !

exactement ce que je cherchais, mais je n'en connais pas assez sur la théorie pour trouver cela seul. Merci infiniment, je vais pouvoir maintenant aller chercher dans mes bouquins pour comprendre exactement commetn tout cela fonctionne, je ne suis pas familier avec ce genre de notation : Private Sub Class_Initialize()

Mais je vais trouver.

Merci, tu me simplifies énormément la vie, en plus j'apprends. Ce forum est vraiment très utile.
 

JNP

XLDnaute Barbatruc
Re : VBA : Classes-comment ajouter une fonction

Bonjour le fil :),
J'ai suivi avec attention ;).
Il me semble qu'il y a un petit bémol, les attributs Prix et Poids ne peuvent plus être récuppérés avec
Code:
    MsgBox monArticle.Poids
    MsgBox monArticle.Prix
:eek:.
A + :cool:
 

mromain

XLDnaute Barbatruc
Re : VBA : Classes-comment ajouter une fonction

Bonjour le fil :),
J'ai suivi avec attention ;).
Il me semble qu'il y a un petit bémol, les attributs Prix et Poids ne peuvent plus être récuppérés avec
Code:
    MsgBox monArticle.Poids
    MsgBox monArticle.Prix
:eek:.
A + :cool:


Salut Jean-Noël :)


Je m'en était aperçu après avoir posté la réponse.
Elle est éditée ;)

Edit: Salut tbft,
C'est ce que j'avais rajouté justement ;)


a+
 

Discussions similaires

Statistiques des forums

Discussions
312 176
Messages
2 085 965
Membres
103 069
dernier inscrit
jujulop