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 23/12/2010, 14h03   #1
Invité de passage
 
Inscription : décembre 2010
Messages : 2
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 2
Points : 0
Points : 0
Par défaut Élargir la portée des objets en VBA

Bonjour, j'ai le problème suivant: j'ai un code main suivant

Code :
1
2
3
4
5
sub main
dim resultat as integer
definition_objet
resultat=utilisation_objet(obj1,obj2)
end sub
dans la procédure "sub definition_objet" je définis tous les objets (prédéfini suivant la classe obj) ainsi que leurs attributs

Code :
1
2
3
4
5
6
public obj1 as new obj
public obj2 as new obj
sub definition_objet()
obj1.attribut1=x
obj2.attribut1=y
end sub
et dans la procédure utilisation_objet je manipule les objets:

Code :
1
2
3
4
5
function utilisation_objet(ByRef new_obj1 as obj, ByRef new_obj2 as obj) as integer
dim resultat as integer
resultat=obj1.attribut1+obj2.attribut1
return resultat
end sub
Bien que j'ai déclaré en public les objets obj1 et obj2, ces objets deviennent hors de portée une fois que la procédure definition_objet s'achève et la variable resultat dans la procédure main me donne toujours 0.
Bien qu'il y ait beaucoup d'information sur internet sur la portée des variables, je ne trouve aucune solution pour élargir la portée de mes objets à la procédure main.
Pourriez vous m'indiquer une piste s'il vous plaît?
Merci d'avance
Vincent3004 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 14h21   #2
Rédacteur/Modérateur
 
Avatar de Nathanael Marchand
 
Homme Nathanael Marchand
Expert .Net So@t
Inscription : octobre 2008
Messages : 3 056
Détails du profil
Informations personnelles :
Nom : Homme Nathanael Marchand
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Expert .Net So@t
Secteur : Conseil

Informations forums :
Inscription : octobre 2008
Messages : 3 056
Points : 6 826
Points : 6 826
Déclarer obj1 et obj2 puis les passer en parametre a definition_objet ?
__________________
Les Forums sont là pour demander de l'aide. Si je peux, je répondrai à un topic avec plaisir! Mais toute demande par Message Privé poubelle!
Retrouvez moi sur :
Mon Espace Developpez.com------------------------------- Dvp.NET, une librairie open-source de composants .NET
Mon blog: Up there in the code---------------------------- Twitter: NatMarchand
Ma société: So@t

Jeux multi-écrans: Envolez-vous avec Kinect, Silverlight et WP7 aux Microsoft Tech'Days 2012
Nathanael Marchand est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 18h22   #3
Invité de passage
 
Inscription : décembre 2010
Messages : 2
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 2
Points : 0
Points : 0
Merci PitMaverick78, ta combine m'a permis de venir à bout de mon problème. J'utilise aussi une déclaration de fonction de type:
function resultat(Byref new_obj1 as obj, Byref new_obj2 as obj) as integer
resultat = ... 'pas d'utilisation de return mais
'la variable retournée et la fonction ont même nom
end function

J'ai réussi à transformer quelque chose de très simple en machine à gaz mais j'ai besoin de pouvoir mélanger la programmation procédurales/orientée objet pour un autre projet un peu plus compliqué! Merci encore!



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
31
32
33
34
35
36
37
Public obj1 As New obj
Public obj2 As New obj
Public resultat As Integer
 
main obj1, obj2, resultat
 
'programme principal
Public Sub main(ByRef new_obj1 As obj, ByRef new_obj2 As obj, ByRef resultat As Integer)
    def_objet new_obj1, new_obj2                      'on caractérise les objets
    utilisation_objet new_obj1, new_obj2, resultat  'on travaille avec les objets
    Debug.Print resultat                                     'on affiche le résultat
End Sub
 
 
 
 
Sub def_objet(ByRef new_obj1 As obj, ByRef new_obj2 As obj)
new_obj1.attribut1 = 3
new_obj2.attribut1 = 5
End Sub
 
Sub utilisation_objet(ByRef new_obj1 As obj, ByRef new_obj2 As obj, ByRef resultat As Integer)
resultat = somme_objet(new_obj1, new_obj2)
End Sub
 
Public Function somme_objet(ByRef new_obj1 As obj, ByRef new_obj2 As obj) As Integer
somme_objet = new_obj1.attribut1 + new_obj2.attribut1
End Function
 
et la classe obj:
Private PVattribut1 As Integer
Public Property Let attribut1(ByVal new_attribut1 As Integer)
    PVattribut1 = new_attribut1
End Property
Public Property Get attribut1() As Integer
    attribut1 = PVattribut1
End Property
Vincent3004 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2010, 16h56   #4
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 m'étonnes que c'est une usine à gaz !

Tu n'as pas besoin de ta variable "resultat" !
Récupères le résultat de ta fonction, tout simplement !

Classe obj:
Code :
1
2
3
Option Explicit
'Une variable publique suffit, dans ce cas, pour définir la propriété
Public Valeur As Integer
Classe Calcul :
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
31
32
33
34
35
36
Option Explicit
 
'Deux variables publiques pour les deux objets à manipuler
Public Objet1 As obj
Public Objet2 As obj
 
Function Sommer() As Long
    Sommer = Objet1.Valeur + Objet2.Valeur
End Function
 
Function Multiplier() As Long
    Multiplier = Objet1.Valeur * Objet2.Valeur
End Function
 
Function Diviser() As Double
    Diviser = Objet1.Valeur / Objet2.Valeur
End Function
 
Function Soustraire() As Double
    Soustraire = Objet1.Valeur - Objet2.Valeur
End Function
 
Private Sub Class_Initialize()
    'Instancier les objets en leur donnant des valeurs par défaut.
    'Bien sûr, l 'utilisateur pourra les modifier à volonté ultérieurement
    Set Objet1 = New obj
    Objet1.Valeur = 3
    Set Objet2 = New obj
    Objet2.Valeur = 5
End Sub
 
Private Sub Class_Terminate()
    'Détruire les objets instanciés quand on n'en a plus besoin...
    Set Objet1 = Nothing
    Set Objet2 = Nothing
End Sub
Module module1
Code :
1
2
3
4
5
6
7
8
9
10
Sub Main()
    Dim c As New Calcul
    'Les lignes suivantes ne servent à rien, puisque Objet1 et 2 sont déjà initialisés
    'Cependant, en retirant les commentaires et en modifiant les valeurs, on obtient d'autres résultats
    'x.Objet1.Valeur = 3
    'y.Objet2.Valeur = 5
 
    MsgBox "Somme : " & vbTab & c.Sommer()
    'et au passage, tu as gagné 3 autres opérations ;)
End Sub
Et là, il n'y a plus d'histoire de public "jenesaisquoi"
Tout se fait proprement, en passage d'arguments, et tout.
C'est propre.
Ce n'est plus une usine à gaz
__________________
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 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h43.


 
 
 
 
Partenaires

Hébergement Web