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.
 

Staple1600

XLDnaute Barbatruc
Re : Contourner vbModeless

Bonjour à tous

ctiquoi
Pas possible d'avoir le code VBA complet ?
Ou au moins suffisamment pour envisager de faire des tests sur nos propres PC ?
(La cerise sur le module, serait de disposer d'un fichier exemple joint)

D'ailleurs nous sommes plusieurs à penser la même chose à propos du fichier joint ;)

Bonjour,

Ce serait bien de mettre un fichier avec ce que vous avez déjà tenté comme approche et dire où ça coince.
 
Dernière édition:

ctiquoi

XLDnaute Nouveau
Re : Contourner vbModeless

Je n'en vois pas l'intérêt. Je n'ai pas un souci fonctionnel mais pur VBA, à savoir comment empêcher le code de se poursuivre avec un UserForm ouvert en mode vbModeless.

J'ai bien pondu une solution mais que je ne trouve pas très propre. Après ouverture de l'UserForm, je fais une boucle :
Code:
Dim myObject As myClass

Set myObject = New myClass

VBA.UserForms.Add("myForm")
VBA.UserForms(0).Show vbModeless

' Code de temporisation, pour suspendre l'exécution du code jusqu'à fermeture de l'UserFom.
Do While VBA.UserForms(0).Visible
Loop

' Maintenant, je peux détruire mon objet dans ma procédure.
Set myObject = Nothing
 

Staple1600

XLDnaute Barbatruc
Re : Contourner vbModeless

Re


Tu ne vois pas l’intérêt ??
Moi je dirais, le partage des connaissances tout simplement.
Découvrir les productions des membres du forum est toujours intéressant et enrichissant, non ?
C'est là toute la philosophie du forum XLD, non ?
 

ctiquoi

XLDnaute Nouveau
Re : Contourner vbModeless

Ce classeur pourrait contenir des informations confidentielles et ne rien apporter en terme de compétence VBA ou Excel.

J'aurais pu poser la question de manière plus générique sans parler de mon projet "Existe t-il un moyen de stopper le code avec vbModeless ?" et personne ne m'aurait demandé un classeur.

Et s'il peut apporter quelque chose aux membres, je ne vais pas le jeter en pâture comme cela sans explications approfondies.
Par contre si quelqu'un m'explique comment faire un tuto (je ne sais pas si cela est possible), alors là je suis d'accord pour m'y coller.

Pour info, mon projet "ancre" une UserForm à une position précise et choisie par l'utilisateur sur la fenêtre Excel, l'intérêt c'est que le formulaire se repositionne quand Excel est déplacé ou redimensionné.
 

Staple1600

XLDnaute Barbatruc
Re : Contourner vbModeless

Re

Un fichier exemple se doit d'être tout sauf confidentiel ;)
(comme nous l'indique la charte)

Pour les "vbaistes", il est toujours plaisant de découvrir le style d'écriture d'autres "vbaistes".

Donc sauf à croire que tu estimes ton code VBA confidentiel, rien n’empêchait que tu diffuses un classeur vierge dans lequel tu aurais simplement importé le projet VBA de ton classeur confidentiel.

Sans pouvoir tester ton code, j'ai du mal à voir comment tenter de t'aider.

et personne ne m'aurait demandé un classeur.
Si je me suis permis de te le demander, c'est:
1) pour voir précisément de quoi il retourne, et avoir de quoi faire des tests.
2) pour ma gouverne: le peu de code VBA que tu as posté indique clairement que tu ne débutes pas en VBA, et cela est simplement intéressant de lire du code VBA un peu plus pointu que la moyenne.
 
Dernière édition:
G

Guest

Guest
Re : Contourner vbModeless

Bonjour,

Je plussoie à ce que dit l'ami Staple.

@ctiqoi, je vois bien ce que tu veux dire.

Soit tes deux objets (userform et myObject) sont indépendants, n'ont pas besoin l'un de l'autre pour vivre leur existence et il suffit de les traiter (instanciation et destruction) dans des procédures indépendantes.

Soit userForm à besoin de myObject (ou lycée de Versailles) et là j'instancierai MyObject à l'ouverture du userForm et le détruirai au besoin à sa fermeture, en laissant si necessaire la déclaration publique de MyObject dans un module général.

Avec vbModeless on ne peut pas avoir le beurre, l'argent du beurre et le sourire (pour être poli) de la crémière.

