Ma variable publique est désinitialisée par mon UserForm

Ma variable publique est désinitialisée par mon UserForm - VB/VBA/VBS - Programmation

Marsh Posté le 02-03-2009 à 13:08:12    

Bonjour à tous ...
 
Je travaille sur des fichier Excel 2003 et VBA ,  mais bloque actuellement devant un problème auquel je ne comprend rien :
la fermeture d'une UserForm provoque la désinitialisation de mes variables publiques ...  
J'ai essayé de cerner au plus près le problème , alors plutôt qu'une longue description , je vous propose le test suivant ... ce sera bref , et ça me paraît très très étrange ..
 
Dans un fichier Excel tout neuf et vierge :
vous  insèrez 1seul UserForm avec 1 seul CommandButton dont le code est le suivant :
 

Code :
  1. OptionExplicit
  2. PrivateSub CommandButton1_Click()
  3.     Unload Me
  4. EndSub


 
ensuite , vous insèrez un seul module standard dont l'intégralité du code est le suivant :
 

Code :
  1. OptionExplicit
  2. Public Plage As Range
  3. Sub A()
  4. Set Plage = Range("A1:A10" )
  5.         UserForm1.Show
  6. EndSub


 
Après execution de cette macro , vous testez : ? Plage.Address dans la fenètre "Execution" .... et si c'est comme chez moi , vous obtenez l'erreur 91 ...
Première anomalie , je crois ...
 
et plus étrange encore : si on modifie la macro en rajoutant simplement un msgbox , autrement dit , la macro devient ça
 

Code :
  1. Sub A()
  2. Set Plage = Range("A1:A10" )
  3.         UserForm1.Show
  4.         MsgBox Plage.Address
  5. EndSub


 
et alors , l'éxécution de la macro ne provoque plus d'erreur et la variable "Plage" est stabilisée ... seconde étrangeté ...
 
et pour finir : 3iè mystère :  vous mettez en commentaire la ligne MsgBox Plage.Address , autrement dit on revient à la macro d'origine ... et bien l'éxécution de cette macro ne provoque plus l'erreur 91 , alors qu'elle la provoquait au début de ce test , ce qui , du coup me rend complètement dingue ...
 
Voilà , très probablement il y a une explication logique mais personellement , je sèche complétement ...
 
Merci beaucooup

Reply

Marsh Posté le 02-03-2009 à 13:08:12   

Reply

Marsh Posté le 03-03-2009 à 09:26:12    

Personnellement, pour les variables globales, je ne les déclare pas dans lesforms ni dans les feuilles (worksheet). Je les déclare dans les modules. Ca a toujours bien marché, donc c'est une méthode que je recommande.

Reply

Marsh Posté le 03-03-2009 à 09:40:02    

C'est normal comme comportement. Après exécution de la macro, tu n'es plus en mode exécution, puisque justement, la macro que tu as exécutée est terminée. Donc tes variables sont désallouée, et tout et tout !


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 03-03-2009 à 12:17:24    

olivthill a écrit :

Personnellement, pour les variables globales, je ne les déclare pas dans lesforms ni dans les feuilles (worksheet). Je les déclare dans les modules. Ca a toujours bien marché, donc c'est une méthode que je recommande.


Bin oui , mais c'est ce que j'ai fait , non ? ... puisque

Code :
  1. Public Plage as Range

est en tête de mon module standard ...

Reply

Marsh Posté le 03-03-2009 à 12:27:00    

kao98 a écrit :

C'est normal comme comportement. Après exécution de la macro, tu n'es plus en mode exécution, puisque justement, la macro que tu as exécutée est terminée. Donc tes variables sont désallouée, et tout et tout !


Peut être bien qu'en effet c'est normal comme comportement mais dans ce cas : uniquement dans l'étape 1 de mon test car dans les étapes 2 et 3 de mon test , j'interroge a nouveau "? Plage.address" après l'éxécution de la macro , et dans ce cas , conformément à ton explication , ma variable devrait être desallouée , alors que ça me renvois correctement l'adresse de Plage ....
 
C'est bien ça ce qui me trouble , c'est l'incohérence des 3 étapes du test ....  
 
A plus tard et merci RV

Reply

Marsh Posté le 03-03-2009 à 16:49:54    

Ta syntaxe "Range("A1:A10" )" veut en fait dire "ActiveWorkBook.ActiveSheet.Range("A1:A10" )"
Et aussi bien ActiveWorkBook que ActiveSheet peuvent varier en cours d'exécution du code en fonction de l'activation de certaines fenêtres Excel.
Si tu ajoutes à ça que la fenêtre d'exécution ne travaille pas tout à fait dans le même contexte que ton code (même en mode debug ; voir la commande With par exemple), tu as quelques pistes pour expliquer ton problème.
 
Conseil : il ne faut JAMAIS écrire ton code comme ça.
Il faut toujours référencer tes plages complètement par rapport à une variable WorkSheet au minimum.
Sinon tu vas au devant de grosses galères de debogage.
Même quand tu n'as qu'un classeur et qu'une feuille dans ce classeur.
Même quand tu as la flemme.

Reply

Marsh Posté le 03-03-2009 à 17:15:39    

Bonjour Tegu
 
Oui , ok , je vois ce que ce genre d'imprécisions peut entrainer comme emmerdes dans un fichier "normal" et en utilisation "normale" , et je retiens le conseil ... promis/juré , dorénavant j'applique à la lettre tes recommandations ....  
Mais le code que j'exposais est dans un fichier "test" vide de tout , et créé uniquement pour exposer mon problème ...
 
En fait , et au dela des incohérences entre les 3 étapes de mon test , il y a peut être un truc que je n'ai pas compris dans l'utilisation des variables publiques :  
J'espérais qu'une fois ma variable déclarée publique puis définie dans une macro A , je pouvais, tant que mon fichier était ouvert, récupérer cette définition dans toutes les autres macros de ce fichier , à n'importe quel moment , …
Apparemment c'est pas le cas , alors je vais retourner bricoler du coté des variables statiques , a moins que ça se termine avec la méthode paléolithique d'une cellule "gardienne" où je dépose l'information …
 
en tous cas , merci et peut être à plus tard RV

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed