OVH Cloud OVH Cloud

VBA et userform

10 réponses
Avatar
Romain Casey
Bonjour,
Dans un macro Word, j'ai un userform avec différentes casses à cocher,
etc. Et je voudrais pouvoir d'une utilisation sur l'autre de la macro
conserver les choix et les réutiliser la fois suivante.
Pour ce faire, j'ai stocké des données dans la base de registre
correspondant aux choix effectués. A l'exécution suivante, je lit ces
données et je voudrais donc obliger le userform à en tenir compte et là,
ça ne fonctionne plus...
Mettons que j'ai un bouton1, j'assigne à la variable B1 1 s'il est coché
et 0 autrement. J'ai ensuite fait qq chose du genre :
Private sub UserForm1_Initialize()
if B1=0 then
bouton1.value=true
else
buton1.value=false
end if
end sub

Et ça ne marche pas... J'ai vérifié B1 est bien définit correctement
c'est donc ma routine dans Initialize qui ne fonctionne pas. A chaque
fois, ce sont les valeurs définies dans les propriétés du bouton1 qui
sont appliqués...
Quelqu'un a t'il une idée de comment je dois faire ?

Merci.


Romain

10 réponses

Avatar
Anacoluthe
Bonjour !

Vérifiez dans UserForm_Initialize que B1 est bien une variable
booléenne publique. Lu comme ça B1 vaut /toujours/ zéro !

Anacoluthe
« Les hommes publics sont comme les filles publiques,
incapables de prendre leur retraite à temps. »
- Claude FRISONI


'Romain Casey' nous a écrit ...
Bonjour,
Dans un macro Word, j'ai un userform avec différentes casses à cocher,
etc. Et je voudrais pouvoir d'une utilisation sur l'autre de la macro
conserver les choix et les réutiliser la fois suivante.
Pour ce faire, j'ai stocké des données dans la base de registre
correspondant aux choix effectués. A l'exécution suivante, je lit ces
données et je voudrais donc obliger le userform à en tenir compte et là,
ça ne fonctionne plus...
Mettons que j'ai un bouton1, j'assigne à la variable B1 1 s'il est coché
et 0 autrement. J'ai ensuite fait qq chose du genre :
Private sub UserForm1_Initialize()
if B1=0 then
bouton1.value=true
else
buton1.valueúlse
end if
end sub

Et ça ne marche pas... J'ai vérifié B1 est bien définit correctement
c'est donc ma routine dans Initialize qui ne fonctionne pas. A chaque
fois, ce sont les valeurs définies dans les propriétés du bouton1 qui
sont appliqués...
Quelqu'un a t'il une idée de comment je dois faire ?

Merci.


Romain


Avatar
Romain Casey
Bonjour !

Vérifiez dans UserForm_Initialize que B1 est bien une variable
booléenne publique. Lu comme ça B1 vaut /toujours/ zéro !


B1 est une variable publique, et n'est pas un booléen mais un entier.
Ceci dit ça ne doit rien changer a priori (à part le fait que c'est plus
court de stocker 0/1 que true/false). Que je fasse :

public B1 as bollean
if B1 = true then

ou

public B1 as integer
if B1 = 1 then

le résultat devrait être le même. Le problème vient plutôt du fait que
dans initialize ce bout de code n'est pas pris en compte... D'ailleurs,
si je met un stop dans le Initialize, le programme ne s'arrête pas...
Alors même que d'autres instructions du initialise sont pris en compte
(.groupname en particulier).

Merci.


Romain

Avatar
Anacoluthe
Bonjour !

'Romain Casey' nous a écrit ...
B1 est une variable publique, et n'est pas un booléen mais un entier.
Ceci dit ça ne doit rien changer a priori (à part le fait que c'est plus
court de stocker 0/1 que true/false). Que je fasse :
public B1 as bollean
if B1 = true then


