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 :

Utiliser des paramètres optionnels pour retourner des variables au code appelant


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 212
    Points : 334
    Points
    334
    Par défaut Utiliser des paramètres optionnels pour retourner des variables au code appelant
    Bonjour,

    Je souhaiterai connaitre les risques d'utiliser des paramètres optionnels dans une fonction ou une procédure pour retourner des variables au code appelant.
    C'est comme une fonction dont on n'utilise pas le résultat dans certains cas...

    Pour illustrer cela, voici l'exemple d'une fonction permettant d'ouvrir un fichier EXCEL :
    Cette procédure a pour paramètre obligatoire le chemin du fichier EXCEL à ouvrir et comme paramètres optionnels une variable Excel.Workbook et une variable Excel.Worksheet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub OpenMyWkb(FullName As String, Optional WkbToOpen As Excel.Workbook, Optional WksToSet As Excel.Worksheet)
    ...
    Set WkbToOpen = ActiveWorkbook
    Set WksToSet  = ActiveSheet
    ...
    End Sub
    Le code appelant peut donc demande de récupérer uniquement l'objet classeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call OpenMyWkb(chemin, myWkb)
    Uniquement l'objet feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call OpenMyWkb(chemin, myWks)
    Que devient dans ces 2 cas la variable qui n'est pas spécifiée dans le code appelant ?
    L'espace mémoire est-il purgé correctement ?

    D'avance merci pour vos réponses.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  2. #2
    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 594
    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 594
    Points : 34 263
    Points
    34 263
    Par défaut
    Salut,

    un peu de lecture sur les parametre optionnels :
    http://silkyroad.developpez.com/vba/fonctions/#LII-E
    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

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je ne comprends pas trop la question!

    Les paramètres optionnel sont type, tu les utilises ou pas mais si tu les utilises il faut leurs fournir un variable du bon type.

    Dans ton exemple Optional WkbToOpen As Excel.Optional ! Pourquoi veux tu récupérer un Optional Workbook alors que c'est justement ça qu'il faut lui fournir!


    Ce n'est pas comme si tu utilisais un fonction qui retourne un objet, et que de paramètres optionnels de type string te permutais de switcher l'objet retourné!

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

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Que devient dans ces 2 cas la variable qui n'est pas spécifiée dans le code appelant ?
    L'espace mémoire est-il purgé correctement ?
    De toute façon tu n'as pas la main sur le garbage collection, pas d'autre choix que de lui faire confiance pour les variables.
    Il n'y a que les objets que tu peux mettre à nothing.

    eric

    en complément :
    Je mettrais en paramètre :
    , Optional WksToSet As Excel.Worksheet = Activesheet)pour qu'il soit défini en cas d'absence, et à la fin :
    WksToSet = Nothingidem pour le wb

  5. #5
    Invité
    Invité(e)
    Par défaut
    De toutes les façons les paramètres optionnels dans une sub n'ont d'intérêt que de faire varier le traitement en fonction de leurs présence ou non bien évidemment il faut tester les valeurs.

    Passe un ou toutes les variables objet au par définition on connait avant l'utilisation de la sub est une hérésie!

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 212
    Points : 334
    Points
    334
    Par défaut
    Merci pour vos retour.

    @jpcheck:
    Je connais se tutoriel mais dans mon cas je veux rester avec des variables typées (j'aurais du le préciser !).
    Pas de type Variant et d'utilisation de IsMissing si c'était ton propos.

    @rdurupt:
    Je ne te suis pas non plus...
    Dans ton exemple Optional WkbToOpen As Excel.Optional ! Pourquoi veux tu récupérer un Optional Workbook alors que c'est justement ça qu'il faut lui fournir!
    Ce n'est pas comme si tu utilisais un fonction qui retourne un objet, et que de paramètres optionnels de type string te permutais de switcher l'objet retourné!
    Je vais exprimer mon exemple différemment via 2 fonctions...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function OpenAndSetMyWkb(FullName As String) As Excel.Workbook
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function OpenWkbAndSetWorksheet(FullName As String) As Excel.Worksheet
    L'exemple de mon premier POST permet de regrouper les 2 fonctions ci-dessous en 1 seule procédure.
    Par contre, cette procédure affecte le classeur et la feuille aux variables qui sont dans ces 2 paramètres alors que le code appelant peut en indiquer 0, 1 ou 2 (vu qu'ils sont optionnels !). La question est : comment cela est géré et quelles sont les éventuels problèmes liés à cette méthode.

    @eriiic:
    De toute façon tu n'as pas la main sur le garbage collection, pas d'autre choix que de lui faire confiance pour les variables.
    Il n'y a que les objets que tu peux mettre à nothing.
    Effectivement, c'est le rôle du garbage d'identifier que la variable doit être détruite en mémoire mais j'aurais bien voulu m'assurer de ce comportement et vérifier que c'est le seul problème possible...
    Par rapport à ton complément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Optional WksToSet As Excel.Worksheet = Activesheet
    J'ai déjà pensé à cela mais ce n'est pas possible car les valeurs par défauts doivent être des constantes !
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 212
    Points : 334
    Points
    334
    Par défaut
    @rdurupt:
    Je n'avais pas vu ton dernier retour lors de mon précédent POST...
    L'utilisation des paramètres ByRef dans une procédure pour transmettre des variables au code appelant te parait une hérésie ?
    Il me semblait que c'était souvent utilisé.
    L'écart ici, c'est que ces paramètres sont optionnels...
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ce qui me parait un hérésie c'est d'utiliser une sub pour passer des objets afin de récupérer le même type d'objets, alors qu'il est plus rapide d'instancier les objets en amont de la sub.

    Il faut noter que l'objet du poste est un sub qui instancie de objets à la procédure appelante en fonction de paramètres optionnels!

    Il faut penser également à tester la présence des objets, données la priorité à l'un ou l'autre ou les deux, alors qu'on le sait avant la sub et que celle ci n'apporte rien d'indispensable !

    Passe un tableau en paramètres à un sub dans le but de le trier n'est pas un hérésie car la variable subit un traitement. Le but d'une méthode est de simplifier un code répétitif, en quelque sorte d'en simplifier l'écriture.

    Dans notre cas passer des paramètres qu'il est possible de connaitre avant la sub n'est pas réducteur de code.

    Faire un traitement avec de paramètres optionnels oui ou simplifie la lisibilité du code.
    Dernière modification par Invité ; 22/08/2016 à 14h22.

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 212
    Points : 334
    Points
    334
    Par défaut
    L'idée que j'ai en tête, c'est plutôt de créer une procédure qui regroupe un certain nombre de tâche de vérification et qui renvoie plusieurs types de variables que des codes appelant peuvent utiliser en fonction de leurs besoins (mutualisation).
    Dans mon exemple, ce serait pour vérifier que toutes les feuilles prévues d'un classeur sont disponibles...

    Après, et c'est ou je te rejoints, je devrais utiliser une fonction...
    (une procédure réalise un traitement sur des données en paramètre / une fonction renvoie une variable issue des données en paramètre)
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Après, et c'est ou je te rejoints, je devrais utiliser une fonction...
    (une procédure réalise un traitement sur des données en paramètre / une fonction renvoie une variable issue des données en paramètre)
    Ravs de t'avoir ramené à la raison!

    Déclare des string optionnels et si <>"" tu tes la présence dans le classeur.

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/07/2021, 09h47
  2. [CR XI] Comment utiliser des paramètres optionnels ?
    Par juju05 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 03/07/2015, 12h57
  3. [AC-2000] Erreur : Aucune des valeurs données pour plusieur des paramètres requis
    Par mcfly37 dans le forum VBA Access
    Réponses: 10
    Dernier message: 21/04/2009, 14h11
  4. Réponses: 1
    Dernier message: 27/11/2008, 10h55
  5. [débutante]utiliser les classes css pour surligner des liens
    Par Mitaka dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 06/01/2006, 09h37

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