OVH Cloud OVH Cloud

DoEvents

10 réponses
Avatar
Steph_D
Bonsoir, Bonjour,

Je fais appels à vos lumières pour connaître quelle est la meilleure
solution pour afficher un message pendant le traitement d'une macro, afin de
faire patienter l'utilisateur.

Ma macro est de ce type et je n'ai pas de boucle à l'intérieur. Est-ce
correct, svp ?

Un grand merci d'avance
Steph D


Sub Impression()

MonInvite.Show 0 'affiche le message "Veuillez patienter, traitement en
cours ..."
DoEvents

... traitement affectation de la mise en page feuille par feuille
... sélection des feuilles à imprimer

Unload MonInvite
... lance l'aperçu avant impression

End Sub

10 réponses

Avatar
michdenis
Bonjour Steph,

Insère ta macro imprimer à l'intérieur de ton formulaire dans l'événement "activate" du formulaire. Au lancement de ton formulaire,
ta macro impression va démarrer.

Attention, si ton formulaire est en fenêtre modale, tu ne doit pas faire d'aperçu avant impression sinon ouvre ton formulaire dans
une fenêtre non modale.



Et dans l'événement

Me.repaint 'assurer que le formulaire est bien affiché à l'écran
Impression ' La macro impression.
Me.hide
Unlaod Me


Salutations!


"Steph_D" a écrit dans le message de news: 430cd3c8$0$287$
Bonsoir, Bonjour,

Je fais appels à vos lumières pour connaître quelle est la meilleure
solution pour afficher un message pendant le traitement d'une macro, afin de
faire patienter l'utilisateur.

Ma macro est de ce type et je n'ai pas de boucle à l'intérieur. Est-ce
correct, svp ?

Un grand merci d'avance
Steph D


Sub Impression()

MonInvite.Show 0 'affiche le message "Veuillez patienter, traitement en
cours ..."
DoEvents

... traitement affectation de la mise en page feuille par feuille
... sélection des feuilles à imprimer

Unload MonInvite
... lance l'aperçu avant impression

End Sub
Avatar
Steph_D
Bonsoir MichDenis,

Merci beaucoup. Je bute toujours sur des petits trucs de ce type pour
personnaliser les évènements d'Excel.
Cela va être beaucoup plus sympa au niveau de l'interface.

Bonne soirée
Steph D
Avatar
Steph_D
Bonsoir,

