Userform - Unload me ne fonctionne pas

La braise

XLDnaute Occasionnel
Bonjour à tous,

J'ai un outil développé sur Excel 2003 ou je passe de userform en userform à l'aide de :

Unload me
UF_2. show

puis
Unload me
UF_3.show

et tout marche nickel.


Sur 2007 :mad:les userforms s'empilent les uns sur les autres.

J'ai essayer avec Me.hide meêm résultat.

Est-ce que quelqu'un a déjà rencontré ce Pbm et surtout quelle est la solution qu'il a trouvé :)

D'avance merci pour votre aide.

Cordialement.
 

Dranreb

XLDnaute Barbatruc
Re : Userform - Unload me ne fonctionne pas

Bonjour.
De toute façon même en Excel 20003, ce que vous décrivez ne me semble pas très correct, car toutes les exécutions des procédures exécutant des Show restent bloquées sur tous ces Show tant que les userform demeurent affichés. Vous accumulez sans le savoir plein d'appels récursifs. À moins qu'ils n'aient leurs propriétés ShowModal à False, alors là vous faites ce que vous voulez.
Mais vous pouvez à tout hasard essayer des M.Hide avant les Show et Unload Me seulement après, au moins comme ça la mémoire allouées aux Userform ne sera pas utilisée à autre chose tant qu'ils ont encore une procédure dont l'exécution ne s'est pas terminée…
 

La braise

XLDnaute Occasionnel
Re : Userform - Unload me ne fonctionne pas

Bonjour, Merci pour vos réponses.
Ci-joint un exemple de la méthode que j'utilise.
Ici un fichier .xlsm crée sur 2007.

Le pbm ne se pose pas. l'enchainement est correct entre les UF.

Le pbm se pose sur les fichiers .xls crée sur 2003 lors de leur utilisation sur 2007.

Je vais essayer la solution préconisée par Dranreb et je vous tiens au courant.

:)
 

Pièces jointes

  • Test Xldown.xlsm
    14.1 KB · Affichages: 56

Dranreb

XLDnaute Barbatruc
Re : Userform - Unload me ne fonctionne pas

Bonjour.
Oui j'ai fait un essais: si vous mettez un point d'arrêt sur un des Unload puis que vous examinez la pile des appel vous pouvez constater que toutes les procédures CommandeButton1_Click y restent empilées, entrecoupées de <Code non visual Basic> (c'est le gestionnaire d'évènements) jusqu'à ce qu'enfin le dernier Userform soit déchargé via son bouton système.
Il vaudrait mieux une procédure dans un module ordinaire qui affiche alternativement les deux Userform dans une boucle jusqu'à une condition exprimée par une variable Public déclarée As Boolean.
(Si toutefois vous ne pouvez vraiment pas mettre leur propriété ShowModal à False ni faire un seul Userform avec un multipage par exemple.)
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : Userform - Unload me ne fonctionne pas

Re

Salut bernarD

Curieux !!
J'ai créé essai_USF en xls avec xl2003, testé ,repris avec xl2007 ,enregistré en xlsm et testé à nouveau et ....
Pas de problème
Tester les 2 fichiers
 

Pièces jointes

  • essai_usf.xls
    27 KB · Affichages: 45
  • essai_usf.xlsm
    16.6 KB · Affichages: 51

Dranreb

XLDnaute Barbatruc
Re : Userform - Unload me ne fonctionne pas

Salut pierrejean.
Oui, parce que l'espace mémoire réservé à la pile est quand même assez grand.
Il n'y a pas que les adresses de retours des sous programmes qui y sont rangés mais aussi toutes les paramètres éventuels et toutes les variables locales. Et tous ça n'est libéré que lorsque tous les Show peuvent enfin tour à tour se terminer.
As tu fait l'essai que j'ai indiqué au #8 ? Chaque fois que tu clique sur un bouton ça ajoute deux lignes à la pile.
Ça peut marcher un moment, mais… en tout cas ce n'est pas correct. Et personnellement je ne suis pas étonné qu'à un moment ça plante, surtout que les unload avant les Show n'arrangent sûrement rien.

Par contre en faisant partout des UserFormX.Show 0 ou en mettant leurs propriétés ShowModal à False la pile des appels ne montre toujours qu'une seule ligne, celle du UserformX.CommandButton1_Click.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Userform - Unload me ne fonctionne pas

Bonjour MJ13.
Ta solution encombre aussi la pile. Fais l'essai, met un point d'arrêt sur un Show et interroge la pile des appels.

La seule solution à part celle qui aurait ma préférence serait une procédure chef d'orchestre de ce genre :
VB:
Public ArrêterLesFrais As Boolean

Sub AficherAlternativement()
Do
   UserForm1.Show
   If ArrêterLesFrais Then Exit Sub
   UserForm2.Show
   Loop Until ArrêterLesFrais
End Sub
Et dans les userform une procédure:
VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
ArrêterLesFrais = CloseMode <> vbFormCode
End Sub
… au minimum.
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Userform - Unload me ne fonctionne pas

Re

Ta solution encombre aussi la pile. Fais l'essai, met un point d'arrêt sur un Show et interroge la pile des appels.

Merci Bernard :).

Mais comme je ne sais pas si cela fonctionne chez La braise, car chez moi, je n'ai pas de problème sur XL20007 avec son fichier. Sinon, il y a peut-être autre chose dans son fichier :confused:.

Sinon, il faudrait peut-être vider la pile (c'est du combien de volts :eek:).
 

Discussions similaires

Statistiques des forums

Discussions
312 611
Messages
2 090 221
Membres
104 452
dernier inscrit
hamzamounir