OVH Cloud OVH Cloud

Passage d'une variable entre deux userform

12 réponses
Avatar
Ticker
Bonjour à tous, j'ai un problème simple (enfin, ça dépend pour qui, pour
moi,c'est une mission) mais que je traine depuis quelques jours. Alors
voilà:

J'ai deux userform

Avec la première j'effectue une recherche sur une feuille excel. Cette
recherche me donne une ligne ( Cells(Ligne,Colonne) )

Comment faire pour utiliser "Ligne" dans un autre userform ? J'ai chercher
avec les variables Public (et static) mais je dois mal mis prendre. Comment
faire ?

Merci d'avance pour votre aide précieuse.
Ticker

2 réponses

1 2
Avatar
Michel Gaboly
Re, Pierre.

Je ne me suis pas senti agressé ;-)) mais je prétend juste que cela ne
marche pas : si la variable a été modifiée pendant que le UserForm était
chargé, à l'aide d'un des contrôles de celui-ci, tu perds toute trace de cette
modif dès que le UserForm est déchargé (Unload).

Par conséquent, cela me paraît dangereux, dans la mesure où le résultat
obtenu n'est pas toujours le résulatt attendu.

Cependant, tu es libre ;-))))

Bonne fin de soirée aussi.



Bonsoir Michel

Tu joues sur les mots ;-))


En effet ... ;-)

J'aurais dû écrire : "Il est possible de passer une variable à un
userform..."
Personnellement, je préfère ma méthode... ;-), car elle permet de rendre un
userform autonome par rapport à un module standard, et donc d'être recopiée
dans un nouveau projet vba sans devoir tenir compte d'un module standard qui
lui permet de fonctionner...

Ce n'était évidemment pas une agression... ;-)

Bonne soirée

Pierre

Michel Gaboly wrote:
Bonsoir,

Tu joues sur les mots ;-))

Si pour employer la variable, tu es obligé de la qualifier avec le
nom du UserForm où elle a été définie, ce n'est pas réellement une
variable publique.

Pour ce faire, tu n'as d'ailleurs pas besoin de variable : tu peux
utiliser un contrôle quelconque du UserForm avec la propriété Visible
ou Enabled à False.

D'autre part, cela ne marche pas :

1 - Crée un nouveau classeur

2 - Bascule dans l'environnement VBA

3 - Insère un module standard, avec ce code :

Option Explicit
Public VeritableVarPublique

Sub Test()
UserForm1.Show
MsgBox "Num : " & UserForm1.Num
MsgBox "VeritableVarPublique : " & VeritableVarPublique
End Sub

4 - Insère un UserForm avec un CommandButton et ce code :

Option Explicit
Public Num As Integer

Private Sub UserForm_Initialize()
Num = 1
End Sub

Private Sub CommandButton1_Click()
Num = 2
VeritableVarPublique = 2
Unload Me
End Sub

5 - Exécute ensuite la Sub "Test" du module. Le UserForm est affiché,
puis 2 messages apparaissent successivement :

Num : 1

puis

VeritableVarPublique : 2


Alors qu'après le clic sur le CommandButton, ces 2 lignes ont été
exécutées :

Num = 2
VeritableVarPublique = 2

Pourtant Num est égal à 1 et non à 2

En fait, la dernière valeur de Num (2) n'est plus accessible après le
"Unload".

Pour afficher Num, la procédure recharge en mémoire le UserForm
(méthode Load et Non Show). Le code associé à l'événement Initialize
est exécuté, ce qui explique la valeur obtenue, 1.

Par contre, même après le Unload du UserForm, VeritableVarPublique
est toujours égale à 2.

La définition d'une variable Public dans un module standard
fonctionne, ce n'est pas le cas avec le module associé à un UserForm
: le mot-clef Public est accepté, mais c'est un leurre ;-(((



Bonjour

