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 Access Discussion :

Conserver la valeur d'une variable Public d'un sub à une fonction [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut Conserver la valeur d'une variable Public d'un sub à une fonction
    Bonjour à tous.
    J'ai un problème de transmission de variable entre un Sub et une Function. Je simplifie :

    - Dans un module où je déclare toutes mes variables récurentes, j'ai déclaré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Argument1 As String
    - Dans un formulaire, j'ai un bouton qui actionne le Sub Bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Bouton_Click()
    Call SubModule("Le texte")
    End Sub
    - Ce Sub appelle donc un deuxième Sub, appelé SubModule, qui est rangé dans un module séparé et qui a comme argument obligatoire Argument1. Si je teste, pas de problème, Argument1 est bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub SubModule(Argument1 As String)
    MsgBox Argument1
    End Sub
    renvoie bien une MsgBox avec "Le texte"

    Mais il se trouve qu'en fait ce SubModule utilise une fonction qui a pour but de modifier Argument1 si besoin est (ici je vous épargne le If) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub SubModule(Argument1 As String)
    MsgBox Argument1
    FoncModification
    MsgBox Argument1
    End Sub
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function FoncModification
    Argument1 = Argument1 & " MODIFIÉ"
    End Function
    Et alors là, Argument1 ne s'est pas transmis de SubModule à FoncModification : ça retourne dans la deuxième MsgBox " MODIFIÉ" alors qu'il devrait mettre "Le texte MODIFIÉ", ce qui montre que dans la Function, Argument1 est Null parce qu'il n'a pas été transmis.

    Quelqu'un peut-il m'aider svp ?

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 877
    Points : 4 752
    Points
    4 752
    Par défaut
    Bonsoir,
    Tu devrais certainement approfondir la différence entre des procédures (Sub) et des fonctions (Function) et aussi comment leur passer des arguments.
    En principe une fonction retourne une valeur.

    Pour ta question, une solution est de compléter ta fonction FoncModification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Function FoncModification(byVal Argument1  as string) as string
    FoncModification= Argument1 & " MODIFIÉ"
    End Function
    ensuite tu peux utiliser directement la valeur retournée par la fonction dans ta msgbox ou autre chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sub SubModule(Argument1 As String)
    MsgBox Argument1
     
    MsgBox FoncModification( Argument1)
     
    End Sub
    Cdlt
    "Always look at the bright side of life." Monty Python.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Bonjour et merci de ta réponse rapide.
    Citation Envoyé par micniv Voir le message
    Tu devrais certainement approfondir la différence entre des procédures (Sub) et des fonctions (Function)
    C'est une évidence. J'admets n'avoir jamais réussi à saisir la différence. À chaque fois que j'ai essayé de comprendre, j'ai toujours trouvé des explications qui m'ont semblé floues et qui, en gros, donnaient toutes comme principale raison que "Les Fonctions retournent des valeurs", ce qui est hautement sibyllin.
    Citation Envoyé par micniv Voir le message
    En principe une fonction retourne une valeur.
    Làààà, qu'est-ce que je disais ! Mais c'est quoi, alors, une "valeur" ? Mon string n'est-il-pas une valeur ? C'est la valeur de la variable Argument1, non ? Si tu pouvais m'éclairer sur ce point, je t'en serai éternellement reconnaissant !

    En tout cas, merci pour ta solution, qui marche bien. Je laisse le post ouvert en espérant que tu aies des velléités pédagogiques

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Cette variable est accessible pour tout le programme

    Cette sub dispose d'un paramètre myvar qui lui est propre et qui n'a rien à voire avec la variable public décrite plus haut.
    Dans ton exemple à

    Code modifie var public : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function FoncModification
    Argument1 = Argument1 & " MODIFIÉ"
    End Function

    Alors que la, la variable est privés a la sub il ne s'agit pas de la même variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub SubModule(Argument1 As String)
    MsgBox Argument1
    FoncModification
    MsgBox Argument1
    End Sub

  5. #5
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 877
    Points : 4 752
    Points
    4 752
    Par défaut
    salut Vijinn,

    Quelques explications :

    dans les modules, tu trouves 2 types de programmes les procédures ( Sub) et les fonctions ( Function);

    Les sub peuvent avoir des arguments en entrée . En sortie ils ne retournent pas de valeur.

    les fonctions peuvent aussi avoir des arguments en entrée , mais en principe elles retournent une valeur en sortie.
    Normalement, une fonction est déclarée ainsi : Private Function FoncModification(byVal Argument1 as string) as string
    au début : Private ou Public (voir l'aide via F1)
    et surtout à la fin as string précise que la fonction , à la fin de son exécution , aura une valeur de type String , à condition bien sûr que le programmeur ait saisi la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    FoncModification = "chaine1"
    (sinon une valeur NULL est retournée)

    Comprendre que la méthode mise en avant par Dysortho... est tout autre :
    On déclare une variable publique et on la valorise (on lui donne une valeur, elle est visible dans tous les modules du programme)
    Eventuellement, comme ici, on peut la modifier (elle est "vue" modifiée partout)
    mais personnellement, j'essaie de limiter les variables publiques au strict minimum :
    un des effets néfastes est qu'à la première erreur VBA rencontrée , les variables publiques sont annulées.


    Voilà un début pour t'éclairer un peu. Tu dois pouvoir trouver des tutos sur Développez.
    Bonne continuation,
    "Always look at the bright side of life." Monty Python.

  6. #6
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Un grand merci : grâce à vous deux, j'avance par petites touches.

    Merci Dysorthographie, ton explication est très éclairante.
    J'ai maintenant compris pourquoi la valeur de Argument1 ne se transmettais pas à la fonction : tout simplement parce que ce ne sont pas les mêmes variables ! Du coup j'ai fait une bidouille toute simple : je les ai appelées différemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub SubModule(Argument1 As String)
    MsgBox Argument1
    Argument1Fonction = Argument1
    FoncModification
    MsgBox Argument1Fonction
    End Sub
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function FoncModification
    Argument1Fonction = Argument1Fonction  & " MODIFIÉ"
    End Function
    Comme je l'ai dit, ce n'est qu'une bidouille, mais ça marche.

    Ne me contentant des bidouilles, j'ai essayé d'utiliser la méthode de micniv, qui me semblait plus propre mais ça coince : j'ai modifié la Function comme tu m'as dit puis mis dans le subModule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub SubModule(Argument1 As String)
    MsgBox Argument1
    FoncModification = Argument1
    FoncModification
    MsgBox Argument1
    End Sub
    mais il me dit "Erreur de compilation. Un appel de fonction dans la partie gauche de l'affectation doit renvoyer Variant ou Object". Or, je suis obligé de lui donner une valeur variable parce Argument1 change tout le temps en fonction du contexte.
    Comment faire ?

    En tout cas, merci beaucoup de votre aide.

  7. #7
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 877
    Points : 4 752
    Points
    4 752
    Par défaut
    Sub SubModule(Argument1 As String)
    MsgBox Argument1
    FoncModification = Argument1
    FoncModification
    MsgBox Argument1
    End Sub
    Function FoncModification
    Argument1Fonction = Argument1Fonction & " MODIFIÉ"
    End Function
    Encore quelques explications :
    ton code suppose :
    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
    'tu as déclaré une variable globale
    Public Argument1Fonction as string 
     
    ' Puis tu définis  FoncModification qui est en fait une procédure (un Sub car pas de valeur retournée directement)
    private sub FoncModification
    Argument1Fonction = Argument1Fonction  & " MODIFIÉ"
    End sub
     
    ' puis tu ecris une procédure qui utilise le sub ci-dessus
    Sub SubModule(Argument1 As String)
    MsgBox Argument1
    ' FoncModification = Argument1  'tu ne peux pas écrire cela 
    '  d'une part FoncModification  est un sub et n'a pas de valeur 
    '  d'autre part même si c'était une fonction, ce n'est pas comme cela qu'on affecte une valeur à une fonction (relire plus haut encore)
    ' tu déclenche FoncModification qui modifies la valeur de ta variable globale
    ' mais songe toujours à initialiser la valeur de Argument1Fonction  avant de l'utiliser, ne serait-ce à une chaine vide
     Argument1Fonction = ""
    FoncModification
    MsgBox Argument1    ' ne serait-ce pas plutôt Argument1Fonction 
    End Sub
    Courage, tu es sur la voie
    "Always look at the bright side of life." Monty Python.

  8. #8
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Bonjour et encore merci de bien vouloir vous pencher sur un codeur balbutiant comme moi.
    Finalement, j'ai réussi à faire comme tu proposais dans ta première réponse. En fait, dans un premier essai, j'avais mal transposé ta syntaxe dans mon cas particulier, mais je l'ai refait correctement.
    D'autre part, si j'ai fait une fonction, c'est parce que, de mon point de vue, cela sert justement à retourner une valeur : la valeur de Argument1, qui est utilisée plus tard dans la suite de la procédure SubModule. Si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Argument1 = Argument1  & " MODIFIÉ"
    n'est pas une valeur, alors qu'est-ce qu'une valeur ?
    Je suis toujours preneur d'une explication sur cette dernière question (je sais, je suis em***dant, pardonnez-moi, mais, en bon autodidacte, j'ai besoin de bien comprendre ce que je fais pour m'améliorer )

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Si tu utilises une variable public, alors te sub et tes fonctions n'aurons pas de paramètres et là dans tous les cas tu utilisera ta variable public.
    Si toutes tes fonctions dispose de paramètres alors tu peux modifier te variable en cascades dans chaque méthode et impacter la variable passé en paramètres.

    Si dans un méthode tu passe "Toto" c'est du texte pas un variable!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sub test()
    MySub("toto")
    End sub
    Dans cette exemple tu ne peux pa modifier lc contenu ca la valeur données est une constante "Toto"!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupération de la valeur d une variable elle même contenue dans une variable
    Par guiplongeur dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 16/03/2015, 16h23
  2. Déclarer une variable public dans un Sub
    Par dragondumond dans le forum VB.NET
    Réponses: 3
    Dernier message: 09/04/2013, 13h16
  3. Réponses: 9
    Dernier message: 05/11/2008, 09h37
  4. Réponses: 1
    Dernier message: 17/01/2007, 21h52
  5. Réponses: 7
    Dernier message: 13/03/2006, 15h39

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