Automatisation de traitement en VB
Bonjour,
Je travaille sur une appli en VB, et des mises a jour sont faites manuellement chaque semaine grace à une fonction que l'on lance avec un simple click, or je voudrais lancer cette fonction periodiquement sans intervention de tiers, mais je ne voi pa du tout coment faire!!
Accès à des fonctions dans une appli
Citation:
Envoyé par
saidino
J'arrive effectivement à lancer mon appli à partir du planificateur de taches mais je ne vois pas comment on peut accéder à une fonction de l'appli à partir du planificateur de taches?
Il me semble que la manière la plus simple est de fournir un paramètre à l'appel de l'appli dans le planificateur de tâches, et d'exploiter dans le code de démarrage de l'appli la variable command qui représente la chaine de paramètre passée.
Par exemple :
Dans le planificateur de tâche, on appelle l'appli par (les guillemets sont impératifs si le chemin ou le nom de l'appli contiennent des espaces) :
Code:
"disque:\chemin\appli a lancer" Action=3
Dans l'application, code de la feuille de démarrage:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
Private Sub Form_Load()
Dim sParams$, nToDo%
If Command Like "Action*" Then
sParams = Split(Command, "=")
nToDo = Val(sParams(1)) 'Val pour éviter une valeur non numérique
Select Case nToDo
Case 1: Call Proc1 'Procédure à lancer si action = 1
Case 2: Call Proc2 'Procédure à lancer si action = 2
'etc.
End Select
End If
End Sub |
Version beaucoup plus puissante : on passe directement le nom de la fonction en paramètre, avec les propres paramètres de la fonction à appeler.
Exemple :
Dans le planificateur de tâche, on appelle l'appli par
Code:
1 2
|
"disque:\chemin\appli à lancer" FonctionAppellée/paramètres |
Le "/" est utilisé pour séparer le nom de la procédure de ses paramètres. Il peut être remplacé par n'importe quel caractère (à condition de modifier aussi le code ci-dessous).
Dans l'application, code de la feuille de démarrage:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
Private Sub Form_Load()
Dim sAction$()
If Command <> "" Then
sAction = Split(Command, "/")
If UBound(sAction) < 1 Then 'Pas de paramètre
CallByName Me, sAction(0), VbMethod
Else
CallByName Me, Trim(sAction(0)), VbMethod, sAction(1)
End If
End If
End Sub |
Attention, pour que cela fonctionne, toutes les procédures appelées doivent impérativement déclarées publiques et être situées dans la feuille courante. Si la fonction n'existe pas, ou si le nombre ou type de paramètres n'est pas correct, il y aura une erreur d'exécution. Il est donc nécessaire de prévoir une gestion d'erreur (non faite ici pôur de raisons de clarté et de place)
Le paramètre après le / peut représenter une chaine de paramètres, du style "param1, param2, param3"
Notez que la variable Command n'est pas à déclarer (même en mode Option Explicit), c'est une variable intrinsèque de VB.
Si avec ça vous n'arrivez pas à faire ce que vous souhaitez, c'est à désespérer !
yena qui cherchent la petite bête...
Si on lance une appli à intervalle régulier pour effectuer une tâche précise, c'est qu'elle se termine à la fin de cette tâche. Sinon, il suffit de la lancer une fois et d'y mettre un timer...:evilred:
Si la session précédente s'est plantée avant de se refermer, l'appel suivant créera une nouvelle instance qui, elle, exécutera (normalement) son boulot, sauf si la raison du plantage est la même, auquel cas on aura N tâches plantées au bout d'un moment. :?
On peut éviter cela bien sûr en introduisant en début de procédure une ligne:
If App.PrevInstance then Unload Me: Exit Sub
Mais si la tâche précédente est plantée sévère, je ne réponds pas du comportement de PrevInstance. Et de toutes façons, on ne pourra rien faire pour elle.
Pour les foldingues du hardcore, j'entrevois l'utilisation de l'API Windows pour détecter le module chargé, récupérer son ID de process, et lui envoyer un Kill. Moi je savais faire ça sous Unix, mais pas sous Windows.
S'il y a un candidat, yaka ! :roll:
Moralité : yakapa faire des programmes qui plantent ! :mouarf: