2023年1月29日日曜日

VBAで外部アプリケーションのブラウザを起動させる方法には、コツがいると分かった - WScript.Shell(VBA)

       
外部アプリケーションを起動する時、VBAのShell関数を使えば簡単にできます。
ネット検索で簡単に見つかりますが、最もシンプルなコードは次の通りなんだ。

Sub NotePad()
Shell "notepad.exe" 'メモ帳を起動する実行ファイル
End Sub

Sub NotePadKill()
Shell "taskkill.exe /F /IM notepad.exe" '強制的に終了する実行コマンド
End Sub

それで、立ち上げたアプリケーションは、この関数を使って強制終了できます。
上に上げたコードの通りですが、このtaskkill.exeの挙動がおかしい場合もある。

それは、For~Nextのようなループ処理の中で、強制終了を実行したときです。
自分のケースでは、ブラウザのクロームで複数タブを開いていくプロセスなの。

タブを二三十個ほど開きますが、たくさん開かずに、途中で終了させています。
そして、再度、クロームを立ち上げて全部開き終えたら、ブラウザを閉じます。

Sub ChrmRun()
    With CreateObject("Wscript.Shell")
     .Run "chrome.exe -url https://www.yahoo.co.jp/"
    End With  'クロームを実行してヤフーを開く
End Sub

このブラウザを開くコードは、OSに関連付けられていないアプリに向いている。
上記のShell関数ですと、実行ファイルのフォルダーまでパスが通っていました。

しかし、ブラウザのクロームは、"ChDir”でパスを通しても、起動できません。
なので、代わりに"Wscript.Shell"のオブジェクトを指定すると立ち上がります。

それで、気がついたのは、ループ処理の中でブラウザを強制終了する場合です。
ブラウザが終了しないで、そのままタブが開き続けてしまうのを発見しました。

なぜなのか、分からないでいましたが、ある時、ネットのコードに気がついた。
それは、”cmd.exe”という、コマンドプロンプトから強制終了させることです。

Sub CrmeKill()
Shell "cmd.exe /c taskkill.exe /F /IM chrome.exe"
End Sub  '強制終了の実行コマンド

このコマンドラインに、起動オプションの"/c”がついていますが、これがキモ。
文字列に指定されたコマンドを実行した後で終了すると、説明されていました。

というわけで、ループ処理内でも、このコマンドプロンプトから強制終了可能。
ただ、ループ処理の中で、ブラウザを閉じて後に、改めて立ち上げたら、最初に指定したURLが開かずに、次に指定したURLから開いてくるエラーがあるので、この対策は、次回の説明にしようと思ったのでした。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