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

Macros et VBA Excel Discussion :

Incompréhension Byref VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 361
    Par défaut Incompréhension Byref VBA
    bonjour,

    voici le code suivant :
    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
     
    Sub Test()
        Dim Donnee As Integer
     
        Donnee = 50
     
        MaProcedure_1 Donnee
        MsgBox Donnee
     
        MaProcedure_2 Donnee
        MsgBox Donnee
     
        MaProcedure_3 Donnee
        MsgBox Donnee
    End Sub
     
     
    'Passe la référence en argument.
    Sub MaProcedure_1(ByRef x As Integer)
        x = x * 4
    End Sub
     
     
    'Passe la valeur en argument.
    Sub MaProcedure_2(ByVal y As Integer)
        y = y * 5
    End Sub
     
     
    'ByRef est la valeur par défaut si non spécifiée.
    Sub MaProcedure_3(z As Integer)
        z = z * 2
    End Sub
    la propriété ByRef me parait encore trop abstraite, d'abord je ne comprends pas la deuxième procédure qui renvoi la valeur 200 alors qu'on a : y = y * 5, y prend la valeur de 50 , non?

    ensuite pour la troisième procédure nous renvoi la valeur de 400 , j'en déduis donc que la valeur de z a repris le dernier résultat (en l’occurrence ici le résultat de notre deuxième procédure qui est de 200), est ce bien cela?

    Thanks a lot!

  2. #2
    Invité
    Invité(e)
    Par défaut
    bonjour,
    Voila ce que dit Microsoft:
    byVal:
    par valeur
    Moyen permettant de passer à une procédure la valeur d'un argument plutôt que son adresse. La procédure peut de ce fait accéder à une copie de la variable. La valeur réelle de cette dernière n'est donc pas modifiée par la procédure à laquelle elle est passée.

    ByRef:
    par référence
    Moyen permettant de passer à une procédure l'adresse d'un argument plutôt que sa valeur. La procédure peut ainsi accéder à la variable proprement dite. La valeur réelle de cette dernière peut, de ce fait, être modifiée par la procédure à laquelle elle a été passée. Par défaut, les arguments sont passés par référence.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    J'espère être compréhensible avec le code commenté suivant
    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
    38
    39
    40
    41
    42
    43
    Option Explicit
     
    Sub Test()
    Dim Donnee As Integer
    Donnee = 50
    MaProcedure_1 Donnee
    Debug.Print Donnee
    MaProcedure_2 Donnee
    Debug.Print Donnee
    MaProcedure_3 Donnee
    Debug.Print Donnee
    End Sub
     
    'Passe la référence en argument.
    '/// l'argument passé par référence est directement affecté
    '/// on a donc 50 * 4 = 200
    Sub MaProcedure_1(ByRef x As Integer)
    x = x * 4
    End Sub
     
    'Passe la valeur en argument.
    '/// l'argument passé par valeur reste lui même
    '/// ByVal crée une copie de l'argument sans l'affecter
    '/// on a donc argument = argument (200 = 200)
    '/// l'argument, suite à MaProcedure_1 est = 200
    Sub MaProcedure_2(ByVal y As Integer)
    y = y * 5
    End Sub
     
    'ByRef est la valeur par défaut si non spécifiée.
    '/// sans précision, l'argument est interprété comme ByRef
    '/// et est donc directement affecté
    '/// suite à MaProcedure_2, l'argument est = 200
    '/// on a donc argument * 2 soit 200 * 2 =400
    Sub MaProcedure_3(z As Integer)
    z = z * 2
    End Sub
     
    'REMARQUE
    ' on devrait user plutôt du terme paramètre que du terme argument
    ' Les procédures, dans le cas présent, demandent 1 argument
    ' Le traitement (Sub Test) passe un paramètre (Donnee) aux procédures
    ' Il y a donc un distinguo entre argument et paramètre

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 175
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Un bon tutoriel à lire Utiliser les variables en VBA Excel et tout particulièrement le chapitre sur la différence entre ByRef et ByVal
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 361
    Par défaut
    Merci pour ton code PMO2017, c'est génial

    juste une chose : dans ByVal , à quoi sert d'écrire si ByVal ne fais qu'une copie du résultat précédent (issu de MaProcedure_1)?

  6. #6
    Invité
    Invité(e)
    Par défaut
    C'est justement pour expliquer la différence entre 'ByVal' et 'ByRef' pour montrer qu'il n'y a pas d'influence sur la variable 'Donnees'.

Discussions similaires

  1. [AC-2007] Fonctionnement incompréhensible dans VBA ACCESS
    Par fbourdon dans le forum IHM
    Réponses: 6
    Dernier message: 27/11/2009, 17h15
  2. [VBA-Excel] Bug dans Import de boite de dialogue incompréhensible
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/07/2007, 17h15
  3. ligne incompréhensible code VBA
    Par Anorgasmophobie dans le forum Général VBA
    Réponses: 5
    Dernier message: 01/05/2007, 14h43
  4. [Fonction][VBA]incompréhension sur datediff
    Par portecd dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/04/2007, 13h57
  5. [Vba-E] Problème incompréhensible
    Par antoinelavigne dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 16/06/2006, 14h47

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