J'ai l'impression que vous vous mélangez dans la portée de B1...
Placez la lecture de B1 (au besoin par appel d'une fonction)
DANS Initialize et tout devrait s'arranger !

Anacoluthe
« Les hommes publics sont comme les filles publiques,
incapables de prendre leur retraite à temps. »
- Claude FRISONI

Avatar
Romain Casey
Bonjour !
[...]
J'ai l'impression que vous vous mélangez dans la portée de B1...
Placez la lecture de B1 (au besoin par appel d'une fonction)
DANS Initialize et tout devrait s'arranger !


C'est possible... Pour être certain de comprendre. Voici ce que j'ai :
- dans un module :
Public B1 as Integer
B1 = ... 'Ma valeur dans la base de registre
UserForm1.Show

- dans UserForm1
Public Sub UserForm1_Initialize()
If B1 = 1 Then
bouton1.Value = True
Else
bouton1.Value = False
End If

Où est le problème ?

Merci.


Romain

Avatar
Bonjour Romain,
Je pense que de temps en temps tu démarres ton test directement depuis
la UserForm.
Comme l'a justement suggéré Anacoluthe, pour éviter tout problèmes,
place la fonction de lecture de la base de régistre dans Sub
UserForm1_Initialize
Philippe

"Romain Casey" a écrit dans le
message de news:ca1ta8$tvr$
Bonjour !
[...]
J'ai l'impression que vous vous mélangez dans la portée de B1...
Placez la lecture de B1 (au besoin par appel d'une fonction)
DANS Initialize et tout devrait s'arranger !


C'est possible... Pour être certain de comprendre. Voici ce que j'ai :
- dans un module :
Public B1 as Integer
B1 = ... 'Ma valeur dans la base de registre
UserForm1.Show

- dans UserForm1
Public Sub UserForm1_Initialize()
If B1 = 1 Then
bouton1.Value = True
Else
bouton1.Value = False
End If

Où est le problème ?

Merci.


Romain



Avatar
JièL Goubert
Bonjoir(c) Romain Casey

Juste pour mettre mon grain de sel
Une variable booléenne a seulement 2 états, un entier en à des milliers ;-)
En terme de consision, le test
if B1 = true then
peut être écrit
if B1 then
le "= true" est superfétatoire ;-)))
alors que pour un entier, il faut effectivement tester la valeur.

dans une boucle tu peux ecrite
while b1
voire
wend B1
et ça suffit la aussi

c'est juste une habitude de travail, de taille de stockage (1 bit (en
théorie) au lieu de 2 octets pour l'entier) et de rapidité d'exécution.

--
La FAQ Outlook est la : http://faq.outlook.free.fr
JièL / Jean-Louis GOUBERT
Co-auteur de "Internet + de 1 000 trucs de pros" chez Micro Application
http://faq.outlook.free.fr/livreMA/internet_plus_de_1000_trucs_de_pros.htm

Le 07/06/2004 15:05 vous nous disiez ceci :
B1 est une variable publique, et n'est pas un booléen mais un entier.
Ceci dit ça ne doit rien changer a priori (à part le fait que c'est plus
court de stocker 0/1 que true/false). Que je fasse :

public B1 as bollean
if B1 = true then

ou

public B1 as integer
if B1 = 1 then

le résultat devrait être le même.


Avatar
Romain Casey
Bonjoir(c) Romain Casey

Juste pour mettre mon grain de sel
Une variable booléenne a seulement 2 états, un entier en à des milliers ;-)
[...]
c'est juste une habitude de travail, de taille de stockage (1 bit (en
théorie) au lieu de 2 octets pour l'entier) et de rapidité d'exécution.


OK. Merci du conseil.


Romain

Avatar
Romain Casey
Bonjour Romain,
Je pense que de temps en temps tu démarres ton test directement depuis
la UserForm.


Je dois avouer que je ne suis pas certain de comprendre...


Comme l'a justement suggéré Anacoluthe, pour éviter tout problèmes,
place la fonction de lecture de la base de régistre dans Sub
UserForm1_Initialize


C'est fait... et ça ne change absolument rien. On dirait que la fonction
initialize ne fonctionne pas... Enfin, pas tout à fait car comme je l'ai
dit, les .groupname fonctionnent mais pas le reste. Un autre idée ? Ou
un bout de code qui fonctionne chez vous ?

Merci.


Romain

Avatar
Bonjour Romain,
J'ai fait un test et je n'ai aucun problème, cela fonctionne
parfaitement.
Si tu le souhaites, je peux t'envoyer le document test.
Philippe

"Romain Casey" a écrit dans le
message de news:ca40uc$7ca$
Bonjour Romain,
Je pense que de temps en temps tu démarres ton test directement
depuis


la UserForm.


Je dois avouer que je ne suis pas certain de comprendre...


Comme l'a justement suggéré Anacoluthe, pour éviter tout problèmes,
place la fonction de lecture de la base de régistre dans Sub
UserForm1_Initialize


C'est fait... et ça ne change absolument rien. On dirait que la fonction
initialize ne fonctionne pas... Enfin, pas tout à fait car comme je l'ai
dit, les .groupname fonctionnent mais pas le reste. Un autre idée ? Ou
un bout de code qui fonctionne chez vous ?

Merci.


Romain



Avatar
Romain Casey
Bonjour Romain,
J'ai fait un test et je n'ai aucun problème, cela fonctionne
parfaitement.
Si tu le souhaites, je peux t'envoyer le document test.
Philippe


Ce serait avec plaisir. Merci.


Romain


PS : Pour mon mail, il suffit d'enlever WX. et .YZ.invalid