Problème de UserForm et d'inaction des buttonCommand_Click
Bonjour à tous,
J'éprouve de sérieuses difficultés avec un UserForm que j'appelle pour afficher des informations sur des erreurs et pour demander à l'utilisateur s'il souhaite malgré tout poursuivre le traitement ou le cesser.
Je voulais utiliser les MsgBox YesNo mais j'aimerais que l'utilisateur puisse consulter les différentes feuilles du classeur qui renseigne sur les différents types d'erreurs.
Si j'utilise une MsgBox, vc'est du modal et tant qu'elle reste en attente du choix de l'utilisateur, il est impossible de manipuler le classeur d'où la création d'un UserForm.
Je ne comprends pas la logique des UserForms, du moins leur fonctionnement en fonction des évènements.
Je pensais avoir capté mais, là encore, je bataille pendant des heures pour un truc peut-être affreusement simple...
En gros mon UserForm "UserForm1_FOLLOW_YesNo", apparaît s'initialise mais si je clique sur n'importe lequel des boutons, rien ne se passe et la procédure d'appel se poursuit en exécutant l'instruction suivante qui est l'affiche d'un nouveau UserForm.
Les 2 UserForms sont affichés en même temps... Bref c'est le bazar.
Je ne comprend pas ce qui pêche dans mon raisonnement:
- J'appelle mon UserForm "UserForm1_FOLLOW_YesNo"et je l'affiche à partir de la Sub appelante
- J'initialise mon UserForm "UserForm1_FOLLOW_YesNo"
- J'ai bien déclaré mes buttonCommand_Click mais comment le UserForm sait qu'il doit rester affiché et attendre qu'on appuie sur un bouton
- Les boutons ne déclenchent aucune action bien que je clique dessus (n'importe quel bouton)
Voici le code qui appelle le UserForm "UserForm1_FOLLOW_YesNo":
'..........................
If TestGlobal > 0 Then
TestUSF = TestGlobal
UserForm1_FOLLOW_YesNo.Show 'Affichage du UserForm_FOLLOW_YesNo pr décider si user poursuit ou non le traitement malgré présence erreurs
End If
'-------------------------------------------------------------------------------------------------------------------
'Affichage du Userform "UserForm_LivraisonIllus" pour le choix des commandes à livrer
UserForm_LivraisonIllus.Show
'-------------------------------------------------------------------------------------------------------------------Voici le code de mon UserForm:
Private Sub UserForm_Initialize()
Me.Label2.Visible = False
Me.Show
Select Case TestUSF 'Variable Byte déclarée en Public et dont la valeur correspond à un ou plsrs type d'erreurs
Case Is = 1
Me.Label2.Caption = "Souhaitez-vous poursuivre le traitement bien que le nb d'illustrations ne soit pas cohérent ?" & vbCrLf & vbCrLf & "Reportez vous à la feuille ""COHÉRENCE NB ILLUS-IIN-ICN"" pour prendre connaissance des détails des erreurs"
Me.Label2.Visible = True
Case Is = 2
Me.Label2.Caption = "Souhaitez-vous poursuivre le traitement bien qu'il y ait des incohérences ICN/IIN ?" & vbCrLf & vbCrLf & "Reportez vous à la feuille ""COHÉRENCE NB ILLUS-IIN-ICN"" pour prendre connaissance des détails des erreurs"
Me.Label2.Visible = True
Case Is = 3
Me.Label2.Caption = "Souhaitez-vous poursuivre le traitement bien qu'il y ait des incohérences NB ILLUS et ICN/IIN ?" & vbCrLf & vbCrLf & "Reportez vous à la feuille ""COHÉRENCE NB ILLUS-IIN-ICN"" pour prendre connaissance des détails des erreurs"
Me.Label2.Visible = True
Case Is = 15
Me.Label2.Caption = "Souhaitez-vous poursuivre le traitement bien qu'il y ait des doublons ?" & vbCrLf & vbCrLf & "Reportez vous à la feuille ""CONTRÔLE DOUBLONS"" pour prendre connaissance des détails des erreurs"
Me.Label2.Visible = True
Case Is = 16
Me.Label2.Caption = "Souhaitez-vous poursuivre le traitement bien que le nb d'illustrations ne soit pas cohérent et qu'il y ait des doublons ?" & vbCrLf & vbCrLf & "Reportez vous à la feuille ""COHÉRENCE NB ILLUS-IIN-ICN"" pour prendre connaissance des détails des erreurs"
Me.Label2.Visible = True
Case Is = 17
Me.Label2.Caption = "haitez-vous poursuivre le traitement bien qu'il y ait des incohérences ICN/IIN ainsi que des doublons ?" & vbCrLf & vbCrLf & "Reportez vous à la feuille ""COHÉRENCE NB ILLUS-IIN-ICN"" pour prendre connaissance des détails des erreurs"
Me.Label2.Visible = True
Case Is = 18
Me.Label2.Caption = "Souhaitez-vous poursuivre le traitement bien qu'il y ait des incohérences NB ILLUS et ICN/IIN ainsi que des doublons ?" & vbCrLf & vbCrLf & "Reportez vous à la feuille ""COHÉRENCE NB ILLUS-IIN-ICN"" pour prendre connaissance des détails des erreurs"
Me.Label2.Visible = True
End Select
End Sub
'-----------------------------------------------------------------------------------------------
'Bouton "POURSUITE TRAITEMENT" ---> Le USER décide de poursuivre le traitement malgré la présence d'erreurs
Private Sub CommandButton1_TREAT_Click()
MsgBox "Le traitement va se poursuivre"
Unload Me
End Sub
'-----------------------------------------------------------------------------------------------
'Bouton "Arrêt PROCÉDURE" ---> Le USER décide de stopper le traitement
Private Sub CommandButton2_STOP_Click()
Exit Sub
End Sub
'-----------------------------------------------------------------------------------------------
'Croix ROUGE du UserForm ---> Le USER appuie sur la croix Rouge
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then
Cancel = True
End
End If
End SubMerci pour vos contributions.
Bien cordialement.
Bonjour Galopin,
Le voici après avoir épuré les instructions inutiles:
Merci de m'avoir lu.
Bonjour,
C'est un peu le bazar dans tes usf. Il faut concevoir ton UserForm plus simplement c'est à dire faire avec un seul UserForm si possible (En général c'est toujours possible !) Trop de userForm et de Msgbox...
Le problème est que les commandes dans ce genre d'instruction s'exécutent de manière asynchrone. Pas forcément dans l'ordre ou tu les écrits...
Pour bien faire il faudrait faire des boucles de blocage avec des variables True/False pour éviter que VBA ne lise trop vite tout l'empilement de userForm que tu veux lancer...
Idéalement chaque bouton doit terminer sa raison d'être : Inutile d'ajouter un msgbox avant ou après.
Voir mes corrections.
A+
Bonjour Galopin,
Je vous remercie pour les modifications de mon code.
Lorsque j'exécute la macro de ton fichier, ça fonctionne parfaitement,
Je l'ai recopié et mis dans ma macro originale mais ça ne fonctionne pas.
Je vais essayer de mettre des conditions en disant de ne pas afficher tel userForm tant que l'autre UserForm n'est pas fermé (toujours affiché).
Je n'étais pas trop au fait de l'asynchronicité que tu évoques.
C'est là où l'amateurisme, le manque de connaissances et de pratique fait son œuvre.
Je ne vois pas trop comment faire un UserForm unique sachant que les UserForm que j'ai créés n'ont rien en commun.
Je manque de hauteur.
Le pire, c'est qu'à la base, je voulais passer par une simple MsgBox en contextualisant le contenu en fonction de l'erreur mais je ne pouvais pas la rendre non modale pour que l'utilisateur puisse consulter les différentes sheets d'erreurs.
J'ai bien essayé d'insérer un DoEvent mais je ne savais pas où le placer et les différents essais ont été vains.
Bref, Merci encore pour ton aide.
Bonne journée.
Je viens de m'apercevoir que le paramètre vbModeless met la pagaille.
Si j'affiche mon "UserForm1_FOLLOW" en vbModeless, le code passe à l'affichage du UserForm suivant (UserForm_LivraisonIllus) sans afficher le UserForm1_FOLLOW du moins il reste affiché "dérrière" le UserForm_LivraisonIllus sans que les CommandButtons ne puissent être pris en compte.
If TestGlobal > 0 Then
TestUSF = TestGlobal
UserForm1_FOLLOW.Show vbModeless 'Affichage du Userform "UserForm_FOLLOW" pour décider si le user poursuit ou non le traitement malgré présence erreurs
End If
'-------------------------------------------------------------------------------------------------------------------
MsgBox "le traitement va donc se poursuivre (SUB)"
'-------------------------------------------------------------------------------------------------------------------
'Affichage du Userform "UserForm_LivraisonIllus" pour le choix des IPPNs à livrer
UserForm_LivraisonIllus.Show
'-------------------------------------------------------------------------------------------------------------------Si je supprime la paramètre vbModeless, la macro fonctionne mais je ne peux pas consulter les sheets de mon classeur or c'était le but de faire un UserForm plutôt qu'une MsgBox qui ne peut-être que modale...
Suis-je irrémédiablement condamné à supprimer ce UserForm1_FOLLOW qui a d'ailleurs été ajouté après avoir créé le UserForm_LivraisonIllus ?
Bonjour,
Il faut revenir à une conception plus simple : Un seul UserForm avec 3 Frames que tu montres successivement simplement en les mettant devant tes CheckBox
Les 2 suivants sont masqués au début avec Left = 280 et 560 et si nécessaire tu affiche l'un ou l'autre et comme ça ya aucune autre procédure en attente ni de problème de synchro. Si en plus tu évites les msg de blabla inutiles ça passera sans pb...
Bon moi je peux pas te le faire car dès que j'essaie d'enregistrer ça me plante tout le bouzin.
Un aperçu de mon usf (utilise la petite function que je t'ai fait la dernière fois pour le Label2.
Désolé je ne ne peux pas te joindre le code qui va avec pour l'instant ça me plante tout à l'enregistrement ! Il faut éviter de faire ce que j'ai fait ne pas copier les contrôles de tes ex-usf pour les coller dans tes frames, ça évitera des problèmes comme j'ai eu...
A+
Ce ne sont pas les Frames qui mettent la pagaille mais le mec qui programme !
Oui tu peux aussi jouer sur les largeur si tu veux afficher la partie gauche en même temps. Mais le but de la programmation est de canaliser l'utilisateur pas de lui proposer un tas de truc pour faire n'importe quoi ! Si tu laisses les CheckBox disponibles tu es obligé de tenir compte du fait que l'utilisateur peux checker à tout moment : Tes variables vont changer et bonjour l'actualisation des msg !
"on m'avait conseillé d'éviter les frames"
Au contraire les Frames permettent de gérer les différentes phases du déroulement de ton programme, soit par déplacement en position visible ou éloigné, ou simplement les superposer en jouant sur la visibilité.
Personnellement comme tu n'est pas trop à l'aise, je te conseille plutot de les déplacer en position visible ou vers la droite.
Mais YAPA que les Frames : On pourrait également jouer avec un multipage pour obtenir le même effet...
J'ai (enfin) réussi à reformater mon USF (en démo)
A+
Bonjour Galopin,
Merci beaucoup pour le userForm que je réutilise pour la refonte de ma macro.
Mais ça prend du temps car je suis tes conseils en ne copiant-collant pas les contrôles.
Face aux problèmes que je rencontre, je ne vois pas en tant qu'autodidacte, comment je peux véritablement m'améliorer en VBA.
Une formation n'aurait d'intérêt que si je programme souvent et de façon continue.
Comme mon utilisation n'est que ponctuelle, j'en suis réduit à n'apprendre, capitaliser qu'au coup par coup.
J'essaie de trouver des trucs à faire dans mon entourage mais c'est rare.
Depuis hier, j'ai un petit projet pour un ami mais rien que ça (renommer, zipper), j'y ai passé ma nuit jusqu'à 4 h00 du matin en ne réussissant pas à résoudre mon problème.
Pas simple de s'améliorer !
C'est la dure loi du rock'n roll !
Merci pour tout ce temps passé pour moi.
Bonne journée.