Chaque chose ayant été conçue pour répondre à des besoins précis, s'il on veut s'en affranchir, il ne reste que bidouillage bancal, pas très viable à long terme

A+
 

Dranreb

XLDnaute Barbatruc
Re : Contourner vbModeless

Bonjour.

Si l'Userform est le dernier intervenant sur cet objet, qu'il en conserve la garde dans une de ses variables globales. Ainsi les variables ailleurs dans le projet, contenant la même instance, peuvent ensuite être mise à Nothing tout de suite sans que l'objet soit détruit, tant que l'Userform est chargé.
D'où ma question, existe t-il une astuce pour empêcher le code de se poursuivre avec une boite en mode vbModeless ?
D'orthodoxe, non. Le bon principe serait plutôt que l'Userform avertisse par l'appel d'une Sub (ou d'une méthode) du module l'ayant affiché qu'il est sur le point de se décharger.
 
Dernière édition:

ctiquoi

XLDnaute Nouveau
Re : Contourner vbModeless

@Hasco
@ctiqoi, je vois bien ce que tu veux dire.

Soit tes deux objets (userform et myObject) sont indépendants, n'ont pas besoin l'un de l'autre pour vivre leur existence et il suffit de les traiter (instanciation et destruction) dans des procédures indépendantes.

Soit userForm à besoin de myObject (ou lycée de Versailles) et là j'instancierai MyObject à l'ouverture du userForm et le détruirai au besoin à sa fermeture, en laissant si necessaire la déclaration publique de MyObject dans un module général.
C'est là je crois que je vous perd :).
Ceci est la raison pour laquelle je veux modifier le comportement de vbModeless, c'est anecdotique par rapport à mon soucis et pratiquement hors sujet.

Avec vbModeless on ne peut pas avoir le beurre, l'argent du beurre et le sourire (pour être poli) de la crémière.
Voilà, c'est ça ma problématique, comment modifier le comportement de vbModeless.

Chaque chose ayant été conçue pour répondre à des besoins précis, s'il on veut s'en affranchir, il ne reste que bidouillage bancal, pas très viable à long terme
Oui, c'est ce que j'ai fais, un bidouillage faute de trouver mieux, une boucle d'attente.

Code:
    ' Ouverture en mode modeless
    UserForm1.Show vbModeless
    ' Boucle de temporisation.
    '	Empêche le message de s'afficher avant la fermeture du formulaire.
    Do While UserForm1.Visible
        DoEvents
    Loop
    ' Le mesage s'affiche bien après la fermeture de l'UserForm par l'utilisateur.
    MsgBox "Ok ! Le MsgBox s'affiche bien après la fermeture de l'UserForm"

@Dranreb
D'orthodoxe, non. Le bon principe serait plutôt que l'Userform avertisse par l'appel d'une Sub (ou d'une méthode) du module l'ayant affiché qu'il est sur le point de se décharger.
C'est la classe qui pilote le formulaire, et donc ce n'est pas au formulaire de détruire l'objet.
C'est pourtant ce que je suis obligé de faire sur le Terminate du formulaire quand la boite est affichée en mode vbModeless, car je ne peux détruire ma classe sur la procédure d'appel du formulaire. Comme la classe pilote le formulaire, elle doit être détruite à sa fermeture pas après l'affichage.
Mais je redis, que ce n'est pas l'objet de mon post.

@Staple1600
Si je me suis permis de te le demander, c'est:
1) pour voir précisément de quoi il retourne, et avoir de quoi faire des tests.
Je joins un fichier qui illustre ma problématique, tu verras que ma demande est simpliste, la réalisation visiblement moins :)

Donc sauf à croire que tu estimes ton code VBA confidentiel, rien n’empêchait que tu diffuses un classeur vierge dans lequel tu aurais simplement importé le projet VBA de ton classeur confidentiel.
Tu fais bien d'aborder le sujet, il se trouve qu'il y a quinze jours, j'ai envoyé une version moins aboutie qu'aujourd'hui du projet par le menu du site "Téléchargement" => "Envoyer un fichier" sous le nom magnet_form.xlsm.
À ce jour, je n'ai aucun nouvelles, et ne sais pas ce qu'est devenu ce classeur.
Et je rappelle que je suis prêt à proposer un tutoriel complet sur ce projet car il met en oeuvre des techniques intéressantes, enfin je trouve.
J'espère que tu entends que mon soucis c'est ce foutu vbModeless et qu'en aucun cas je ne souhaite faire de rétention d'informations ou cacher je ne sais quel code sorti de la 4° dimension :) – pour un formateur qui a un blog de tutoriels ce serait un comble :).
 

