Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1617 / 13644 ツリー ←次へ | 前へ→

【73033】起動したアプリケーションが処理終了するまで次のステップに進まずに待つ かな 12/10/26(金) 9:24 質問[未読]
【73036】Re:起動したアプリケーションが処理終了す... ichinose 12/10/28(日) 9:30 発言[未読]
【73037】Re:起動したアプリケーションが処理終了す... かな 12/10/29(月) 14:10 質問[未読]
【73039】Re:起動したアプリケーションが処理終了す... ichinose 12/10/29(月) 18:21 発言[未読]
【73041】Re:起動したアプリケーションが処理終了す... H. C. Shinopy 12/10/30(火) 20:32 発言[未読]
【73092】Re:起動したアプリケーションが処理終了す... かな 12/11/8(木) 22:05 発言[未読]
【73091】Re:起動したアプリケーションが処理終了す... かな 12/11/8(木) 21:59 発言[未読]

【73033】起動したアプリケーションが処理終了する...
質問  かな  - 12/10/26(金) 9:24 -

引用なし
パスワード
   エクセルからMACファイルを起動させるマクロを作成しました。

そこで、マクロファイルを起動させてからのマクロファイルのプログラム実行時間が、10秒くらいかかります。

その処理が終わったら、またVBAのコードに戻り、次の処理へ移りたいのですが、
起動したら、すぐに他アプリケーションの処理が完了せずに、
次のコードへと進んでしまいます。

どうしたら、他アプリケーションの処理実行が終了するまで待つことができるのでしょうか?

どうかご教授お願いします。

現在のソース

Sub マクロ起動()

Const vbHide = 0       'ウィンドウを非表示
Const vbNormalFocus = 1   '通常のウィンドウ、かつ最前面のウィンドウ
Const vbMinimizedFocus = 2  '最小化、かつ最前面のウィンドウ
Const vbMaximizedFocus = 3  '最大化、かつ最前面のウィンドウ
Const vbNormalNoFocus = 4  '通常のウィンドウ、ただし、最前面にはならない
Const vbMinimizedNoFocus = 6 '最小化、ただし、最前面にはならない

Dim objWShell

Set objWShell = CreateObject("WScript.Shell")

objWShell.Run "rundll32.exe url.dll" & _
      ",FileProtocolHandler " & ThisWorkbook.Path & "\TEST.mac", vbHide, True

↑起動させてから、処理を行うのに少々時間がかかる

Set objWShell = Nothing

MsgBox "完了" ←他アプリケーションの処理が終わる前に、メッセージが先に出てしまう。
End Sub

【73036】Re:起動したアプリケーションが処理終了...
発言  ichinose  - 12/10/28(日) 9:30 -

引用なし
パスワード
   こんにちは。

>エクセルからMACファイルを起動させるマクロを作成しました。
>
>そこで、マクロファイルを起動させてからのマクロファイルのプログラム実行時間が、10秒くらいかかります。
環境ないので、MACファイルでは試していませんが、
VBA付WordDocumentで試した限りでは、
objWShell.Run "rundll32.exe url.dll" & _
      ",FileProtocolHandler " & ThisWorkbook.Path & "\TEST.Doc", vbHide, True

でWordアプリが終了するまで、待機していましたけどねえ


試行1

objWShell.Run ThisWorkbook.Path & "\TEST.MAC", 0, True

関連付けされているならば、上記では、どうでしょうか?


試行2
wshshellのExecメソッド(アプリケーション名も指定する)で
Statusプロパティを管理する方法

msdn.microsoft.com/ja-jp/library/cc364410.aspx

ここにVBSですが、サンプルコードがあります。

どちらかが利用できませんか?

試してみてください

【73037】Re:起動したアプリケーションが処理終了...
質問  かな  - 12/10/29(月) 14:10 -

引用なし
パスワード
   ▼ichinose さん:
>VBA付WordDocumentで試した限りでは、
>objWShell.Run "rundll32.exe url.dll" & _
>      ",FileProtocolHandler " & ThisWorkbook.Path & "\TEST.Doc", vbHide, True
>
>でWordアプリが終了するまで、待機していましたけど

こちらで動作確認何度してみても、待機しずに次へコードが進んでしまい、
完了メッセージが出てしまいます。

>試行1
>
>objWShell.Run ThisWorkbook.Path & "\TEST.MAC", 0, True
>
 試行1で試してみましたが、下記のようなエラーがでてしまいます。
 【Runメソッドは失敗しました 'I wshshell3'オブジェクト】
 理由が分からなくて悩んでます。

