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 :

Comportement d'une variable Global


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2016
    Messages : 7
    Par défaut Comportement d'une variable Global
    Bonjour,

    J'ai un souci qui se rapproche du thème de cette dicsussion,mais avec une variable Global (de plus assez peu documentée sur Internet...):

    J'ai une variable de type Global déclarée dans un module standard, avant le début des procédures Sub: donc normalement utilisable par tous les modules et USF.
    3 procédures similaires affectent une valeur différente à cette variable,en tout début d'execution, qui doit être récupérée par un USF unique, qui est appelé après que l'affectation de ma variable Global ait été modifiée.

    Dans l'USF l'appel à la variable Global se fait par une procédure Private_Sub initialize qui est lancée par l'instruction .show de ma procédure. Le but étant que mon USF affiche dans un champ le texte de la variable Global, dont ma procédure vient de modifier la valeur.

    Or le comportement constaté n'est pas celui attendu, et plûtot curieux, car il se rapproche d'un variable Static:
    -l'usf prend comme valeur de ma variable Global celle qui a été donné par la dernière procédure exécutée, mais pas celle qui est en cours (il ne met pas à jour la valeur de la variable).
    -quand j'execute ma procédure à 2 reprises, ma var. Global prend la valeur attendue dans l'USF, correctement, mais à cette deuxième exécution seulement
    -encore plus curieux : quand je lance ma procédure en mode Pas à Pas: ma variable globlale est correctement affectée, et ensuite correctement reconnue par l'USF, et cette fois-ci dés la première execution de la procédure!

    Pour précision après l'affichage de l'USF, il y a dans ma procédure une instruction d'attente "Do Events" (mais après l'affichage de l'USF, donc à priori sans rapport de causalité).


    Par ailleurs j'utilise une variable Global mais dans l'autre sens : affectée par un USF pour être reconnu par une procédure Sub : là aucun soucis...

    Qu'en pensez vous?

    Benoit

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Vbenoit37 Voir le message
    Bonjour,

    Déclarez-vous systématiquement vos variables ? Cf réglage de l'éditeur VBA.
    Y aurait-il une variable de même nom déclarée à l'intérieur d'un module, userform ou d'une procédure utilisée par le code ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2016
    Messages : 7
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message
    Bonjour,

    Déclarez-vous systématiquement vos variables ? Cf réglage de l'éditeur VBA.
    Y aurait-il une variable de même nom déclarée à l'intérieur d'un module, userform ou d'une procédure utilisée par le code ?
    J'ai bien une seule variable de déclarée (j'ai vérifié....)
    De plus je n'ai pas le bug de litige de variables, juste un comportement inattendu...

    Et ce que je comprends vraiment pas: en Pas à Pas tout fonctionne normalement...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Fais un click droit sur ta variable->ajouter à l'espion->sur changement.

  5. #5
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Personellement je n'utilise pas "Global" pour déclarer la portabilité d'une variable mais "Public"
    et ce depuis très longtemps sans avoir eu de problème

    je vais même plus loin je crée un module que je renome "Declaration" et j'y mets toutes mes variables en déclarant Public, avec un commentaire derrière pour pouvoir savoir à quoi elle sert.

    Ce qui m'évite de déclarer deux variable pour faire la même chose ou à l'inverse utiliser une même variable pour faire 2 chose différentes
    du genre : la variable Num_Ligne pour passer d'un ligne à l'autre sur la Feuille1 ... et sur la feuille2

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2016
    Messages : 7
    Par défaut
    Citation Envoyé par Igloobel Voir le message
    Bonjour,

    Personellement je n'utilise pas "Global" pour déclarer la portabilité d'une variable mais "Public"
    et ce depuis très longtemps sans avoir eu de problème

    je vais même plus loin je crée un module que je renome "Declaration" et j'y mets toutes mes variables en déclarant Public, avec un commentaire derrière pour pouvoir savoir à quoi elle sert.

    Ce qui m'évite de déclarer deux variable pour faire la même chose ou à l'inverse utiliser une même variable pour faire 2 chose différentes
    du genre : la variable Num_Ligne pour passer d'un ligne à l'autre sur la Feuille1 ... et sur la feuille2

    J'ai exactement le même comportement avec une variable Public; et qu'elle soit placé dans le même module, ou dans un autre... donc pas ça
    J'ai pas plusieurs variables déclarées, mais bien un seule: la Global (ou Public apparemment c'est kif-kif...)
    Mais elles sont affectées dans 3 procédures différentes ,avec une valeur différente : c'est bien le job et l’intérêt d'une variable globale (ou pas d'ailleurs) de prendre des valeurs différentes selon une condition ou le choix de l'utilisateur (cas ici)
    Dans mon cas l'utilisation de cette variable unique m'évite de faire 3 fois le même USF, ce qui là serait aberrant...
    J'ai testé dans un autre fichier avec une procédure simplifiée: ce cas de figure fonctionne (comportement Ok de la variable globale)...

  7. #7
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Vbenoit37 Voir le message
    J'ai exactement le même comportement avec une variable Public; et qu'elle soit placé dans le même module, ou dans un autre... donc pas ça
    J'ai pas plusieurs variables déclarées, mais bien un seule: la Global (ou Public apparemment c'est kif-kif...)
    Voici le résultat de mes recherches :

    Nom : Capture Global2.png
