IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Discussion :

Élargir la portée des objets en VBA


Sujet :

VBA

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 2
    Points : 1
    Points
    1
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Déclarer obj1 et obj2 puis les passer en parametre a definition_objet ?

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. Portée des objets
    Par kaul128 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 10/12/2014, 22h26
  2. Portée des objets
    Par electrovolt dans le forum Langage
    Réponses: 7
    Dernier message: 02/10/2012, 18h53
  3. La portée des objets
    Par bibim dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 31/01/2012, 15h40
  4. Copier des objets d'un formulaire à un autre en VBA
    Par vincentdacol dans le forum Access
    Réponses: 1
    Dernier message: 24/04/2006, 14h18
  5. [FLASH 8] Question sur la portée des objets.
    Par i_shinji dans le forum Flash
    Réponses: 1
    Dernier message: 02/11/2005, 17h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo