Création d'un UserForm annimé pour faire patienter l'utilisateur

SERIEUXETCOOL

XLDnaute Occasionnel
Bonjour le Forum,

Voici le contexte :

J'ai développé une Macro comportant un sacré paquets de lignes, et qui exécute un sacré paquets d'opérations (Principalement des calculs avec des grosses formules sur des centaines de lignes).

Du coup quand je lance ma Macro et bien mon écran se "fige" l'espace d'une 20aine de secondes. Il s'agit du temps que met le pc pour réaliser les calculs, tracer les graphs, etc. On pourrais penser que la Macro bug, alors que c'est faux.

Du coup j'aimerais mettre un UserForm animé à l'écran et qui se déclenche au moment que je désire avec un "UserFom Show". Puis qui se termine avec un "Userform Unload".

Précisions :

Je ne veux pas mettre une "progress bar" car je ne suis pas capable de déterminer à l'avance le nombre d'opérations qui sera à traiter. Sa pourrait varier de 4 secondes à 40 secondes par exemple. Donc une progress bar n'est pas adaptée pour moi.

Du coup je désire un UserForm qui sois animé en boucle par une série de petites barres, ou de points, ou de lignes etc qui indiquent à l'utilisateur que des calculs sont en cours.

Comme sa, quand la Macro se déclenche, l'utilisateur vois apparaitre à l'écran un message animé lui indiquant que tout est normal.

Pour l’animation je n'ai pas vraiment de préférences, sa peut être un texte qui tourne en boucle, des points qui se suivent les uns après les autres etc. Juste un UserForm animé pour ne pas penser que sa bug (et pour le style aussi^^).

Donc vous l'avez compris, je me fiche d'avoir un pourcentage de progression, simplement un message qui tourne en boucle jusqu’à ce que les calculs soient terminés.

J'ai trouvé sur le net un premier exemple avec une progress bar, peut être est-il possible de le modifier un peu pour que la progression de la barre ne sois plus liée au nombre d'opérations exécutées, mais au temps d'affichage de l'UserForm.

Conclusion :

J'espère avoir été clair sur la définition de mon besoin. Je reste dans le coin pour plus d'infos.

Cordialement,

André

PS : Excel 2007
 

Pièces jointes

  • Exemple barre de progression.xls
    32.5 KB · Affichages: 747
  • Exemple barre de progression.xls
    32.5 KB · Affichages: 805
  • Exemple barre de progression.xls
    32.5 KB · Affichages: 832
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Création d'un UserForm annimé pour faire patienter l'utilisateur

Bonjour
Pourquoi pas un wordart ou quelque chose du genre, invisible en temps normal, rendu visible le temps du calcul ?
Avez vous exploré toutes les pistes pour réduire les temps de calcul ? SreenUpdating à False, ApplicationCalculation à xlCalculationManual, minimisation des requêtes Excel en traitant un maximum de chose en mémoire, utilisation des Worksheetfunctions et j'en passe ?
À+
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Création d'un UserForm annimé pour faire patienter l'utilisateur

Bonjour Dranreb,

Tout d'abord merci pour votre aide. Vous suggérez ceci :

Pourquoi pas un wordart ou quelque chose du genre, invisible en temps normal, rendu visible le temps du calcul ?

C'est bel et bien quelque chose de ce style la que je recherche. Je pensais faire afficher un UserForm avant d'entrer dans ma procédure longue et de le cacher une fois sorti de cette procédure longue.

Et j'aurais en plus souhaité que cet userform sois animé et "vivant" pour que l'utilisateur ne pense pas que sa sois un bug. Il faut que l'userform sois animé.

C'est pour sa que j'aurais souhaité créer un userform très très simple avec un soit un texte qui défile en boucle disant que les calculs sont en cours, soit une petite image animée, sois des points qui se suivent les uns derrière les autres pour simuler une attente, etc...
Bref un petit quelque chose sympa qui tourne en boucle tant que je ne décharge pas l'userform.

Sa doit bien pouvoir se faire de manière très simple sa ??? Peut être avec un frame contenant des formes je ne sais pas.

Cordialement André

PS : Je suis débutant sous Vba, je ne pense pas que mon code sois le plus optimisé possible, mais néanmoins, j'ai utilisé le SreenUpdating à False, le display alerts à False aussi. J'ai créé des sous procédures et bien regroupé tous les groupes de calculs quand c'était possible. Le temps d'attente de 20 sec ne me dérange pas. C'est vraiment pour que l'utilisateur sois averti.
 

Dranreb

XLDnaute Barbatruc
Re : Création d'un UserForm annimé pour faire patienter l'utilisateur

Vraiment très simple, je ne crois pas. Car il faut s'occuper de l'animation à intervales réguliers. Un vrai timer système n'est pas trop risqué si son action ne porte que sur des objets msforms. Mais attention à ne le mettre en oeuvre que s'il est au point, risque de plantage sévère sinon.
VB:
Option Explicit
Public Declare Function GetTickCount Lib "kernel32.dll" () As Long
Public Declare Function SetTimer Lib "user32.dll" _
   (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Rem. Sub MonTimer(ByVal hwnd As Long, ByVal uMsg As Integer, ByVal idEvent As Integer, ByVal dwTime As Long)
Public Declare Function KillTimer Lib "user32.dll" _
   (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Je me suis fait un usf pour visualiser l'état de Application.EnableEvents. Voyez si vous vous pouvez vous en inpirer:
VB:
Sub Évènements()
Application.EnableEvents = Not Application.EnableEvents
BoutonMsg Application.EnableEvents, _
   "Traiter évènements", "Prise en charge des évènements RÉACTIVÉE", 6852, _
   "Ignorer évènements", "Prise en charge des évènements DÉSACTIVÉE", 1019
If Not UfÉvènements.Visible Then
   UfÉvènements.Afficher
   SetTimer 0, 0, 40, AddressOf TimerÉvèn
   End If
End Sub
Private Static Sub TimerÉvèn(ByVal hwnd As Long, ByVal uMsg As Integer, ByVal idEvent As Integer, ByVal dwTime As Long)
Dim ÉtatNoté As Boolean
If Application.EnableEvents Xor ÉtatNoté Then
   ÉtatNoté = Application.EnableEvents
   BoutonMsg ÉtatNoté, "Traiter évènements", "", 6852, "Ignorer évènements", "", 1019
   End If
If Not UfÉvènements.Visible Then KillTimer 0, idEvent Else UfÉvènements.MàJParTimer
End Sub
À+
 
Dernière édition:

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Création d'un UserForm annimé pour faire patienter l'utilisateur

Dranreb, Je ne parviens pas à exploiter votre aide.

Quand je place le code sous VBA, au lancement de la Macro, il y a une erreur "BoutonMsg, Sub ou Fonction non défini"

De plus je ne vois pas d'userform créé.

Je suis trop débutant pour savoir ou placer ces morceaux de codes. Serait il possible d'avoir un fichier Excel contenant le module principal et l'userform en question ?

La comme sa, je ne suis pas capable d’analyser le processus.

André
 

Dranreb

XLDnaute Barbatruc
Re : Création d'un UserForm annimé pour faire patienter l'utilisateur

C'est normal, je ne vous ai pas dit d'essayer de l'exécuter.
Construisez votre userform avec propriété ShowModal = False.
Munissez le de procédures Public:
Afficher: pour l'afficher et démarrer l'animation,
MàJParTimer: Pour corriger l'aspect de la partie animée,
Fermer: Pour lui demander de terminer son animation et se masquer (je n'aime pas le masquer de l'extérieur)
Mettez tout ça au point, en appelant ces procédures, qualifiées du nom de l'usf, depuis des Sub de test, après on verra.
GetTickCount peut être utilisé sans risque pour appeler MàJParTimer à intervalles réguliers: il donne le nombre de millisecondes écoulées depuis le lancement de Windows.
Après seulement, on s'attellera à lancer MàJParTimer depuis un timer écrit aussi court que possible, et on commencera les premiers tests en sauvegardant tout avant chaque exécution. La moindre erreur de syntaxe dans le timer aboutit généralement à une terminaison brutale et silencieuse d'Excel.
À+
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Création d'un UserForm annimé pour faire patienter l'utilisateur

Dranreb, merci pour ton aide mais je sais que ce n'est pas de mon niveau. Je ne comprends vraiment pas l'utilité du Timer. Et je ne te cache pas que si je ne comprends pas, alors sois sa va me prendre énormément de temps pour comprendre et ce n'est pas acceptable sois la solution va marcher et je ne maitriserais plus mon code par la suite. Donc merci pour tes conseils qui je n'en doute pas permettent un bon résultat, mais ce n'est pas possible pour le moment. J'aimerais utiliser l'astuce que j'énonce ci-après...

Solution : --> Faire le plus simple possible^^

J'ai continué mes recherches et j'ai finalement trouvé une solution qui me conviendra parfaitement. Je créé un userform basique et je fais afficher une image gif animée. Ainsi mon image gif tourne en boucle tant que ma procédure longue tourne. Et dès que les calculs sont terminés, je fais cacher l'userform.

Et voila une solution élégante, simple, rapide et robuste. C'est tout ce que je demandais. Une solution codée en moins de 10 lignes VBA ;)

Je vous met la solution actuelle que je développe en pièce jointe. MAIS il y a tout de même un tout petit soucis encore...

En effet, mon userform fait appel à une image gif stockée sur mon disque dur. Or moi je veux pouvoir transmettre un classeur Excel uniquement. Et pas un classeur Excel plus une image Gif) .

J'ai cherché un peu sur le net, et il est possible de faire stoker une image gif directement au classeur pour n'avoir plus qu'un seul document unique. Évidement il est conseillé de ne pas intégrer trop de fichiers externes au classeur pour éviter de l'alourdir considérablement, mais dans mon cas j'ai 1 voir 2 images maxi. Et il est hors de question de transmettre un classeur associé avec 2 images à part.

Le problème actuel qui se pose est le suivant :

Qui saurait comment stocker l'image gif directement dans le classeur Excel ?

Il existe 2 méthodes apriori pour le faire, mais je n'y parviens pas.

Merci pour vos conseils.

Cordialement André

PS : Le classeur Excel et l'image sont en pièce jointe ci-après. J'utilise Excel 2007
 

Pièces jointes

  • TEST.gif
    TEST.gif
    38.2 KB · Affichages: 975
  • USERFORM D'ATTENTE.xls
    34 KB · Affichages: 917
  • TEST.gif
    TEST.gif
    38.2 KB · Affichages: 936
  • USERFORM D'ATTENTE.xls
    34 KB · Affichages: 824
  • TEST.gif
    TEST.gif
    38.2 KB · Affichages: 972
  • USERFORM D'ATTENTE.xls
    34 KB · Affichages: 828

Dranreb

XLDnaute Barbatruc
Re : Création d'un UserForm annimé pour faire patienter l'utilisateur

En tout cas mettez la propriété ShowModal à False dans la fenêtre de propriété, sans quoi vous ne pourrez rien exécuter d'extérieur à votre userform, l'exécution restera bloquée sur le Show tant qu'il ne se masquera pas.
Je ne comprends vraiment pas l'utilité du Timer
Elle serait double:
1) - Garantir la régularité du cadencement de l'animation
2) - Rendre cette animation complètement indépendante du traitement qui est fait ailleurs pendant ce temps.
Mais bon. C'est au dessus de ce que vous voulez investir, n'en parlons plus.
 
