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 :

Utilite de passer par ByVal [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut Utilite de passer par ByVal
    Bonjour a tous,

    Mon probleme est simple.
    Tout d'abord, je comprends tres bien le fonctionnement de ByRef et ByVal, mais par contre j'aimerais savoir, si vous auriez un exemple qui permettrait de mettre en avant l'utilite de passer par ByVal.

    En voulant resoudre un probleme de code, je suis tombe sur quelqu'un qui proposait une solution. Et dans son code, a un certain moment il utilisait un fonction avec des arguments declares avec ByVal. Je me suis dit que bien comprendre son code etait une bonne occasion de voir l'utilite de passer par ByVal.
    Malheureusement, je me suis rendu compte, que pour ce cas, meme si je mettais ByRef cela ne changeait rien au code, et donc rien au resultat.

    Donc peut etre que quelqu'un aurait un exemple ou le fait d'utiliser ByVal est la seule solution pour arriver a faire ce que l'on souhaite avec notre code?
    Peut etre aussi qu'il y a d'autres utilites comme reduction de temps de calcul, ou encore ca prend moins de place etc... je ne sais pas trop, donc si vous pouvez m'eclairer la dessus.

    Merci beaucoup!

  2. #2
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, à lire et assimiler : Utiliser les variables en VBA Excel

  3. #3
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    Merci pour ta reponse Kiki29.

    En fait je l'avais deja lu, mais dans l'exemple de ce tuto, cela montre simplement que la variable definie dans la procedure appelante puis empruntee par la procedure appelee (avec ByVal) ne modifie pas cette variable.

    Donc ce que je recherche ce serait des exemples qui montre l'interet de ne pas modifier une variable.
    Car je me dis, si on passe par une sous procedure qui ne change rien alors pourquoi passer par cette sous procedure

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Ca peut te permettre de te dispenser de déclarer une variable locale dans une fonction, si tu as besoin de sa valeur et que tu veux la protéger. Mais ça tu l'avais compris
    Honnêtement jusqu'à maintenant je m'en suis très bien passé.
    Je pressens qu'il peut avoir un rôle plus utile dans les modules de classe mais comme je suis un peu étanche à ces trucs là...
    Je suis un peu comme toi. Je vois bien le concept, mais pas d'exemple où c'est incontournable (hormis les rares cas où excel m'obligeait byref sans que je comprenne vraiment le pourquoi).
    Je vais donc suivre avec intérêt.

    Pour le temps de calcul c'est plutôt l'inverse. Un peu plus lent à cause de la copie de la variable.
    Une page un peu plus détaillée mais qui n'apporte pas l'argument ultime : https://msdn.microsoft.com/fr-fr/library/ddck1z30.aspx

    Et un rôle vu par une pointure :
    Par défaut, tous les paramètres sont passés par référence, il est donc pas nécessaire d'inclure l' ByRef déclaration. Cependant, je dois sur mes 20 ans comme un programmeur professionnel a constaté qu'il est de bonne pratique d'inclure le ByRef déclaration si vous allez changer la valeur du paramètre. Il ne fait pas de différence de la façon dont le code est exécuté - en fait le code plus rapide ni lent ni - mais elle sert documentation que la variable dans la procédure d'appel va être modifié par la procédure appelée. Il contribue à rendre le code auto-documenté. Vous pouvez ou ne pas être d'accord. Utilisez-le ou ne le faites pas - quel que soit le style que vous préférez
    http://www.cpearson.com/excel/byrefbyval.aspx

    eric

  5. #5
    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,

    Quand on utilise des APIs, il est parfois nécessaire de distinguer le passage des paramètres par ByRef ou ByVal selon les arguments demandés par la fonction API.

    Extrait de Laurent Longre

    Déclaration

    La déclaration d'une fonction API se fait toujours en dehors de toute procédure, en principe au début du module.
    Une fonction API, comme toute fonction de DLL, se déclare à l'aide des mots-clés Private Function (si elle renvoie une valeur) ou Private Sub (si elle ne renvoie rien).
    [Public|Private] Declare Sub name Lib "libname" [Alias "aliasname"] [([arglist])]
    [Public|Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])] [As type]
    name est le nom de la fonction (soit le nom réel, soit un nom choisi librement si l'on utilise un alias)
    libname est le nom de la DLL contenant la fonction (sans chemin d'accès pour les DLL système)
    aliasname est le nom réel de la fonction telle qu'elle est exportée par la DLL
    Les types des arguments doivent être scrupuleusement respectés, sous peine de plantages possibles. Il faut en particulier bien respecter le type de passage de chaque argument, par référence (ByRef) ou par valeur (ByVal).
    Une fois que la fonction est ainsi définie, elle peut s'utiliser comme n'importe quelle fonction VBA.

    Declare Sub RtlMoveMemory Lib "kernel32.dll" _
    (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Il y a effectivement deux façons se passer des valeurs.
    , par valeurs justement ou par références.

    Par valeurs (ByVal) si je multiplie la valeur par 2 dans la sub le résulta n'affectera pas la variable passée en paramètre lors de la sortie de la sub. En d'autres termes la valeur est recopier dans un autre variable le temps du traitement.

    Par références (ByRef) la variable est transmise par son adresse mémoire, si je la multiplie par 2 j'affecte la variable source et ça valeur aura effectivement changer a la sortie de la sub.

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

Discussions similaires

  1. Imprimer un TIFF sans passer par PostScript
    Par iubito dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 22/03/2004, 20h44
  2. Réponses: 10
    Dernier message: 24/02/2004, 12h28
  3. Réponses: 4
    Dernier message: 05/02/2004, 18h18
  4. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 19h13
  5. [Kylix] Débrider Kylix sans passer par le Net
    Par BXDSPORT dans le forum EDI
    Réponses: 1
    Dernier message: 23/03/2003, 10h52

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