Contourner vbModeless

ctiquoi

XLDnaute Nouveau
Bonjour,

J'ai une procédure qui instancie un objet personnel, cet objet manipule une UserForm.
Code:
Dim myObject As myClass
Set myObject = New myClass

Plus loin dans ma procédure j'ouvre l'UserForm en mode vbModeless.
Code:
myForm.Show vbModeless

Normalement, j'ai pour habitude de détruire l'instance de mon objet dans la procédure qui l'a créé (donc après l'ouverture du formulaire).
Code:
Set myObject = Nothing

Mais ici c'est impossible puisqu'avec vbModeless le code continu à s'exécuter contrairement à vbModal et cet object ne doit être détruit qu'à la fermeture du formulaire.

Je suis donc obligé de détruire mon instance sur l'évènement Terminate() de mon UserForm, ce qui ne me plait guère.

D'où ma question, existe t-il une astuce pour empêcher le code de se poursuivre avec une boite en mode vbModeless ?

Merci pour l'aide que vous pourriez m'apporter.
 

ctiquoi

XLDnaute Nouveau
Re : Contourner vbModeless

J'suis vraiment une buse moi, mais l'anglais et moi ne sommes pas forcément amis.

Pour clore le truc, et à la demande générale, et en exclu pour excel-download, voici le Twilight Code ;).
 

Pièces jointes

  • magnet-form.xlsm
    126.9 KB · Affichages: 53

Dranreb

XLDnaute Barbatruc
Re : Contourner vbModeless

C'est la classe qui pilote le formulaire, et donc ce n'est pas au formulaire de détruire l'objet.
Si vous voulez, mais puisque c'est lorsqu'il se décharge que ça doit se faire, c'est quand même à lui d'avertir le module habilité à le détruire.

D'une manière ou d'une autre, vous devrez conserver votre objet dans une variable globale. Et je suis jusqu'à présent fondé à penser que le mieux ce serait dans l'Userform. Le mieux c'est dans le plus global des appelant qui en aurait besoin. S'il n'est utilisé que par l'Userform, je ne vois même pas à quoi ça sert de l'initialiser ailleurs.
 
Dernière édition:

ctiquoi

XLDnaute Nouveau
Re : Contourner vbModeless

On ne se comprend pas.

L'instante est bien sûr une variable public. Elle est créé dans une procédure et c'est cette procédure qui devrait la détruire et c'est la qu'intervient le problème avec vbModeless qui m'oblige à la détruire sur le formulaire.

Mon formulaire ne doit contenir aucun code car les services offert par ma classe fonctionne quelque soit le formulaire.
En résumé, j'insère une UserForm, je créé une procédure en donnant le nom du formulaire et point barre, ça roule.
 

Dranreb

XLDnaute Barbatruc
Re : Contourner vbModeless

c'est cette procédure qui devrait la détruire
Certainement pas. Si ça sert à quelque chose de la garder dans ce module pendant que l'Userform est affiché, ça doit impérativement être une autre procédure de ce module. Mais faites ce que vous voulez après tout. Libre à vous de programmer n'importe quoi n'importe comment en vertu de principes complètement idiots.
 
Dernière édition:

ctiquoi

XLDnaute Nouveau
Re : Contourner vbModeless

J'ai modifié mon code selon vos préconisations (enfin si j'ai bien compris).

Voici un extrait du code concerné avec en commentaire ce que j'ai compris de vos explications.

Code:
---------------------------------------------
Module 1

Public myClass as CClass

Sub Test()

Set myClass = New CClass

myClass.OpenForm

' L'utilisateur ferme le formulaire.
' Le code arrive donc ici.
'Set myClass = Nothing
' Sauf que je n'ai pas le droit de détruire mon instance dans la procédure qui l'a créée.
' Il faut le faire ailleurs (car elle est Public ??? pas sûr que ce soit ça qu'il faille comprendre).

End Sub
---------------------------------------------

Classe CClass

Sub OpenForm()
VBA.UserForms(0).Show vbModal
End Sub
---------------------------------------------
Formulaire UserForm1

Private Sub UserForm_Terminate()

' Je dois détruire l'instance ici car il est interdit de le faire dans la procédure où elle est créée.
Set myClass = Nothing

End Sub

Bien dorénavant, j'utiliserais mes classes selon vos conseils.

Il n'est pas obligé de me parler mal, Monsieur. Si j'ai créé ce post, c'est que j'ai des lacunes sur Excel.
 

Dranreb

XLDnaute Barbatruc
Re : Contourner vbModeless

Bonjour

Soit, je vous présente mes excuses.
Vous avez quand même le droit de considérer que ce serait à une procédure du module dépositaire de l'objet de le faire, et d'appeler celle ci depuis l'Userform. Mais voir aussi, au contraire, s'il est utile que l'objet soit public dans Module1 et pas plutôt Private dans l'Userform, car je ne vois aucun code qui se sert de l'objet à part pour lui faire exécuter sa méthode OpenForm. Mais est-ce qu'un Show direct de l'Userform ne pourrait pas rendre cet objet transparent à l'extérieur, où il ne sert apparemment pas ?
 

ctiquoi

XLDnaute Nouveau
Re : Contourner vbModeless

Soit, je vous présente mes excuses.
Ok, on s'est mal compris au départ, comme quoi un bout de code vaut mieux qu'un long discours.

Code:
je ne vois aucun code
Je vous propose si vous le souhaitez de télécharger mon projet complet dans le premier post de cette page (magnet_form.xlsm).

Mais voir aussi, au contraire, s'il est utile que l'objet soit public dans Module1
Et c'est la que la conversation va tourner au cocasse lol.

Regardez le commentaire sur la destruction de mon objet dans la procédure FormMagnet du module pkg_Magnet.

Si elle est public c'est justement parce que je suis obligé de le faire à la destruction du formulaire, mais pas pour vos raisons, c'est à cause de la particularité de vbModeless ce qui était l'objet de mon post.

Mon objectif peut-être utopique, c'est de pouvoir appliquer le traitement quelque soit le formulaire sans que l'on soit obligé de rajouter du code dedans, donc rendre ma variable private et du coup locale à la procédure puisque effectivement après je ne m'en sert nulle part ailleurs.
 

Statistiques des forums

Discussions
312 321
Messages
2 087 249
Membres
103 498
dernier inscrit
FAHDE