Il est tout à fait possible de déclarer une variable publique dans
un module de classe, et donc de userform. Cette variable devient
alors une propriété en lecture-écriture du le userform et on peut
l'appeler d'un code externe via l'objet userform qui la contient.
Cela évite les variables public dans un module standard

Dans le code du userform ( par exemple nommé UserForm1 ), on écrit,
en tête de module et après les éventuelles lignes Option ...
Public MaVariablePublique as Range ( pour reprendre l'exemple de
l'initiateur de la ficelle )

Dans le code externe au userform, on pourra utiliser cette variable
via UserForm1.MaVariablePublique = Cells(Ligne,Colonne)

--
Cela convient-il?
----
Pierre Fauconnier
"C'est lorsqu'il y a un temps mort qu'il faut tuer le temps..."
(remplacer NOSPAM par pfi pour me répondre. Merci)

---
Michel Gaboly wrote:
Bonsoir,

Il n'est pas possible de définir une variable Public dans le code
associé à un UserForm.

Il faut donc que la définisses dans un module standard :

Public NumLigne as Long

Dans le UserForm1, quand la recherche a abouti, tu rajoutes

NumLigne = Ligne

Dans le UserForm2, tu fais appel à NumLigne.

Selon les circonstances, il peut y avoir + simple : il n'est
peut-être pas néces- saire d'avoir 2 variables : dans le UserForm1,
tu peux peut-être utiliser la variable Public NumLigne directement,
et te passer de Ligne.



Bonjour à tous, j'ai un problème simple (enfin, ça dépend pour qui,
pour moi,c'est une mission) mais que je traine depuis quelques
jours. Alors voilà:

J'ai deux userform

Avec la première j'effectue une recherche sur une feuille excel.
Cette recherche me donne une ligne ( Cells(Ligne,Colonne) )

Comment faire pour utiliser "Ligne" dans un autre userform ? J'ai
chercher avec les variables Public (et static) mais je dois mal mis
prendre. Comment faire ?

Merci d'avance pour votre aide précieuse.
Ticker






--
Cordialement,

Michel Gaboly
http://www.gaboly.com





Avatar
Pierre Fauconnier
Je suis tout à fait d'accord avec toi.
Utiliser une propriété ( ou une variable déclarée publique dans un
userform ) n'est pas la même chose que d'utiliser une vraie variable
publique déclarée dans un module standard et dont la valeur est utilisable,
et modifiable, par tout module, quelle qu'en soit la nature.
Ma réponse était plutôt à comprendre comme : "Il existe une autre méthode
que la variable publique pour passer une valeur à un userform...", ce qui
était la question initiale initiale de Tiker...
Mais la finalité n'est pas la même, et l'utilisation de l'une ou l'autre
méthode dépendra de la volonté de récupérer la variable après fermeture de
la userform...

Pierre

Michel Gaboly wrote:
Re, Pierre.

Je ne me suis pas senti agressé ;-)) mais je prétend juste que cela ne
marche pas : si la variable a été modifiée pendant que le UserForm
était chargé, à l'aide d'un des contrôles de celui-ci, tu perds toute
trace de cette modif dès que le UserForm est déchargé (Unload).

Par conséquent, cela me paraît dangereux, dans la mesure où le
résultat obtenu n'est pas toujours le résulatt attendu.

Cependant, tu es libre ;-))))

Bonne fin de soirée aussi.



Bonsoir Michel

Tu joues sur les mots ;-))


En effet ... ;-)

J'aurais dû écrire : "Il est possible de passer une variable à un
userform..."
Personnellement, je préfère ma méthode... ;-), car elle permet de
rendre un userform autonome par rapport à un module standard, et
donc d'être recopiée dans un nouveau projet vba sans devoir tenir
compte d'un module standard qui lui permet de fonctionner...

Ce n'était évidemment pas une agression... ;-)

Bonne soirée

Pierre

Michel Gaboly wrote:
Bonsoir,

Tu joues sur les mots ;-))

Si pour employer la variable, tu es obligé de la qualifier avec le
nom du UserForm où elle a été définie, ce n'est pas réellement une
variable publique.

Pour ce faire, tu n'as d'ailleurs pas besoin de variable : tu peux
utiliser un contrôle quelconque du UserForm avec la propriété
Visible ou Enabled à False.

D'autre part, cela ne marche pas :

1 - Crée un nouveau classeur

2 - Bascule dans l'environnement VBA

3 - Insère un module standard, avec ce code :

Option Explicit
Public VeritableVarPublique

Sub Test()
UserForm1.Show
MsgBox "Num : " & UserForm1.Num
MsgBox "VeritableVarPublique : " & VeritableVarPublique
End Sub

4 - Insère un UserForm avec un CommandButton et ce code :

Option Explicit
Public Num As Integer

Private Sub UserForm_Initialize()
Num = 1
End Sub

Private Sub CommandButton1_Click()
Num = 2
VeritableVarPublique = 2
Unload Me
End Sub

5 - Exécute ensuite la Sub "Test" du module. Le UserForm est
affiché, puis 2 messages apparaissent successivement :

Num : 1

puis

VeritableVarPublique : 2


Alors qu'après le clic sur le CommandButton, ces 2 lignes ont été
exécutées :

Num = 2
VeritableVarPublique = 2

Pourtant Num est égal à 1 et non à 2

En fait, la dernière valeur de Num (2) n'est plus accessible après
le "Unload".

Pour afficher Num, la procédure recharge en mémoire le UserForm
(méthode Load et Non Show). Le code associé à l'événement Initialize
est exécuté, ce qui explique la valeur obtenue, 1.

Par contre, même après le Unload du UserForm, VeritableVarPublique
est toujours égale à 2.

La définition d'une variable Public dans un module standard
fonctionne, ce n'est pas le cas avec le module associé à un UserForm
le mot-clef Public est accepté, mais c'est un leurre ;-(((




Bonjour

Il est tout à fait possible de déclarer une variable publique dans
un module de classe, et donc de userform. Cette variable devient
alors une propriété en lecture-écriture du le userform et on peut
l'appeler d'un code externe via l'objet userform qui la contient.
Cela évite les variables public dans un module standard

Dans le code du userform ( par exemple nommé UserForm1 ), on écrit,
en tête de module et après les éventuelles lignes Option ...
Public MaVariablePublique as Range ( pour reprendre l'exemple de
l'initiateur de la ficelle )

Dans le code externe au userform, on pourra utiliser cette variable
via UserForm1.MaVariablePublique = Cells(Ligne,Colonne)

--
Cela convient-il?
----
Pierre Fauconnier
"C'est lorsqu'il y a un temps mort qu'il faut tuer le temps..."
(remplacer NOSPAM par pfi pour me répondre. Merci)

---
Michel Gaboly wrote:
Bonsoir,

Il n'est pas possible de définir une variable Public dans le code
associé à un UserForm.

Il faut donc que la définisses dans un module standard :

Public NumLigne as Long

Dans le UserForm1, quand la recherche a abouti, tu rajoutes

NumLigne = Ligne

Dans le UserForm2, tu fais appel à NumLigne.

Selon les circonstances, il peut y avoir + simple : il n'est
peut-être pas néces- saire d'avoir 2 variables : dans le
UserForm1, tu peux peut-être utiliser la variable Public NumLigne
directement, et te passer de Ligne.



Bonjour à tous, j'ai un problème simple (enfin, ça dépend pour
qui, pour moi,c'est une mission) mais que je traine depuis
quelques jours. Alors voilà:

J'ai deux userform

Avec la première j'effectue une recherche sur une feuille excel.
Cette recherche me donne une ligne ( Cells(Ligne,Colonne) )

Comment faire pour utiliser "Ligne" dans un autre userform ? J'ai
chercher avec les variables Public (et static) mais je dois mal
mis prendre. Comment faire ?

Merci d'avance pour votre aide précieuse.
Ticker












1 2