Excel / VBA から長時間実行される外部プログラムを呼び出すにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/135158

質問

Excelから外部プログラムを実行する最良の方法は何ですか?数分間実行される場合があります。これを行うためのベストプラクティスは何ですか。理想的には、

  1. プロセスが実行中であることをユーザーに知らせるモデル ダイアログ ボックス。
  2. 実行可能ファイルが失敗した場合、ユーザーは通知を受け取る必要があります。
  3. タイムアウトを強制する必要があります。
  4. ダイアログ ボックスにキャンセル ボタンが表示されるはずです。

ただし、ベスト プラクティスは大歓迎です。.dll または .exe を呼び出すソリューションに興味があります。Excel '03 以前で動作するものが望ましいですが、それ以降のバージョンに移行する理由も知りたいです。

役に立ちましたか?

解決

これら 2 つの Microsoft KB 記事を確認してください。

Visual Basic から Win32 アプリケーションを起動する方法そして

32 ビット アプリケーションを使用してシェル プロセスがいつ終了するかを判断する方法

どちらも、プロセスを起動してその完了を確認するためのフレームワークをすぐに提供します。各 KB 記事には、関連する可能性のある追加の参考資料がいくつかあります。

後者のナレッジベースの記事では、シェル プロセスが終了するまで無限に待機することを前提としています。

ret& = WaitForSingleObject(proc.hProcess, INFINITE) 関数呼び出しを、ミリ秒単位の有限時間が経過した後に戻るように変更できます。INFINITE をミリ秒を表す正の値に置き換え、全体を Do While ループでラップします。戻り値により、プロセスが完了したか、タイマーが切れたかがわかります。プロセスが終了した場合、戻り値は 0 になります。

戻り値がゼロ以外の場合、プロセスはまだ実行中ですが、制御はアプリケーションに返されます。この間、アプリケーションを積極的に制御できる間、何らかの UI ステータスを更新するかどうか、キャンセルを確認するかどうかなどを決定できます。または、もう一度ループして、さらに待つこともできます。

シェルを実行しているプログラムが自分で作成したものである場合には、追加のオプションもあります。そのウィンドウの 1 つに接続して、プログラムにメッセージを投稿させ、そのメッセージに添付してステータス フィードバックとして使用することができます。検討する必要がある場合は、これを別の項目として残しておくのが最善です。

プロセス構造体を使用して、呼び出されたプロセスから戻り値を取得できます。これを有効にするには、プロセスが値を返す必要があります。

この種のニーズに対する私の一般的なアプローチは次のとおりです。

  1. プロセスの開始時に、キャンセル ボタンを備えた非モーダル ステータス ダイアログをユーザーに提供します。キャンセル ボタンをクリックすると、後でチェックされるフラグが設定されます。ユーザーに何らかのステータスを提供することはおそらく不可能であるため、経過時間やアニメーション GIF の 1 つをユーザーに提供すると、期待を管理するのに役立つかもしれません。
  2. プロセスを開始する
  3. プロセスが完了するまで待ち、500ミリ秒ごとにキャンセルチェックを許可します
  4. プロセスが完了したら、ダイアログを閉じて続行します。
  5. プロセスが完了していない場合は、ユーザーがキャンセルを押したかどうかを確認し、キャンセルした場合はプロセスのウィンドウに終了メッセージを送信します。これは機能しない可能性があり、プロセスの終了が必要になる場合があります。これを行う場合は注意してください。プロセスが適切に閉じられない場合は、プロセスを放棄するのが最善の策かもしれません。この時点でタイムアウトを確認し、ユーザーがキャンセルを押した場合と同じパスをたどることもできます。

これが役立つことを願っています、ビル。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top