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 :

Quand faut-il utiliser les parenthèses () pour passer des paramètres à l'appel d'une méthode en VBA ?


Sujet :

VBA

  1. #1
    Nouveau membre du Club

    Homme Profil pro
    Ing. dev
    Inscrit en
    Septembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing. dev
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 29
    Points : 29
    Points
    29
    Billets dans le blog
    1
    Par défaut Quand faut-il utiliser les parenthèses () pour passer des paramètres à l'appel d'une méthode en VBA ?
    Bonjour,

    Quand faut-il ou ne faut-il pas utiliser les parenthèse () pour passer des paramètres à l'appel d'une méthode ou fonction VBA ?

    J'ai trouvé ceci : https://msdn.microsoft.com/fr-fr/lib.../gg251432.aspx
    qui explique la différence.

    Mais voici le problème que j'ai rencontré où à mon avis le comportement est un peu tiré par les cheveux ou bugé, non ?? Y a-t-il une explication à ce comportement ?
    http://www.developpez.net/forums/d15...orescence-xml/

    Est-ce que la règle est elle la même pour les différentes versions de VB, VBA, VBS ?

    Merci et excellente journée
    Stéphane

  2. #2
    Membre habitué Avatar de francis60
    Homme Profil pro
    Modélisation coût/process
    Inscrit en
    Août 2011
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Modélisation coût/process
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 178
    Points : 162
    Points
    162
    Par défaut
    Bonjour lestef,

    Il faudrait mieux expliquer ton problème en clair dans le texte si tu espères des réponses.
    Les gens n'ont pas forcément envie de passer du temps à aller lire d'autres pages internet pour comprendre le problème, ni d'aider quelqu'un qui n'a pas pris la peine de bien formuler sa demande.

    Un indice chez vous : dans certains cas les parenthèses indiquent un passage d'argument par valeur (ByVal par opposition à ByRef)

    A te lire

    Francis

  3. #3
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Par défaut
    Salut,

    pour simplifier, les parentheses ne sont necessaires que lors d'un appel de fonction dont le resultat est utilise par le reste du programme.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  4. #4
    Nouveau membre du Club

    Homme Profil pro
    Ing. dev
    Inscrit en
    Septembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing. dev
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 29
    Points : 29
    Points
    29
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Après un peu plus de 2 mois sans avoir reçu de réponse concrète je ferme cette discussion.

    A mon avis le problème de base vient des aléas d'un langage de base (Basic) qui a peut être un peu trop évolué. On peux faire des choses grandioses en VB sans rien connaitre et on se fait parfois ch..r avec des problème qui ne devrait pas exister dans un langage évolué.
    Toi pas tout bien comprendre ce que moi dire ? Pas grave, moi je me comprends (humour !)

    Et comme le stipule Francis :
    Les gens n'ont pas forcément envie de passer du temps à aller lire d'autres pages internet pour comprendre le problème, ni d'aider quelqu'un qui n'a pas pris la peine de bien formuler sa demande.
    Mais je prends sur moi.

    Amicalement
    Stéphane

  5. #5
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour,

    comme expliqué un peu partout notamment dans ton premier lien avec la fonction MsgBox
    pas besoin de parenthèse sauf en cas d'affectation du résultat !

    L'exception étant l'instruction Call, obsolète car on peut sans passer pour appeler une procédure et donc sans parenthèse …

    Et il n'y a aucun aléa sauf peut-être dans la compréhension du codeur …

    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 6
    Points
    6
    Par défaut A propos de Call
    les appels de ma procedure

    ma_procedure sans paramètre OK
    ma_procedure(param) un paramètre OK
    ma_procedure(param1, param2) deux paramètres ou plus : Erreur

    Le 3 ème cas oblige à passer par Call ma_procedure(param1, param2)
    Call marche aussi dans tous les cas

    Evidemment pour une fonction il faut faire une affectation en fonction du type du résultat

  7. #7
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Par défaut
    Bonjour,

    Evidemment pour une fonction il faut faire une affectation en fonction du type du résultat
    c'est faux.

    Tu peux très bien faire appel à une fonction sans utiliser son résultat, auquel cas l'affectation n'est nullement nécessaire
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Salut.

    1. Call est "obsolète" et ne sert qu'à appeler des procédures (Sub). Il peut être utilisé avec une fonction, mais il ne permet pas l'affectation de la valeur retournée. On ne peut donc pas avoir ValeurRetour = Call MaFonction(). Dans les faits, on ne l'utilise pas puisqu'il surcharge inutilement la lecture. Avec Call, on doit utiliser les parenthèses pour encadrer la liste des arguments: Call MaProc(A, B, C). On ne peut pas avoir Call MaProc A, B, C. On pourrait avoir certains arguments encadrés individuellement par des parenthèses (voir signification ci-desous): Call Test1((a), b) ou Call Test1((a), (b)). Avec un seul argument, on pourrait donc avoir Call Test1((a)) qui ne réalise pas la même chose que Call Test1(a)!!


    2. On ne peut pas utiliser les parenthèses autour des arguments d'un appel de proc sans Call. MaProc (A, B) n'est pas valide. On peut par contre encadrer individuellement certains arguments par des parenthèses et avoir MaProc (a) ou MaProc (a), b ou MaProc a, (b) ou MaProc (a), (b) (Voir significations ci-dessous).

    3. L'appel d'une fonction peut servir ou non à l'affectation d'une variable. Autrement dit, on peut utiliser une fonction comme une procédure, mais on ne peut alors pas mettre les parenthèses autour des arguments et la syntaxe est identique à celle de l'appel d'une procédure(*). On pourra par contre, comme pour une procédure, encadrer individuellement certains arguments (voir signification ci-dessous).

    On peut encadrer individuellement certains arguments par des parenthèses qui n'ont alors pas la même signification que les parenthèses englobant tous les arguments. Encadrer un argument entre parenthèses signifie qu'on le passe par valeur (ByVal). On peut donc avoir Test1 (a), b. Du coup, avec Call, on pourrait avoir Call Test1((a), b), et pour une fonction c = MaFonction((a), b). Cette façon de passer un argument permet de forcer le passage d'un argument en ByVal alors qu'il est renseigné en ByRef (type de passage par défaut) pour garantir que la variable passée ne sera pas modifiée par la fonction appelée, et donc qu'on en passe une copie.

    Nom : 2021-07-02_095534.png
Affichages : 758
Taille : 8,0 Ko


    A ma connaissance, on ne sait pas forcer le passage en ByRef d'un argument qui serait repris en ByVal dans la signature de la fonction.



    (*) La différence entre une procédure et une fonction en VBA est que la procédure ne renvoie jamais de valeur alors que la fonction en renvoie toujours une, même si elle n'est pas exploitée dans le code appelant. La procédure est similaire à une void function() rencontrée dans d'autres langages. Dans les faits, j'utilise très souvent des fonctions en lieu et place de procédures pour qu'elles soient invisibles dans la fenêtre des macros du côté applicatif (Excel, Word, ...).
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 224
    Points : 443
    Points
    443
    Par défaut
    Bonjour à tous, bonjour Pierre,

    Citation Envoyé par Pierre Fauconnier Voir le message
    On peut encadrer individuellement certains arguments par des parenthèses qui n'ont alors pas la même signification que les parenthèses englobant tous les arguments. Encadrer un argument entre parenthèses signifie qu'on le passe par valeur (ByVal). On peut donc avoir Test1 (a), b. Du coup, avec Call, on pourrait avoir Call Test1((a), b), et pour une fonction c = MaFonction((a), b). Cette façon de passer un argument permet de forcer le passage d'un argument en ByVal alors qu'il est renseigné en ByRef (type de passage par défaut) pour garantir que la variable passée ne sera pas modifiée par la fonction appelée, et donc qu'on en passe une copie.
    Excellent !
    Je ne connaissais pas.

    Merci pour le partage

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 05/01/2016, 10h29
  2. Réponses: 3
    Dernier message: 04/01/2009, 18h24
  3. Réponses: 1
    Dernier message: 06/09/2006, 18h11
  4. Réponses: 3
    Dernier message: 05/05/2006, 11h41
  5. Réponses: 5
    Dernier message: 20/10/2005, 10h42

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