Pièces jointes

  • Classeur1.xlsm
    18.8 KB · Affichages: 42
  • Classeur1.xlsm
    18.8 KB · Affichages: 59
  • Classeur1.xlsm
    18.8 KB · Affichages: 57
Dernière édition:
G

Guest

Guest
Re : Contourner vbModeless

Re,

C'est la classe qui pilote le formulaire, et donc ce n'est pas au formulaire de détruire l'objet

Oui et pour moi, c'est là que le bât blesse! Une classe dépendante d'un formulaire qu'elle ne construit pas elle-même!
Une classe objet normalement doit se suffire à elle-même.

A+
 

Staple1600

XLDnaute Barbatruc
Re : Contourner vbModeless

Re

->ctiquoi
Merci d'avoir sorti ton fichier de la Twilight Zone ;)
J'y vais jeter un pas de cet œil ;)

EDITION: Comme n'aurait pas dit Victor:
"L'autre oeil était dans VBE et regardait le Code" (N'est-ce pas Cain ?)
Caramba:! C'est cette portion de ton code qui avait éveillé mon intérêt
Dim myObject As myClass
Set myObject = New myClass
VBA.UserForms.Add("myForm")
VBA.UserForms(0).Show vbModeless
Or pas trace dans ton fichier joint . Dommage :eek::(

Quand à contourner le bug, j'ai pas mieux pour le moment.


Sinon concernant ceci
À ce jour, je n'ai aucun nouvelles, et ne sais pas ce qu'est devenu ce classeur.
Cela explique peut-être le pourquoi de la chose
https://www.excel-downloads.com/threads/important.226028/

->Hasco
Puisque je t'ai sous le coude: ton EQUIV qui cause crise financière, il pédale dans la semoule sur mon PC ;)

->Dranreb
: Bien le bonsoir chez vous ;)
 
Dernière édition:

ctiquoi

XLDnaute Nouveau
Re : Contourner vbModeless

@ staple1600
Merci d'avoir sorti ton fichier de la Twilight Zone
Bien involontairement alors :), si tu pouvais m'expliquer ce qu'est la Twilight Zone.

Or pas trace dans ton fichier joint . Dommage
Puisque maintenant tu as réglé ton soucis d'espace disque, je reposterais mon classeur dans les prochains jours dans la zone de téléchargement avec quelques explications. Si le problème n'est pas réglé, dis le moi, et je le mettrais dans ce post en pièce jointe.

@Hasco
Une classe dépendante d'un formulaire qu'elle ne construit pas elle-même!
Je t'expliques en gros l'archi du projet.
J'ai une classe (CClass) qui configure un formulaire, l'ouvre et le positionne. Peu importe le formulaire.

J'ai le formulaire exemple (Usf).

J'ai une variable public qui est une instance de CClass et une procédure qui l'instancie.
Dans cette procédure un appel d'une méthode de l'instance charge le formulaire.
Normalement une fois le formulaire fermé, la procédure doit détruire la l'instance public, c'est faisable uniquement si la boite est vbModal.

Ce n'est pas ma classe ou le formulaire qui sont en cause, mais la destruction de l'instance.

Tu comprendras mieux quand j'aurais mis en ligne le fichier.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Contourner vbModeless

Re

->ctiquoi
Puisque maintenant tu as réglé ton soucis d'espace disque, je reposterais mon classeur dans les prochains jours dans la zone de téléchargement avec quelques explications.
Heu, il y a méprise sur la personne ;)
Je ne suis pas DavidXLD ;)

Je parle moi du fichier joint dans ce fil-ci ;)
Et c'est ceci pour ma gouverne
J'ai une classe (CClass) qui configure un formulaire, l'ouvre et le positionne.
que j'aurai apprécié de lire dans ton fichier exemple ;)

Quand à la Twilight Zone, c'est toi qui en a parlé le premier ;)
Et moi, j'ai tenté un trait d'humour ;)
 

Statistiques des forums

Discussions
312 196
Messages
2 086 087
Membres
103 116
dernier inscrit
kutobi87