Affichages : 1308
Taille : 100,1 Ko

    Donc ils préconisent Public que Global, et ce n'est qu'un exemple parmi d'autres sur le web

    As-tu essayér Public à la place de Global ?

    Tu dis

    A+

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2016
    Messages : 7
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    Bonjour,

    Fais un click droit sur ta variable->ajouter à l'espion->sur changement.
    Bonjour,

    J'ai testé mais la procédure ne s’arrête jamais...

  9. #9
    Invité
    Invité(e)
    Par défaut
    poste un fichier Excel en exemple.

  10. #10
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Par défaut
    bonjour,
    ne pas confondre Global Const et Public

    de plus , ne pas declarer a nouveau dans la sub ou fonction ...

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  11. #11
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mjpmjp Voir le message
    bonjour,
    ne pas confondre Global Const et Public

    de plus , ne pas declarer a nouveau dans la sub ou fonction ...

    @+JP
    Certes il ne faut pas confondre on peut ajouter Static aussi

    mais ce que j'explique c'est la différence entre Public et Global

    voir mes posts précédent

  12. #12
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Par défaut
    re,
    on s'est croisé ...
    la réponse était pour : Vbenoit37 ...
    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2016
    Messages : 7
    Par défaut
    Bonjour,
    Suite aux Post j'ai effectivement testé Public et j'ai exactement les mêmes comportements.
    Sur la distinction entre les 2,je dois avouer que mes connaissances sur cette question sont effectivement limitées mais les réponses postées confirment mon intuition suite à différentes lectures:il s'agit d'une évolution du langage ?Nouveau mot clé remplaçant l'autre?
    En effet selon les sources,même bouquins, soit on parle de Global,soit on parle de Public,mais rarement des 2 en même temps...
    Si certains ont des sources documentaires sur le sujet je suis preneur.

    Mais je reviens à mes moutons car même si c'est intéressant,dans mon exemple la distinction est sans effet...

    Je vais retenter encore du débogage ce soir avec les conseils de Dysorto, mais mes espoirs sont limités vu que le comportement anormal n'est pas constaté dans une execution Pas à Pas ;ce que je ne comprend pas du tout et ça m'agace!

    Je vais vous préciser le problème en le schématisant, plutôt que poster le fichier,pour l'instant au moins (doc de facturation donc confidentiel...)

    A noter que c'est plus l'enjeu théorique de la question qui m’intéresse; pour mon cas sans grosses incidences car j'ai contourné le problème en mettant une phrase bateau pour l'instant...

    Ce qui m'agace, c'est que c'est un outil pour faire du code propre et modulaire, et donc pour ça que j'aimerais savoir ce qui se passe...

    Tout d'abord précision sur le "comportement inattendu" :plus que d'être inattendu, il est complètement illogique!!

    J'ai 3 sub quasi similaires, A,B,C (choix peut-être contestable, mais pour une économie de clics sur une procédure lancée très souvent)
    j'ai donc une Global déclarée (une seule fois ) en tête de module (ou Public)
    Dans mes 3 subs, une affectation différente, en début de sub. Appelons ces valeurs aussi A,B,C pour le schéma (non elles ne prennent pas le nom de mes sub ).
    Postérieurement à cette affectation, l'instruction d'affichage d'un petit formulaire, en non Modal (show False), lequel fait appel à cette variable Global dont la valeur (normalement!!) vient d'être modifiée. Et une instruction "Do Events" pour mettre l’exécution du code en attente tant que le formulaire est affiché.

    Sur ma feuille j'ai donc 3 boutons pour mes 3 subs.
    Voici le comportement constaté:
    -Premier lancement (par exemple suite à l'ouverture du fichier):
    -lancement de Sub A, Global =A >>> c'est Ok !!
    -lancement de Sub B, Global =A (encore!!) >>> l'instruction de nouvelle affectation a été ignorée
    -lancement de Sub B une seconde fois : cette fois-ci Global=B !!!
    -lancement de Sub C, Global= B (tssss,arfff)
    -deuxième lancement de Sub C, Global = C (quand même!)

    Et ainsi de suite... Pour résumer , à chaque fois ma Global prend la bonne valeur à la deuxième execution de la même Sub!! Genre il faut taper 2 fois pour qu'il comprenne....

    Et vous le voyez, j'ai un comportement de variable Static,alors que j'ai aucune variable ou procédure Static dans mon code!!

    Et c'est que en execution simple; en Pas à Pas tout norma!! affectation Ok, affichage Ok par l'Usf (prise en compte de la nouvelle valeur)


    Mais par contre j'ai lu un article sur des dangers potentiels de "Do Events" et des perturbations possibles....J'ai de fortes suspicions la-dessus... Ca parle à quelqu'un?.....

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Sur la première ligne de chaque module écris option explicit.

  15. #15
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Par défaut
    bonjour,
    dans le post #13
    Et une instruction "Do Events" pour mettre l’exécution du code en attente tant que le formulaire est affiché
    essais sans Do Events...

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  16. #16
    Invité
    Invité(e)
    Par défaut
    Une variable public dans thisWorkbok ne sera visible que dans thisworbook ou par déclinaison.

    Une variable public dans un UserForm ne sera visible que dans Le UserForm ou par déclinaison.

    Une variable public dans un module de classe ne sera visible que du module de classe ou par déclinaison.

    Une variable global dans un module standard ne sera visible que dans tout le classeur.

    Une variable public dans un module standard sera vue que dans le classeur ou par déclinaison.

    Une variable public doit être déclaré qu'une seule fois dans un module standard.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    thisworbook.maVarable 
    UserForm1.maVariable
    Classe1.mavariable
    MaVariable 'module standard public au niveau du classeur
    Modul1.maVariable Cette écriture est possible.
    AutreClasseur.maVariable
    Thisworkbook.sheet1.maVariabl =thisworkbook.sheet2.mavariable
    Dernière modification par Invité ; 14/09/2018 à 09h32.

  17. #17
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, j'utilise très peu les variables globales et je préfère m'en passer autant que possible. Les userform peuvent recevoir, juste avant le Show, les variables nécessaires et les restituer après le Hide.

    Les procédures et fonctions peuvent recevoir des arguments, passés par défaut en référence (ByRef), permettant d'éviter les variables globales et publiques. J'en profite pour rappeler que:
    • une variable publique d'un module de classe (classe perso, feuille, classeur, userform, ...) doit être considérée comme une propriété publique de l'élément dans lequel elle est déclarée et n'est pas une variable globale ou publique;
    • que plusieurs variables de même nom, mêmes publiques, peuvent cohabiter au sein d'un même projet dans des modules différents, même standards, et qu'il suffit alors de les préfixer du nom du module qui les supportent pour pouvoir les utiliser sans se mélanger les pinceaux (valable aussi pour les procédures et fonctions, d'ailleurs).
    "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...
    ---------------

  18. #18
    Invité
    Invité(e)
    Par défaut
    entièrement d'accord, je préfère passe des valeur en paramétrés a une méthode!

Discussions similaires

  1. [Sécurité] Activation d'une variable globale
    Par Ricou13 dans le forum Langage
    Réponses: 3
    Dernier message: 28/09/2005, 10h24
  2. [quai debutant] : creation d'une variable globale.
    Par bapman344 dans le forum Access
    Réponses: 4
    Dernier message: 23/06/2005, 11h33
  3. Réponses: 5
    Dernier message: 25/05/2005, 22h29
  4. Comment déclarer une variable globale
    Par davkick dans le forum C
    Réponses: 13
    Dernier message: 20/05/2005, 18h50
  5. utilisation d'une variable globale
    Par ZZ dans le forum ASP
    Réponses: 3
    Dernier message: 03/12/2003, 19h11

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