Boucle en background avec vba
Bonjour a tous,
J'ai une form qui est alimenté par une base de donnee sql. J'aimerais en vba faire un sorte que la form soit toujours mise a jour. Par contre comme l'update prend une minute il faudrait toujours garder la main sur excel.
Y a-t-il un moyen de faire du multitache ? ou au moins que excel ne soit pas bloque quand je travail ?
Merci
Pseudo-multitâche avec Application.OnTime dans Excel VBA
Citation:
Envoyé par
racoon971
Y a t'il un moyen de faire du multitâche ? Ou au moins qu'Excel ne soit pas bloqué
En tâche de fond, Excel peut animer périodiquement une barre de progression dans la barre de status en parallèle de l'exécution de votre macro.
C'est un pseudo-multitâche correspondant exactement au titre "Boucle en background avec VBA". L'itération de la boucle en arrière-fond efface une des barres de l'animation et affiche le pourcentage d'avancement.
A vous de voir si on peut adapter ce principe pour mettre à jour périodiquement des données depuis une base SQL en arrière-fond. L'éventuelle difficulté sera la mise à jour de l'interface (GUI : Graphic User Interface) présenté à l'utilisateur s'il s'agit d'accéder à une User Form existante ou non ? Non modale ? Créée par qui ? Persistante ou volatile ?
Dans l'application de la barre de progression, on a simplifié le problème en choisissant une ressource GUI cible persistante, déjà créée par Excel, accessible globalement par toute macro : c'est la barre de status.
Pour démarrer la boucle en arrière-fond, le principe est l'appel d'Application.OnTime :
Code:
Application.OnTime pBar_timerWakeup, pBar_strSub, , True
Excel affiche dans la barre de status l'animation : ( 80%) ||||||||
On peut même lancer cette animation depuis la fenêtre d'Exécution immédiate (Ctrl+G) du VBE via ProgressBarStart(). On peut ensuite exécuter d'autres procédures ou fonctions en parallèle. Typiquement on peut arrêter l'animation ou changer ses paramètres, c-a-d gérer l'animation à distance depuis une autre macro qui s'exécute en parallèle mais avec prise en compte en temps différé, sinon ce serait un vrai multitâche si l'effet était en temps réel.
Citation:
Envoyé par
racoon971
exemple simple en vba utilisant un thread stp ?
Cette barre de progression en VBA est beaucoup plus simple à mettre en œuvre qu'un multitâche avec l'API Win32. On n'utilise que du VBA natif compatible toute version depuis au moins Excel97 sans DLL externe. Grâce à un appel par nom de la procédure qui assure la boucle en arrière-fond, Application.OnTime évalue dynamiquement la procédure à appeler dont le nom se trouve dans la constante String pBar_strSub :
Code:
1 2
| Option Explicit
Const pBar_strSub = "ProgressBarUpdate" |
L'exécution est différée à la fin du délai pBar_timerWakeup.
A ce moment là, ProgressBarUpdate() réarme ou pas le timer pour une itération de plus, c-a-d une animation du pourcentage d'avancement de la barre de progression.
___________
Si la discussion est résolue, vous pouvez cliquer sur le bouton :resolu:
En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert http://www.developpez.net/forums/ima.../vote1left.gif ci-dessous.