et pour revenir à la Userform ?
Merci Rdurupt pour cette magnifique barre de défilement qui fonctionne très bien ! Bravo !
J'avais toutefois déjà trouvé cette solution et ton post.
Cela règle une partie du problème (à savoir le "patientez ...") mais cela ne fournit pas la possibilité de mettre des messages personnalisés et encore moins celle de faire apparaître dans ces messages la valeurs de variables issues du programme en cours d'exécution.
Y a-t-il donc une solution à travers l'utilisation des userform ?
1 pièce(s) jointe(s)
Et une soluton en utilisant les Userform
Merci Rdurupt et Joe pour ces adaptation très élégantes.
J'ai poursuivi toutefois mes recherches et ai mis au point une solution qui fait appel aux boites de dialogue (Userform = USF).
Ma solution n'est pas très compacte mais fonctionne très bien.
Comme je n'ai rien trouvé de tel sur Internet, je détaille ci-dessous mon utilisation des Userform. Le fichier exemple est joint.Pièce jointe 176067
Création de l'USF
On crée l'USF dans VBA en cliquant bouton droit sur "feuilles", Insertion, Userform. Il crée un USF vide. On glisse dans cet USF une zone de test et un bouton de commande à partir de la boite à outils de l'USF.
En double cliquant soit sur l'USF, soit sur l'un de ses éléments, on entre dans la programmation interne de l'USF. Tout ce qui sera programmé ici ne sera exécuté que quand l'USF est appelé à l'écran et que l'on cliquera sur l'un ou l'autre de ses boutons.
Lancement de votre programme
Deux possibilités : soit le programme se lance avant l'ouverture de l'USF, soit c'est l'USF qui lance le programme.
a) Le programme se lance avant l'ouverture de l'USF
L'avantage de cela c'est que vous pouvez avoir donné, via le programme des valeurs à certaines variables, valeurs que vous pourrez faire apparaître dans l'USF.
L'ouverture de l'USF avec la commande XXX.show (où XXX est le nom de l'USF) bloque le programme. Pour que le programme continue il faudra alors fermer l'USF.
En programmant, dans le code du bouton de commande de l'USF, la fermeture de l'USF, celle-ci se ferme quand vous cliquez sur le bouton :
Code:
1 2 3
| Private Sub ok_Click()
Unload XXX '(XXX = nom de l'USF)
End Sub |
Le programme se poursuit alors.
Pour sortir de l'USF sans lancer le programme ("Voulez-vous lancer le programme ?" réponse "non"), j'ai appliqué l'astuce suivante : en cliquant sur le bouton "non", cela donne la valeur "A" à une variable (variable string obligatoirement) ; et, en sortant de l'USF, le programme teste ladite variable. S'il trouve la valeur "A", il renvoie alors à une étiquette située à la fin du programme.
b) C'est l'USF qui lance le programme
L'USF peut lancer le programme. Dans ce cas, dans le code de l'USF vous écrivez :
Code:
1 2 3 4 5
| Private Sub UserForm_Activate()
Me.Frame1.Caption = "Bonjour"
DoEvents
Call ZZZ '(où ZZZ est le nom de la procédure)
End Sub |
Dans ce cas, l'USF reste à l'écran et le programme se poursuit tout de même. Je n'ai pas bien perçu l'intérêt du DoEvents car ça semble fonctionner aussi sans le DoEvents.
À la fin du programme on ferme l'USF (Unload XXX)
Faire apparaître des messages dans l'USF
Lorsque l'USF s'ouvre, le message qui apparaît dans la zone de texte est celui qui est initialement programmé dans l'USF : Aller dans les propriétés de la zone de texte (TextBox1) et inscrire le message dans le champ "value".
Ensuite, toutefois, on peut faire changer le message :
a) Le message change suite à un clic sur un bouton
Dans le code interne du bouton, inscrire :
Code:
Me.TextBox1.Value = "AAA" '(où AAA est votre message)
b) Le message est fourni par le programme en cours de déroulement
Pour que des messages s'affichent dans l'USF, il faut que l'USF reste ouverte tandis que le programme se déroule. Si vous avez lancé le programme depuis l'USF, l'USF reste à l'écran. Si vous lancer l'USF depuis le programme, vous devez alors introduire le paramètre "False" pour que l'USF reste à l'écran tandis que le programme se poursuit :
Ensuite, pour faire apparaître des messages, inscrire, dans votre programme le code suivant :
Code:
1 2
| XXX.TextBox1.Value = "AAA" + ValeurStr
DoEvents |
Où XXX est le nom de l'USF, AAA est le texte de votre message et ValeurStr est le nom d'une variable string qui vous permet d'afficher des valeurs que vous avez captées dans votre programme (par exemple, un indicateur d'avancement).
DoEvents : je ne sais pas trop son rôle, mais ça ne fonctionne pas sans cela !
Ouvrir plusieurs USF successivement
Pour mon programme, j'ai ouvert successivement 3 USF :
- La première pour avoir le choix : soit de lancer le programme, soit d'arrêter tout. Le programme attend la réponse de l'utilisateur avant de se poursuivre.
- La seconde pour inscrire les messages indicateurs de l'avancement du programme. Le programme ouvre l'USF et continue sa progression.
- La troisième pour inscrire un message final de compte-rendu et permettre à l'utilisateur de lire tranquillement le message et de fermer ensuite l'USF. Le programme attend la réaction de l'utilisateur.
Voilà pour les explications de B.A.BA. Y a peut-être plus simple comme programmation, mais ça fonctionne en tous cas comme cela.