Dernière édition:

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Création d'un UserForm annimé pour faire patienter l'utilisateur

Pour le moment j’essaie d'adapter les infos trouvées sur ces liens pour stoker mon image gif dans Excel et la liée à mon userform.

Stocker et visualiser des images GIF dans Excel
Utiliser le contrle ImageList en VBA Excel


Si quelqu'un à une petite idée sur la manière de procéder je suis la.

André

PS : Je repost le classeur Excel contenant l'userform ainsi que l'image Gif en question
 

Pièces jointes

  • USERFORM D'ATTENTE.xls
    36.5 KB · Affichages: 465
  • TEST.gif
    TEST.gif
    38.2 KB · Affichages: 600
  • USERFORM D'ATTENTE.xls
    36.5 KB · Affichages: 483
  • TEST.gif
    TEST.gif
    38.2 KB · Affichages: 635
  • USERFORM D'ATTENTE.xls
    36.5 KB · Affichages: 531
  • TEST.gif
    TEST.gif
    38.2 KB · Affichages: 642

Dranreb

XLDnaute Barbatruc
Re : Création d'un UserForm annimé pour faire patienter l'utilisateur

Ouais. Tout cela me paraît bien compliqué et gourmand en taille.
Et pour votre gif, si c'est celui que vous avez l'intention d'utiliser, pendant qu'on attend, ça travaille ou ça dort ??
Ne voulez vous vraiment pas faire preuve de créativité ? Essayez un label qui se déplace, je ne sais pas, faites jouer votre imagination.
À+
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Création d'un UserForm annimé pour faire patienter l'utilisateur

Effectivement je pourrais me priver d'une animation Gif et seulement afficher un texte.

(L'image Gif est un modèle pas la version définitive. Mais un premier modèle que j'affectionne pourtant^^)

Mais je désire une animation quand même. Bon je sais la j'en demande bcp mais c'est l'objet de ma demande initiale pourtant. Si vraiment je ne trouve pas de solution, sois je garderais le fichier Excel groupé avec l'image Gif sois j’afficherais simplement un message d'attente qui me fera conserver un seul et unique fichier Gif.

Néanmoins je reste persuadé qu'il est possible de réaliser mon souhait. Notamment j'ai appris qu'il était possible de charger une image Gif sous Excel et de la faire décomposer en une série de chiffres sur une feuille Excel. Une procédure existe pour sa.
Mon idée est alors simple, faire charger cette image Gif dans une nouvelle feuille Excel. Ce qui permet finalement d'avoir le code de l'image enregistré sous Excel. Et enfin de faire afficher l'image à partir du code qui est dans les feuilles de calculs.
Pour un souci d’esthétique on fait masquer la feuille Excel qui contient les donnée liée à l'image Gif...Et hop le tour est joué^^

On à codé une image Gif sous Excel. On enregistre et Excel aura donc l'image Gif directement intégré.

Maintenant sa c'est la Théorie...Moi je suis débutant, je ne sais pas programmer, juste voir comment sa pourrait se passer. Mais je vais tout de même persévérer encore.

Je posterais la solution...Si j'y arrive^^

Sur que sa intéressa d'autres personnes que moi.

Cordialement André
 

Discussions similaires

Statistiques des forums

Discussions
312 229
Messages
2 086 426
Membres
103 206
dernier inscrit
diambote