2008-09-25 13 views
2

Quelle est la meilleure façon d'exécuter un programme externe à partir d'Excel. Cela pourrait durer plusieurs minutes. Quelle est la meilleure pratique à ce sujet? Idéalement,Comment puis-je appeler un programme externe de longue durée à partir d'Excel/VBA?

  1. Boîte de dialogue de modèle qui permet à l'utilisateur de savoir que le processus est en cours d'exécution.
  2. Si l'exécutable échoue, l'utilisateur doit recevoir une notification.
  3. Un délai d'attente doit être appliqué.
  4. Un bouton d'annulation doit figurer dans la boîte de dialogue.

Mais les meilleures pratiques sont les bienvenues. Je suis intéressé par les solutions avec l'appel d'un .dll ou d'un .exe. De préférence quelque chose qui fonctionne avec Excel '03 ou plus tôt, mais j'aimerais entendre une raison de passer à une version ultérieure.

Répondre

5

Vous devriez vérifier ces deux articles Microsoft KB

How to launch a Win32 Application from Visual Basic et

How To Use a 32-Bit Application to Determine When a Shelled Process Ends

Ils ont tous deux vous donnent rapidement le cadre de lancer un processus, puis vérifier son achèvement. Chacun des articles de la base de connaissances contient des références supplémentaires qui peuvent être pertinentes.

Ce dernier article de la base de connaissances suppose que vous souhaitez attendre une durée infinie pour que votre processus shell se termine.

Vous pouvez modifier le ret & = WaitForSingleObject (proc.hProcess, INFINI) appel de fonction pour revenir après un certain laps de temps fini en millisecondes - remplacer INFINI avec une valeur positive représentant millisecondes et envelopper le tout dans un Do While boucle. La valeur de retour vous indique si le processus s'est terminé ou si le délai s'est écoulé. La valeur de retour sera zéro si le processus s'est terminé.

Si la valeur de retour est différente de zéro, le processus est toujours en cours, mais le contrôle est renvoyé à votre application. Pendant ce temps, alors que vous avez un contrôle positif sur votre application, vous pouvez déterminer si vous souhaitez mettre à jour un statut d'interface utilisateur, vérifier l'annulation, etc. Ou vous pouvez faire une boucle et attendre encore plus.

Il y a même des options supplémentaires si le programme que vous utilisez est quelque chose que vous avez écrit. Vous pouvez vous connecter à l'une de ses fenêtres et faire en sorte que le programme publie des messages auxquels vous pouvez attacher et que vous utiliserez comme retour d'état. C'est probablement mieux pour un article séparé si vous avez besoin de le considérer.

Vous pouvez utiliser la structure de processus pour obtenir une valeur de retour du processus appelé. Votre processus doit renvoyer une valeur pour que cela soit utile.

Mon approche générale à ce genre de besoin est:

  1. donner à l'utilisateur une boîte de dialogue d'état non-modale au début du processus avec un bouton d'annulation, qui lorsque vous cliquez dessus définir un indicateur pour être vérifié plus tard. Fournir à l'utilisateur n'importe quel statut est très probablement impossible, donc leur donner un temps écoulé ou l'un de ces GIF animés pourrait être utile dans la gestion des attentes.
  2. démarrer le processus
  3. Attendez la fin du processus, ce qui permet l'annulation vérifier toutes les 500ms
  4. Si le processus est terminé, fermez le dialogue et continuer le long.
  5. Si le processus n'est pas terminé, voir si l'utilisateur a cliqué sur annuler et, le cas échéant, envoyer un message de fermeture à la fenêtre du processus. Cela peut ne pas fonctionner et terminer le processus peut être nécessaire - attention si vous faites cela. Votre meilleur pari peut être d'abandonner le processus s'il ne se ferme pas correctement. Vous pouvez également vérifier un délai d'attente à ce stade et essayer de prendre le même chemin que si l'utilisateur cliquait sur annuler.

Espérons que cela aide, Bill.

+0

merci pour l'aide Bill. –