Je me permets d'ouvrir un nouveau post sur cette question, car malgré les
conseils judicieux de MPI (qui m'ont permis de mieux gérer le QueryClose),
je ne m'en sors toujours pas pour la gestion du bouton Annuler.
J'aimerais pouvoir annuler la saisie, commencée dans un textbox, en cliquant
simplement sur le bouton Annuler. Avec ce bout de code, Excel ne me le
permet pas.

Merci d'avance et promis je ne vous embêterai plus ce soir. Bonne fin de
soirée ou début de journée
Steph D

Sub Lance()
Load fmLeMien
fmLeMien.Show
End Sub

Private Sub UserForm_Activate()
txtMonNom.Text = ""
End Sub

Private Sub txtMonNom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(txtMonNom.Text) = 0 Then Exit Sub
If Len(txtMonNom.Text) <= 4 Then
MsgBox "Saisie 5 caractères minimum"
Cancel = True
End If
End Sub

Private Sub cmdOK_Click()
If txtMonNom = "" Then
MsgBox "Saisie obligatoire"
txtMonNom.SetFocus
Exit Sub
End If
Unload Me
End Sub

Private Sub cmdAnnuler_Click()
Unload Me
End Sub
Avatar
MPi
Salut,

On en revient au même problème que sur l'autre Post.
Dans le code du bouton Annuler, tu dois mettre une variable qui dise à Excel
"Oublie la validation", disons qu'elle se nomme
Terminer As Boolean et est déclarée globalement dans le UserForm ou un
module standard

Dans le bouton Annuler, tu mets Terminer = True avant le Unload me

Dans le Exit de ton Textbox, tu vérifies que le texte = "". Si oui, tu sors.
C'est bien.
Il faut aussi vérifier si Terminer est True et sortir si c'est le cas. Si
aucune de ces conditions n'est vraie, le code de validation se poursuivra.

Ça devrait bien fonctionner ainsi...

Michel


"Steph_D" a écrit dans le message de
news:430ce39a$0$286$
Bonsoir,

Je me permets d'ouvrir un nouveau post sur cette question, car malgré les
conseils judicieux de MPI (qui m'ont permis de mieux gérer le QueryClose),
je ne m'en sors toujours pas pour la gestion du bouton Annuler.
J'aimerais pouvoir annuler la saisie, commencée dans un textbox, en
cliquant

simplement sur le bouton Annuler. Avec ce bout de code, Excel ne me le
permet pas.

Merci d'avance et promis je ne vous embêterai plus ce soir. Bonne fin de
soirée ou début de journée
Steph D

Sub Lance()
Load fmLeMien
fmLeMien.Show
End Sub

Private Sub UserForm_Activate()
txtMonNom.Text = ""
End Sub

Private Sub txtMonNom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(txtMonNom.Text) = 0 Then Exit Sub
If Len(txtMonNom.Text) <= 4 Then
MsgBox "Saisie 5 caractères minimum"
Cancel = True
End If
End Sub

Private Sub cmdOK_Click()
If txtMonNom = "" Then
MsgBox "Saisie obligatoire"
txtMonNom.SetFocus
Exit Sub
End If
Unload Me
End Sub

Private Sub cmdAnnuler_Click()
Unload Me
End Sub





Avatar
Steph_D
Bonjour Michel,

Je crois que je vais abandonner l'idée de tester sur l'évènement Exit. Je
commence à en avoir mal au cerveau.

Par rapport à tout ce que tu m'as montré (le code ci-dessous si j'ai bien
compris), j'ai refait quelques tests :
- Si je quitte le formulaire par la Croix quel que soit ma saisie, c'est
parfait.
- Si j'ai bien au moins 5 caractères dans le textbox, et que je quitte le
formulaire par le bouton Annuler, c'est parfait. Le QueryClose gère la
sortie.
- Si j'ai moins de 5 caractères dans le textbox, et que je quitte le
formulaire par le bouton Annuler, ce n'est pas bon, je boucle sur
l'évènement Exit et le message "Saisie 5 caractères minimum".
- Si j'ai bien au moins 5 caractères dans le textbox, et que je valide le
formulaire par le bouton OK, mes données sont bien stockées mais le
Queryclose s'enclenche. Un peu gênant.

"Je me mords trop la queue" et je crois que je vais revenir à la procédure
toute simple de validation sur le bouton OK uniquement.

Merci encore pour ton aide et ta patience. Bonne journée
Steph D.

'--------------------------------------------------------------------
Dim Terminer As Boolean
'--------------------------------------------------------------------
Sub Lance()
Load UserForm1
UserForm1.Show
End Sub
'--------------------------------------------------------------------
Private Sub UserForm_Activate()
txtMonNom.Text = ""
End Sub
'--------------------------------------------------------------------
Private Sub txtMonNom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(txtMonNom.Text) = 0 Then Exit Sub
If Terminer = True Then Exit Sub
If Len(txtMonNom.Text) <= 4 Then
MsgBox "Saisie 5 caractères minimum"
Cancel = True
End If
End Sub
'--------------------------------------------------------------------
Private Sub cmdOK_Click()
If txtMonNom = "" Then
MsgBox "Saisie obligatoire"
txtMonNom.SetFocus
Exit Sub
End If
'ici procédure de stockage de données
Unload Me
End Sub
'--------------------------------------------------------------------
Private Sub cmdAnnuler_Click()
Terminer = True
Unload Me
End Sub
'--------------------------------------------------------------------
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Dim Rep As Integer
Rep = MsgBox("Voulez-vous vraiment quitter ?", vbYesNo)
If Rep = vbYes Then
Terminer = True
Unload Me
Else
Terminer = False
Cancel = True
End If
End Sub
Avatar
Steph_D
Merci MichDenis
J'ai été obligé d'utiliser le DoEvents, sinon je n'avais à l'écran que le
contour de l'userform (et pas le message) pendant le traitement.
Lee deux méthodes qui ont fonctionné

Bonne journée
Steph D

'Méthode1
Sub LancementAperçu_V1()
Load MonInvite
MonInvite.Show 0 'non modale
DoEvents
Call Prepa_Aperçu 'prépare la mise en page de chaque feuille
(portrait/paysage), sélection des feuilles à imprimer
MonInvite.Hide
Call Aperçu_Ecran 'lance l'aperçu
Unload MonInvite
End Sub
'------------------------------------------------


'Méthode2
Sub LancementAperçu_V2()
Load MonInvite
MonInvite.Show 0
DoEvents
MonInvite.Hide
Call Aperçu_Ecran
Unload MonInvite
End Sub

Private Sub UserForm_Activate()
DoEvents
Call Prepa_Aperçu
End Sub
Avatar
michdenis
| J'ai été obligé d'utiliser le DoEvents

Me semblait que je t'avais proposé Me.Repaint ... justement pour le phénomène que tu as observé. ...si tu préfères DoEvents ... je
n'ai pas de problème avec ça !


Salutations!



"Steph_D" a écrit dans le message de news: dekg6j$1a9$
Merci MichDenis
J'ai été obligé d'utiliser le DoEvents, sinon je n'avais à l'écran que le
contour de l'userform (et pas le message) pendant le traitement.
Lee deux méthodes qui ont fonctionné

Bonne journée
Steph D

'Méthode1
Sub LancementAperçu_V1()
Load MonInvite
MonInvite.Show 0 'non modale
DoEvents
Call Prepa_Aperçu 'prépare la mise en page de chaque feuille
(portrait/paysage), sélection des feuilles à imprimer
MonInvite.Hide
Call Aperçu_Ecran 'lance l'aperçu
Unload MonInvite
End Sub
'------------------------------------------------


'Méthode2
Sub LancementAperçu_V2()
Load MonInvite
MonInvite.Show 0
DoEvents
MonInvite.Hide
Call Aperçu_Ecran
Unload MonInvite
End Sub

Private Sub UserForm_Activate()
DoEvents
Call Prepa_Aperçu
End Sub
Avatar
Steph_D
Me semblait que je t'avais proposé Me.Repaint ... justement pour le
phénomène que tu as observé. ...si tu préfères DoEvents ... je

n'ai pas de problème avec ça !


Génial ! J'avais lu trop vite et je ne connaissais pas la méthode Repaint.
Encore un grand merci pour ce que tu viens de m'apprendre.
Steph D.


'Méthode1
Sub LancementAperçu_V1()
Load MonInvite
MonInvite.Show 0 'non modale
MonInvite.Repaint
Call Prepa_Aperçu 'prépare la mise en page de chaque feuille
(portrait/paysage), sélection des feuilles à imprimer
MonInvite.Hide
Call Aperçu_Ecran 'lance l'aperçu
Unload MonInvite
End Sub
'------------------------------------------------
'Méthode2
Private Sub UserForm_Activate()
Me.Repaint
Call Prepa_Aperçu
Me.Hide
Call Aperçu_Ecran
Unload Me
End Sub
Sub LancementAperçu_V2()
Load MonInvite
End Sub

Avatar
MPi
Salut,
Essaie comme ceci, en enlevant le
Cancel = True et en oubliant tout ce que je t'ai dit concernant la variable
booléenne.

Option Explicit

Private Sub UserForm_Activate()
txtMonNom.Text = ""
End Sub
'--------------------------------------------------------------------
Private Sub txtMonNom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(txtMonNom.Text) = 0 Then Exit Sub
If Len(txtMonNom.Text) <= 4 Then
MsgBox "Saisie 5 caractères minimum"
End If
End Sub
'--------------------------------------------------------------------
Private Sub cmdOK_Click()
If txtMonNom = "" Then
MsgBox "Saisie obligatoire"
txtMonNom.SetFocus
Exit Sub
ElseIf Len(txtMonNom) < 5 Then
MsgBox "Saisie 5 caractères minimum"
txtMonNom.SetFocus
Exit Sub
End If
'ici procédure de stockage de données
Unload Me
End Sub
'--------------------------------------------------------------------
Private Sub cmdAnnuler_Click()
Unload Me
End Sub


Michel

"Steph_D" a écrit dans le message de
news:dekcfi$um4$
Bonjour Michel,

Je crois que je vais abandonner l'idée de tester sur l'évènement Exit. Je
commence à en avoir mal au cerveau.

Par rapport à tout ce que tu m'as montré (le code ci-dessous si j'ai bien
compris), j'ai refait quelques tests :
- Si je quitte le formulaire par la Croix quel que soit ma saisie, c'est
parfait.
- Si j'ai bien au moins 5 caractères dans le textbox, et que je quitte le
formulaire par le bouton Annuler, c'est parfait. Le QueryClose gère la
sortie.
- Si j'ai moins de 5 caractères dans le textbox, et que je quitte le
formulaire par le bouton Annuler, ce n'est pas bon, je boucle sur
l'évènement Exit et le message "Saisie 5 caractères minimum".
- Si j'ai bien au moins 5 caractères dans le textbox, et que je valide le
formulaire par le bouton OK, mes données sont bien stockées mais le
Queryclose s'enclenche. Un peu gênant.

"Je me mords trop la queue" et je crois que je vais revenir à la procédure
toute simple de validation sur le bouton OK uniquement.

Merci encore pour ton aide et ta patience. Bonne journée
Steph D.

'--------------------------------------------------------------------
Dim Terminer As Boolean
'--------------------------------------------------------------------
Sub Lance()
Load UserForm1
UserForm1.Show
End Sub
'--------------------------------------------------------------------
Private Sub UserForm_Activate()
txtMonNom.Text = ""
End Sub
'--------------------------------------------------------------------
Private Sub txtMonNom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(txtMonNom.Text) = 0 Then Exit Sub
If Terminer = True Then Exit Sub
If Len(txtMonNom.Text) <= 4 Then
MsgBox "Saisie 5 caractères minimum"
Cancel = True
End If
End Sub
'--------------------------------------------------------------------
Private Sub cmdOK_Click()
If txtMonNom = "" Then
MsgBox "Saisie obligatoire"
txtMonNom.SetFocus
Exit Sub
End If
'ici procédure de stockage de données
Unload Me
End Sub
'--------------------------------------------------------------------
Private Sub cmdAnnuler_Click()
Terminer = True
Unload Me
End Sub
'--------------------------------------------------------------------
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Dim Rep As Integer
Rep = MsgBox("Voulez-vous vraiment quitter ?", vbYesNo)
If Rep = vbYes Then
Terminer = True
Unload Me
Else
Terminer = False
Cancel = True
End If
End Sub




Avatar
Steph_D
Bonjour Michel,

Merci d'avoir encore réfléchi à ma question tordue. Je vais me garder
simplement ce cas, j'y ai ajouté le txtMonNom = vbNullString qui fait que si
l'utilisateur a commencé à saisir et qu'il clique sur Annuler, il aura le
message d'erreur une seule fois et pourra de nouveau cliquer sur Annuler.

Merci d'avoir passé du temps, bonne journée
Steph D.


Private Sub txtMonNom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'If Len(txtMonNom.Text) = 0 Then Exit Sub
MsgBox ActiveControl.Name
If Len(txtMonNom.Text) <= 4 Then
MsgBox "Saisie 5 caractères minimum"
txtMonNom = vbNullString
End If
End Sub