• 締切済み

UWSCがうまく動かない

ExcelからUWSCを使って他のソフト2個を動かして又、Excelに 戻ってくるのですが、UWSCが重なって動作を同時に行う為、次のソフトで実行してみました。すると同時には動作せずに1個のプログラムの動作が終わって次ののプログラムを実行してくれて良くのですが、戻るときにExcelプログラムが真っ白に表示されて上の部分にファイル名と応答無と出てそれ以上進みません。UWSCソフトを終了すれば元には戻りますが、うまく操作をさせるにはどうすれば良いですか?よろしくお願いします。 UWSCの動きは⇒スタートボタンの横のタスクバーにあるソフトをクリックから始まり⇒終わったら又、Excelのタブをクリックして戻ります。 次のソフトはWebで見つけたソフトです。 外部プログラムの実行と処理待ち そこで、以下のサンプルマクロでは、Shell関数を使用して外部プログラムを実行し、そのプログラムが終了するまで待つように処理を施してあります。 *もうひとつの質問ですが、Win32 API関数の宣言はどこに記載をすればいいのですか? このままエディータに書けばいいのでしょうか '--- Win32 API 関数の宣言 --- Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _ ByVal dwMilliseconds As Long) As Long Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long '--- Win32 API 定数の宣言 --- Global Const PROCESS_ALL_ACCESS As Long = &H1F0FFF Global Const INFINITE As Long = &HFFFF Sub WaitRun() Dim TaskId As Long 'タスクID Dim hProc As Variant 'プロセスハンドル ' 外部プログラムの実行 TaskId = Shell("c:\Test.bat", 2) ' プロセスハンドルの取得 hProc = OpenProcess(PROCESS_ALL_ACCESS, False, TaskId) ' プロセスのオープン If OpenProcess(PROCESS_ALL_ACCESS, False, TaskId) <> vbNull Then ' プロセスのシグナル待ち Call WaitForSingleObject(hProc, INFINITE) ' プロセスクローズ CloseHandle hProc End If

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 ここカテゴリは、UWSCの直接のサポートは出来ないですが、基本的なことが違っているような気がしてなりません。 >TaskId = Shell("c:\Test.bat", 2) これは、Moug で出ていたテクニックですね。 ただ、Mougのサンプルテクニックが、必ずしも、正解だと私は思っていないのです。 一旦、チャイルドプロセスになって、それは、Batch プログラムが戻るようになっているという条件だと思います。それと、Batch プログラムの内容にも依存してくるような気がします。通常、そのようなコードは、「ありえない」と思うのです。単に、プロセスの戻り値を調べて、それをクローズするために、Win32 API関数を使うだけであって、そのコード自体は、あまり意味があるようには思えません。Batch プログラムは、コマンドプロンプトが動くということが前提のアプリケーションソフトでなくてはなりません。あまり、プログラムに詳しくない方が、むやみにWin32 APIには手を出さないほうがよいです。 UWSC は、UWSC 側で処理したほうが簡単だと思いますし、場合によれば、Excel VBA単独で処理してもかまわないように思います。なお、UWSC には、Win32 APIの関数と同等の機能を持つ関数はそろえているはずです。 もう少し、UWSC のヘルプとサイトをごらんになって勉強されたほうがよろしいのではないでしょうか。Moug のサンプルマクロは、意味が違うと思います。 それから、UWSC 自体は、UWSCが先に起動するようなスタイルのほうが多いのではないかと思います。 Help には、 # COM (ActiveX): Excelや InternetExplorer等の COMインターフェースを備えたアプリの制御ができます 例: Excel = CreateOLEObj("Excel.Application") (ただし、COMで、組み込んだものが、正しく外れるのかは、私は試したことがないので分かりません。実行後、終了した時点で、タスクマネージャーのプロセス側で確認したほうがよさそうです。)

saab8743
質問者

お礼

Win32は私自身も触らないほうが良いと思っています。丁寧な回答ありがとうございました。UWSCのヘルプで勉強したいと思います。

関連するQ&A