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 :

Variable publique - Hors du contexte


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Finance d'entreprise
    Inscrit en
    Juin 2016
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Finance d'entreprise
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2016
    Messages : 184
    Par défaut Variable publique - Hors du contexte
    Bonjour,

    J'aime bien dans mes procédure faire appel à une autre procédure qui fait gagner du temps à la procédure principale :

    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
    Sub Macro_Début()
     
            Application.ScreenUpdating = False
            IntÉCalc = Application.Calculation
            Application.Calculation = xlCalculationManual
            Set FlAct = ActiveSheet
     
    End Sub
     
    Sub Macro_Lambda
     
          Call Macro_Début
     
          Code...
     
          Call Macro_Fin
     
    End Sub
    Les variables IntÉCalc et FlAct sont publiques, de façon à ce que leur contenu soit réutilisé en fin de macro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Macro_Fin()
     
            Application.Calculation = IntÉCalc
            FlAct.Activate
     
    End Sub
    Le hic, c'est que leur valeur est perdue dès la fin de la procédure Macro_Début. L'espion indique "Hors de contexte".

    Dès fois ça le fait, dès fois ça ne le fait pas. Là, ça le fait, même après redémarrage...

    Pourquoi?!

  2. #2
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,

    Citation Envoyé par Dédé6621 Voir le message
    Le hic, c'est que leur valeur est perdue dès la fin de la procédure Macro_Début. L'espion indique "Hors de contexte".
    Ce n'est pas que la valeur est perdue et si tu lances une autre macro qui l'utilise tu verras qu'elle est toujours valorisée mais "Hors de contexte" signifie que ton code actuel n'est pas concerné.

  3. #3
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    Je t'invites à écrire option explicit en début de chaque module.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Citation Envoyé par Dédé6621 Voir le message
    Le hic, c'est que leur valeur est perdue dès la fin de la procédure Macro_Début. L'espion indique "Hors de contexte".
    Salut,

    Les paramètres, ca sert à quelque chose, utilises les.


    Citation Envoyé par Dédé6621 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Défait-toi de ces mauvaises pratiques immediatement, c'est de l'optimisation prématurée, ça ne t'apportera que des emmerdes.

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 715
    Par défaut
    Bonjour,

    En quoi cela serait-il une mauvaise pratique?
    C'est une manière classique d'éviter de perdre du temps à avoir Excel qui recalcule toutes les dépendances et rafraîchit l'affichage entre chaque modification faite par la procédure dans Excel. Sur des fichiers Excel lourds et/ou des traitements lourds, l'intérêt est important.
    Par contre, il faut l'associer à une gestion d'erreur pour être certain de correctement reconfigurer l'affichage et le rafraîchissement des formules en fin de traitement, qu'il ait réussi ou échoué (surtout que ces réglages ne parlent généralement pas aux utilisateurs).

    Personnellement je le gère dans la procédure en question directement (et je lance une msgbox avec un message de succès ou avec l'erreur rencontrée et complète généralement un log).
    Mais si l'on veut passer par une sous-procédure, on peut utiliser une variable globale pour stocker la valeur de Application.Calculation ou sinon passer une variable de la procédure appelante dans un paramètre ByRef de la sous-procédure de démarrage (cela permet donc de modifier cette variable dans la sous-procédure puis de réutiliser celle-ci en paramètre ByVal dans la sous-procédure de fin). Utiliser une variable globale sur ce genre de sujet ne me choque pas; les deux méthodes me semblent valables.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    @Promethee25:
    C'est une mauvaise pratique d'employer ces instructions:
    1) Avant d'avoir obtenu le comportement escompté.
    2) Avant d'avoir terminé les développements.
    3) Avant d'avoir mesuré les temps d'exécution.

    Et je te redirige sur cet article:
    Premature optimization is the root of all evil in software development

    Et les variables globales ... moins on en a, mieux on se porte.

  7. #7
    Membre confirmé
    Homme Profil pro
    Finance d'entreprise
    Inscrit en
    Juin 2016
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Finance d'entreprise
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2016
    Messages : 184
    Par défaut
    Citation Envoyé par anasecu Voir le message
    Ce n'est pas que la valeur est perdue et si tu lances une autre macro qui l'utilise tu verras qu'elle est toujours valorisée mais "Hors de contexte" signifie que ton code actuel n'est pas concerné.
    Malheureusement, les variables globales (ou variables publiques) ne récupèrent pas leur valeur lorsque le code principal arrive à la sous-procédure Marco_Fin, où ces variables se trouvent bien.


    Citation Envoyé par Thumb down Voir le message
    Je t'invites à écrire option explicit en début de chaque module.
    J'aurais peut-être dû mieux le préciser, mais toutes les variables sont bien déclarées (cf. commentaire ci-dessous).


    Citation Envoyé par deedolith Voir le message
    Et les variables globales ... moins on en a, mieux on se porte.
    En quoi les variables globales gênent-elles? En ce qui me concerne, j'en ai toute une nomenclature avec description et ça m'évite de réinventer la roue à chaque fois.
    Les deux variables utilisées sont ainsi déclarées et décrites dans un module à part:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public FlAct As Worksheet       'feuille active en début de macro
    Public IntÉCalc As Integer      'état du mode de calcul d'Excel

    Citation Envoyé par Promethee25 Voir le message
    Mais si l'on veut passer par une sous-procédure, on peut utiliser une variable globale pour stocker la valeur de Application.Calculation ou sinon passer une variable de la procédure appelante dans un paramètre ByRef de la sous-procédure de démarrage (cela permet donc de modifier cette variable dans la sous-procédure puis de réutiliser celle-ci en paramètre ByVal dans la sous-procédure de fin).
    Merci de la réponse. Ce sont bien des variables globales que j'utilise et ça m'étonne qu'elles perdent leur valeur d'une sous-procédure à une autre, vu leur nature.
    J'ai testé la méthode avec une variable locale déclarée dans la procédure principale passée à la sous-procédure avec un paramètre ByRef, et ça marche. Par contre, ça me paraît moins pratique et j'aurais bien aimé utiliser une variable globale.

    Est-ce que quelqu'un·e a une explication pourquoi ça ne marche pas avec des variables globales?

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Citation Envoyé par Dédé6621 Voir le message
    En quoi les variables globales gênent-elles? En ce qui me concerne, j'en ai toute une nomenclature avec description et ça m'évite de réinventer la roue à chaque fois.
    Attention de ne pas me faire dire ce que je n'ai pas dit.
    Les variables globales n'ont rien de mal en soit.
    C'est leur utilisation incontrôlée qui pose problème.

    Et c'est un constat: La prolifération des globales dans une application est souvent le signe d'erreurs de conception.

  9. #9
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    C'est parce que ta variable public est soit déclaré dans emplacement non accessible à l'ensemble du projet ???? Par exemple dan thisworkbook.

    Soit en plus de déclarer ta variable comme public, tu fais une autre déclaration dans une macro.

    Notes également que variable public dans une macro ne rime à rien !

    Ce que démontré ce fil c'est qu'il est préférable de passer en paramètres des variables locales plutôt que d'avoir recours à des variables public !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test1()
    Dim st as string
    St="salut"
    Test2 st
    End sub
    Sub test2(txt as string)
    Msgbox txt
    End sub

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/10/2015, 16h37
  2. proble declaration variable publique
    Par tlolo dans le forum Delphi
    Réponses: 8
    Dernier message: 05/07/2006, 19h13
  3. Timeout Variables Publiques.
    Par Le_Phasme dans le forum Access
    Réponses: 1
    Dernier message: 27/06/2006, 20h27
  4. Réponses: 11
    Dernier message: 11/05/2006, 10h09
  5. variables publiques ou module de classe ?
    Par niclalex dans le forum Access
    Réponses: 3
    Dernier message: 04/10/2005, 18h49

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