マクロファイルは特殊なのでしょうか?
 "rundll32.exe url.dll" & _
      ",FileProtocolHandler " &
rundll32.exeというプログラムを経由しないと、ファイルの起動がうまくいかないのです。

>
>試行2
> wshshellのExecメソッド(アプリケーション名も指定する)で
> Statusプロパティを管理する方法
>
>msdn.microsoft.com/ja-jp/library/cc364410.aspx
>
 上記サイトを見てみましたが、理解不足もあって、どう書いたらいいのか?
 悪戦苦闘してます。

この問題を解決するのは、難しいのでしょうか?

【73039】Re:起動したアプリケーションが処理終了...
発言  ichinose  - 12/10/29(月) 18:21 -

引用なし
パスワード
   こんばんは。


>こちらで動作確認何度してみても、待機しずに次へコードが進んでしまい、
>完了メッセージが出てしまいます。
確かに
"rundll32.exe url.dll" & _
      ",FileProtocolHandler "・・・・
これ、非同期と書かれています、でも、Wordでは同期がとれていました。

>
>>
>>objWShell.Run ThisWorkbook.Path & "\TEST.MAC", 0, True
>>
> 試行1で試してみましたが、下記のようなエラーがでてしまいます。
> 【Runメソッドは失敗しました 'I wshshell3'オブジェクト】
> 理由が分からなくて悩んでます。
ファイルがアプリと関連付けされていないのですか?
例えば、TEST.MACというファイルをダブルクリックすると、
アプリが起動してプログラムが実行されるという仮定で

>>objWShell.Run ThisWorkbook.Path & "\TEST.MAC", 0, True

このコードを記述しました。関連付けされていないとすると、・・・

あっ、ひょっとして

objWShell.Run """" & ThisWorkbook.Path & "\TEST.MAC""", 0, True

Pathに空白とかありますか?


試行2ついては、上記がだめだったら、コードを記述します。

【73041】Re:起動したアプリケーションが処理終了...
発言  H. C. Shinopy  - 12/10/30(火) 20:32 -

引用なし
パスワード
   ちょっと割り込みで失礼。

Run メソッドのページ
msdn.microsoft.com/ja-jp/library/cc364421.aspx
を見ると:

次の VBScript コードも上記と同じ処理を実行する例ですが、ウィンドウの種類を指定し、ユーザーがメモ帳を終了するまで待機し、終了時にメモ帳から返されるエラー コードを保存する点が異なります。
Set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("notepad " & WScript.ScriptFullName, 1, true)
―とあります。

これをVBAに置き換えると、
例えばデスクトップの「Test.txt」をノートパッドで開き、
閉じた後でエラーコードを表示する場合:

Sub MyTestTxt()
 Dim myWshShell As Object
 Dim myReturn As Long
 '
 Set myWshShell = CreateObject("WScript.Shell")
 myReturn = myWshShell.Run("notepad " & myWshShell.SpecialFolders("Desktop") & "\Test.txt", 1, True)
 '
 MsgBox myReturn
End Sub ' MyTestTxt *----*----*  *----*----*  *----*----*  *----*----*

但し、引数intWindowStyleを「0(ウィンドウを非表示にし、別のウィンドウをアクティブにします。)」にすると、続きの処理ができず、Excelを強制終了せざるを得ませんでした。
御質問の内容からして、1や7を指定するべきでしょうか?

【73091】Re:起動したアプリケーションが処理終了...
発言  かな  - 12/11/8(木) 21:59 -

引用なし
パスワード
   ▼ichinose さん:

やはり・・・だめなようです。

いろいろ調べてみたのですが、
マクロファイル(.mac)自身、コードを別アプリケーションに送っているだけなので、
別アプリケーションが作動する形になっていて、その別アプリケーションが終了したかどうか?というのは、取得できないようです・・・(泣)

別の方法を考えてみることにします。

いろいろありがとうございました

【73092】Re:起動したアプリケーションが処理終了...
発言  かな  - 12/11/8(木) 22:05 -

引用なし
パスワード
   ▼H. C. Shinopy さん:

ご教授ありがとうございます。

やはり。。。ダメでした。

今は、どうにか、方法を変えて、
マクロファイルを作らずに、直接ホストへ送信?するみたいな流れに変えました。
これも、四苦八苦しながらですけど・・・(汗)

ありがとうございました

1617 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free