[Basic] Portée des variables globales

Bonjour,

J’ai un problème pour définir des events listener, mais en fait je me rends compte que celui-ci vient de la définition de variables globales, et se produit de la même manière avec de simples variables string… Retour à la base donc ! Voici un code Basic hyper… basique justement :

Global x As String
Global y As String

Sub Test1
    x="a"
    y="b"
End Sub

Sub Test2
	Msgbox x
	Msgbox y
End Sub

Si j’exécute Test1 puis Test2, pas de problème, deux msgbox s’affichent consécutivement avec les valeurs “a” et “b” respectivement. Je peux réexécuter la fonction Test2 autant de fois que je veux, tout va bien. Par contre si je commente la ligne ‘Msgbox y’ et que je réexécute Test2, x n’est plus défini ! Je dois alors exécuter Test1 puis Test2 pour afficher la valeur “a”, et si je décommente la ligne commentée, rebelote : ni x ni y ne sont définis.

Quelqu’un pourrait-il m’expliquer cette sorcellerie ?

EDIT : en fait c’est encore même plus simple : avec une seule variable la même chose se produit si je rajoute une ligne vide. Est-ce que la valeur affectée à une variable globale n’est accessible qu’aux procédures et fonctions existant déjà au moment de l’affectation ?

Bonjour @willy35

Ce que tu décris ne se produit que si tu modifies le code du module dans lequel figure la déclaration (global). En effet ceci génère “normalement” la réinitialisation du module.

Tu peux le vérifier en mettant dans un module dédié la déclaration (module1 par ex.) et tes procédures Testx dans un autre module. Lancer Test1, puis modifier Test2 (ajouter une ligne par exemple), exécuter : les variables n’ont pas été réinitialisées.

Ceci (la modification du code) ne devant se produire qu’en phase de développement cela ne pose pas de problème en “production” où les variables ne seront pas réinitialisées.

J’ajoute que :

  • dédier un module à la déclaration peut être une bonne pratique dans ce cas puisque, par définition, les variables globales sont accessibles dans les autres bibliothèques/modules.
  • c’est aussi une bonne pratique de ne pas compter sur les initialisations “par défaut” du logiciel concernant les variables.

Cordialement

Bonjour @pierre-yves

Merci beaucoup pour cette explication très claire. Effectivement cela parait logique après coup :slight_smile:
J’ai déplacé mes variables globales dans un autre module et ça marche.
Le problème concerne en effet la phase de développement, car je n’arrivais plus à enlever un listener que j’avais attaché à une cellule (définis globalement tous les deux) dès que je modifiais mon code. Pas pratique de devoir fermer l’application à chaque fois…

Pas pratique de devoir fermer l’application à chaque fois…

En principe tu as dû créer des procédures pour lancer/arrêter les listeners ; il suffit de penser à la/les lancer avant tes modifications.

Cordialement

Oui, encore faut-il y penser :slight_smile: Définir les variables globales dans un module séparé pour ne pas avoir besoin d’arrêter les listeners à chaque modification du code me parait plus élégant !