Quand QueryClose devient épileptique

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Il est bien pratique, quand on ouvre un USF avec des objets (TextBox, ComboBox…) où l’on rentre des données, que les dernières données entrées avant la fermeture de l’USF ou du classeur puissent être présentes lors de la nouvelle ouverture de l’USF sans avoir à les rentrer à nouveau. Dommage qu’il n’y ait pas une option dans l’USF qui permette de choisir si l’on veut ou pas garder en mémoire ses données avant fermeture.
Job75 avait, dans un autre fil, donné une astuce qui résolvait le problème.
Supposons que l’USF s’appelle « USF_Aleatoire ».
Dans cet USF il y a un CommandButton qui, quand on clique dessus, déclenche une macro, mais en fin de macro il y a la phrase magique :
Application.OnTime Now, "EnregistrerUSF_Aleatoire"

Dans un module standard il y a la macro "EnregistrerUSF_Aleatoire" :
VB:
Sub EnregistrerUSF_Aleatoire()
'Garde en mémoire les dernières valeurs du formulaire "USF_Aleatoire"
'job75

  Dim LimInf$, LimSup$

  LimInf = USF_Aleatoire.TextBox1
  LimSup = USF_Aleatoire.TextBox2
  Limites = USF_Aleatoire.Label4 '"Limites" variable "Public"
  virg = USF_Aleatoire.ComboBox1 '"virg" variable "Public"

  Unload USF_Aleatoire

  ThisWorkbook.VBProject.VBComponents("USF_Aleatoire").Designer.Controls("TextBox1") = LimInf
  ThisWorkbook.VBProject.VBComponents("USF_Aleatoire").Designer.Controls("TextBox2") = LimSup
  ThisWorkbook.VBProject.VBComponents("USF_Aleatoire").Designer.Controls("Label4") = Limites
  ThisWorkbook.VBProject.VBComponents("USF_Aleatoire").Designer.Controls("ComboBox1") = virg
End Sub
Il faut donc impérativement cliquer sur le CommandButton pour garder en mémoire les données de l’USF.
Et si l’on cliquait sur la petite croix après avoir modifié des données dans l’USF mais en omettant de cliquer sur le CommandButton… ? À l’ouverture de l’USF les modifications n’ont évidemment pas été prises en compte.
Que cela ne tienne, avec audace et détermination, j’ai rédigé ceci dans le module du formulaire « USF_Aleatoire » :
VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Application.OnTime Now, "EnregistrerUSF_Aleatoire"
End Sub
Je modifie les données de l’USF et je clique sur la petite croix et… Ouh putain ! Un bordel comme rarement j’en ai vu. Le truc qui tue ! Tout se bloque, le congélo se transforme en micro-ondes, le pacemaker de la voisine s’arrête, faut faire un reset !!

Peut-on garder les données d’un USF après avoir cliqué sur son bouton de fermeture dans la barre de titre ?

Merci pour tout avis.
 

job75

XLDnaute Barbatruc
Re : Quand QueryClose devient épileptique

Bonsoir Magic_Doctor,

Pas testé mais essaie :

Code:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Application.OnTime Now, "EnregistrerUSF_Aleatoire"
End
End Sub
Edit : supprime Unload USF_Aleatoire dans la macro "EnregistrerUSF_Aleatoire", c'est ça qui crée le pataquès.

A+
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : Quand QueryClose devient épileptique

Re,

J'ai d'abord supprimé "Unload USF_Aleatoire".
J'ouvre l'USF, je clique sur le CommandButton --> message d'erreur (je traduis) :
"Il s'est produit l'erreur 91 lors de l'exécution :
Variable d'objet ou bloc With pas établi"
Je clique dans la boîte de dialogue pour voir ce qui se passe et "ThisWorkbook.VBProject.VBComponents("USF_Aleatoire").Designer.Controls("TextBox1") = LimInf" est surligné.

Je remets "Unload USF_Aleatoire", ça marche.
C'est bizarre, il faut apparemment absolument fermer l'USF.

Maintenant j'écris ce que tu as indiqué dans le UserForm_QueryClose. Même pas pu essayer la croix, tout se bloque.
 

Dranreb

XLDnaute Barbatruc
Re : Quand QueryClose devient épileptique

Bonsoir.

Corriger comme suit :
VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode > vbFormControlMenu Then Exit Sub
Rem. — Seulement donc si l'évènement vient du clic sur la croix :
Cancel = 1 ' Annule le déchargement de l'UF.
Me.Hide ' Le masque pour mettre néanmoins fin à son affichage.
Application.OnTime Now, "EnregistrerUSF_Aleatoire"
End Sub
 

Magic_Doctor

XLDnaute Barbatruc
Re : Quand QueryClose devient épileptique

Bonsoir Dranreb,

Super, ça marche !

PS : pour les curieux qui se demanderaient akoikessassertoussa... voir PJ

Mais ATTENTION !! Pour que ça marche :

- sur Excel 2003 il faut avoir coché l'option*Faire confiance au projet Visual Basic*(menu Outils-Macro-Sécurité-Editeurs approuvés).
- sur Excel 2010 il faut avoir coché l'option*Accès approuvé au modèle d'objet du projet VBA*(onglet Fichier-Options-Centre de gestion de la confidentialité-Paramètres...-Paramètres des macros)

Indispensable pour mémoriser les données de l'USF.

PS' : essayez la 2ème PJ, ça marchera mieux.
 

Pièces jointes

  • Sacré QueryClose !!.xlsm
    156.2 KB · Affichages: 29
  • Sacré QueryClose !! (2).xlsm
    155.6 KB · Affichages: 24
Dernière édition:

job75

XLDnaute Barbatruc
Re : Quand QueryClose devient épileptique

Bonjour Magic_Doctor, Bernard, le forum,

Il paraît inutile de masquer l'USF par Hide :

Code:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then 'fermeture par la croix
  Cancel = 1 'maintient l'USF ouvert
  Application.OnTime Now, "EnregistrerUSF_Aleatoire"
End If
End Sub
Bonne journée.
 

Dranreb

XLDnaute Barbatruc
Re : Quand QueryClose devient épileptique

Bonjour.

Me parait utile s'il est affiché en modal. Mais je peux me tromper: ce ne serait peut être indispensable que si au lieu d'un OnTime ce serait la procédure ayant appelé la méthode Show qui faisait le boulot derrière. De toute façon je ne ferait pas ça comme ça, même si voulais noter en dur les valeurs dans les contrôles au lieu de les attacher à un nom dans le classeur, je récupèrerais en paramètre les valeurs dans les procédures et mettrais dans le OnTime entre guillemets simples le nom de la procédure suivi d'un espace puis des paramètres délimités par des doubles guillemets et séparés par des virgules.
 

Magic_Doctor

XLDnaute Barbatruc
Re : Quand QueryClose devient épileptique

Bonjour job, Dranreb, le forum,

L'USF s'affiche en non modal, car je voulais avoir la possibilité de me balader sur l'écran quand il est ouvert :
VB:
Private Sub BoutonAleatoire_Click()
  USF_Aleatoire.Show 0 'fait apparaître l'USF qui permet de dresser les 2 listes de nombres aléatoires
End Sub
La simplification de job me permets de virer la variable "voir" (et une verrue en moins !).

Il me manque encore pas mal de notions pour bien comprendre ce que Dranreb conseille dans son dernier post.

Une question. Je voudrais, à l'ouverture de l'USF, que le bouton "GO" soit sélectionné. J'ai tenté de caser "CommandButton1.SetFocus", mais je n'y suis pas arrivé. Comment s'y prendre ?

De toute façon, un grand merci à tous et ¡feliz domingo a todos!
 

Pièces jointes

  • Sacré QueryClose !! (3).xlsm
    152.5 KB · Affichages: 25
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : Quand QueryClose devient épileptique

Bonsoir job,

J'ai bien fait ce que tu m'as recommandé. "TabIndex" était à 5, je l'ai mis à 0.
Mais au fait, à quoi sert exactement ce "TabIndex" ?
J'ouvre l'USF, je clique d'emblée sur "Enter", ça marche. Mais si je clique une 2ème fois, je pars au diable Vauvert, à cause de la macro "Num_Alea".
Pour voir, je supprime, en fin de cette macro, "[AZ1].Select" et je refais un essai. Au 2ème clic sur "Enter", je ne vais plus à Trifouilly-les-Oies, mais à chaque pulsation sur "Enter" je sélectionne une nouvelle ligne de la 1ère colonne du tableau.
En revanche, si après ouverture de l'USF je clique sur "Enter", ça marche (comme précédemment), mais qu'ensuite je clique non pas sur "Enter" mais sur le bouton "GO", ça marche. Ensuite je peux cliquer ad vitam æternam sur "Enter", ça marche.
En somme, c'est le 2ème clic sur "Enter", après ouverture de l'USF, qui pose problème.

Peut-on pallier ce problème ?

A+
 
Dernière édition:

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 207
Membres
103 157
dernier inscrit
youma