Variable globale entre un module Feuil et un module userform [Résolu]

Signaler
Messages postés
20
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
2 octobre 2009
-
Messages postés
20
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
2 octobre 2009
-
Bonjour,

Dans un module Feuil, j'ai déclaré une variable globale.

J'aimerais pouvoir y accéder depuis un module userform.

Je n'y arrive pas :
- impossible de faire un accesseur dans le module Feuil
- impossible de mettre la variable en public dans le module Feuil

Comment procéder SVP ?

Merci.

Pilounet54

7 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Voir ma première réponse : Il faut déclarer la variable dans un Module
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut
Récap : Ton but est d'ouvrir une UserForm, puis, lors d'une validation, récupérer les données saisies sur cette UserForm depuis le code appelant ?

Donc, dans ta UserForm, il te faut déclarer les variables qui vont être lues par le code appelant lors de la fermeture (dans la partie Déclarations) :
Public sResultat As String
Cela signifie que la variable sera lisible partout dans le code, mais uniquement lorsque la UserForm est chargée.
Tout se joue ensuite sur la méthode de fermeture de la UserForm (UF) :
Quand utilises UserForm.Show (sans autre paramètre), cela signifie que la UF est chargée, puis affichée et le code appelant reste là jusqu'à la disparition de la UF
Si tu fermes ta UF (après la validation) avec un Unload, la UF disparait, mais elle est aussi déchargée, et ses variables avec.
Il ne faut donc pas la déclarger tout de suite, mais simplement la masquer avec .Hide
Dans ce cas, le code qui a suivi la commande .Show reprend du service.
La UF n'est plus visible, mais elle existe encore, avec ses variables :
Tu n'as plus qu'à lire tes variables, puis fermer proprement la UF.

Qui dit fermer proprement, dit charger proprement aussi. Voilà la méthode correcte à utiliser :
Code de l'appelant :
Dim maForme As frmMaUserForme  ' le nom de ta UF
Set maForme = New frmMaUserForme  
Load maForme ' On la charge sans la rendre visible
' Option : On peut envoyer des valeurs initiales aux variables de la UF :
maForme.maVariable = "le texte à proposer"
maForme.Show   ' Affichage de la UF et attente de fermeture
' La UF vient d'être rendue invisible : récupère la donnée
MsgBox maForme.maVariable
' Décharge la UF
Unload maForme
' Décharge son instance
Set maForme = Nothing

Code de la UF :
Dans la partie "Déclarations" :
Public maVariable As String

Dans le bouton "Ok" servant à valider les données saisies :
maVariable = maTextBox.Text
Me.Hide


Maintenant, si tu dois créer une variable qui garde sa valeur tout le temps et soit accessible de n'importe où dans le code, il faut déclarer cette variable en Public dans la partie Déclarations d'un Module : En créer un si besoin.

Nota : Le terme Global n'existe plus depuis VB4 (ça nous rajeunit pas).
Il faut utiliser Public, bien que Global fonctionne encore.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
20
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
2 octobre 2009

Merci.
C'est très clair.

Cependant mon but n'est pas tout à fait ça.

Dans le module feuil, j'ai déclarer en global un objet d'une classe personnelle.
Je souhaiterais dans le USF accéder à des propriétés (et peut-être des méthodes par la suite) de cet objet.

Ex : afficher dans un textbox d'un USF la propriété Name de l'objet déclaré en global dans le module Feuil

Suis-je clair ?

Merci.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Quand tu veux tu colles les quelques lignes que tu as utilisé pour ta déclaration
Je te l'ai dit, mieux vaut utiliser Public que Global.
Quand tu dis "module feuil", tu parles bien d'un fichier de type "Module" qui s'appelle "feuil" ?
Parce que j'ai l'impression quon ne parle pas de la même chose.
Messages postés
20
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
2 octobre 2009

Bonjour,

Je n'ai pas le code sous la main mais ce que j'appelle le module Feuil est en fait la partie de code reservée à un objet feuil du classeur (Feuil1 Feuil2 etc...)

Donc dans le code de Feuil1 (par exemple) j'ai :
private obj as my_class

Et dans le USF, ce que je souhaiterais par exemple faire:
USF.textbox1.text = Feuil1.get_obj.get_name


Si je déclare l'objet obj dans Feuil1 en private :
Je ne peux pas faire d'accesseur dessus (erreur à l'interprétation)

Si je déclare l'objet obj dans Feuil1 en public : également erreur à l'interprétation

Le seul moyen que j'ai trouvé pour l'instant est de créer des fonction dans Feuil1 qui me renvoient les propriétés de l'objet obj.
Ex : USF.textbox1.text = Feuil1.get_obj_name

Mais c'est pas fameux quand même. Ce serait bcp plus simple d'accéder directement à l'objet......

Merci.
Messages postés
20
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
2 octobre 2009

Bonjour,

J'essaierai Merci.

A+
Messages postés
20
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
2 octobre 2009

Merci. C'est ce qu'il me fallait. La variable est bien globale à tous les modules, Feuil et module de classe en la déclarant dans un module.

Merci
A+