Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2013)
Shell処理の完了を待つ方法
投稿日時: 24/07/24 17:05:16
投稿者: HT

Dim WB As Workbook, WS As Worksheet
wk_s = Shell("C:\copy.bat")
 
Set WB = Workbooks.Open(Filename:="C:test.xlsx")
Set WS = WB.Worksheets("Sheet1")
 
上記は、copy.batで"test.xlsx"をコピーした後に、そのエクセルを開く
というものですが、Shellコマンドが実行完了(コピーが完了)する前に
ファイルのOPEN処理がされてしまいます。完了を待ってOPEN処理をする
方法はありますか?
なお、インターネットで、「APIを利用した同期処理」がありましたが
それを利用すればよいのでしょうか?
 
 

回答
投稿日時: 24/07/24 18:15:57
投稿者: sk

引用:
wk_s = Shell("C:\copy.bat")

とりあえず、そのバッチファイルによって実行しようとしている処理の詳細、
およびその処理を実行する手段としてバッチファイルを選択された
意図や目的について具体的に明記されることをお奨めします。
 
引用:
上記は、copy.batで"test.xlsx"をコピーした後に、そのエクセルを開く
というものですが

もし「特定のファイルをただコピーするだけ」の処理なのであれば、
普通に FileCopy ステートメントを呼び出せば充分であり、敢えて
バッチファイルを使用する必要はないと思いますが。

投稿日時: 24/07/24 18:31:09
投稿者: HT

処理の内容は、EXCELをコピーして、そのEXCELの見出行が先頭2行にわたっているため(1行目が見出項目英字、2行目が見出項目日本語)1行目を行削除して保存するものです。コピー元のEXCELをACCESSにインポートしたいのですが、見出行が先頭2行にわたっているための行削除です。行削除してインポートします
 
バッチファイルを選択したのは、それしか知らなかったからです。上記であれば、ご教授いただいた「FileCopy ステートメント」で大丈夫ということですね?

回答
投稿日時: 24/07/24 18:52:51
投稿者: simple

既にご指摘のとおりかと思います。
 
Copyではなく、VBAの対応するメソッドやステートメントがないような
他のアプリケーションの実行などであれば、
次のような方法もありますので、参考までにメモしておきます。
今後の参考にしてください。
 
WScript.Shell のRunメソッドを使い、その3番目の引数にTrueをセットすると、
同期処理(その処理が終わるのを待って、次の行に制御が進む)が行われます。
【参考】
https://atmarkit.itmedia.co.jp/ait/articles/0709/12/news125.html
 

Sub test()
    Dim WB As Workbook, WS As Worksheet
    Dim objShell As Object
    Set objShell = CreateObject("WScript.Shell")
    objShell.Run "cmd /c copy.bat", , True

    Set WB = Workbooks.Open(Filename:="C:test.xlsx")
    Set WS = WB.Worksheets("Sheet1")
End Sub

投稿日時: 24/07/25 09:14:17
投稿者: HT

FileCopyで解決しました。ありがとうございました
ご教授いただいた「WScript.Shell のRunメソッド」については理解していき今後に役立てたいです
ありがとうございました