Variable globale entre un module Feuil et un module userform

Résolu
pilounet54
Messages postés
20
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
2 octobre 2009
- 9 août 2009 à 15:02
pilounet54
Messages postés
20
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
2 octobre 2009
- 18 août 2009 à 09:53
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

cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
78
10 août 2009 à 15:35
Voir ma première réponse : Il faut déclarer la variable dans un Module
3
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
78
9 août 2009 à 16:15
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)
0
pilounet54
Messages postés
20
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
2 octobre 2009

9 août 2009 à 19:11
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.
0
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
78
10 août 2009 à 01:43
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pilounet54
Messages postés
20
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
2 octobre 2009

10 août 2009 à 12:47
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.
0
pilounet54
Messages postés
20
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
2 octobre 2009

10 août 2009 à 19:16
Bonjour,

J'essaierai Merci.

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

18 août 2009 à 09:53
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+
0