みなさん、こんにちは。
ITソリューション事業部の林です。
本記事では、ExcelVBAのテクニックを紹介・解説いたします。
今回は、「外部アプリケーションと連携」するマクロを紹介します。
【目次】
それでは、始めましょう!
VBAマクロと外部アプリケーションの連携について
WindowsOSのコンピュータで動くアプリケーションには、メモ帳やペイントなどさまざまなものが備わっています。
これらのアプリケーションをVBAマクロから動作させるには、「WScript(Windows Script Host)」と、WScriptの「WshShell」クラスを使用します。
WshShellクラスは、WindowsOSの操作が可能な「Windowsバッチファイル」というファイルを実行することもできます。
ExcelVBAはExcelの機能を利用できますが、外部アプリケーションとの組み合わせればさらに便利なマクロを作れます。
例えば、テキストファイルを出力するマクロの終了時にフォルダを開く機能を持たせれば、出力されたファイルをすぐ確認できますし、ExcelマクロからWindowsバッチファイルを作成して、それをすぐに実行させることができれば、実質的にVBAでWindowsの機能を利用できることになります。
つまり、外部アプリケーションと連携することでより便利なマクロが作れるようになる、ということです。
外部アプリケーションと連携するコード
「WScript(Windows Script Host)」と「WshShell」を参照可能にするには、CreateObject関数を使用して以下のように記述します。
CreateObject("WScript.Shell").Run 外部アプリケーションのパス, ウインドウの表示形式, 終了待ち指定
「外部アプリケーションのパス」には、exeファイルのパスや、exeファイルに渡す引数などを一連の文字列で記述します。
「ウインドウの表示形式」は、外部アプリのウインドウの表示を指定できます。
指定できる値は整数です。
表示方法は何種類かあるのですが、基本的には非表示指定の"0"、表示指定の"1"をおさえておいてください。
「終了待ち指定」とは、外部アプリが終了するまでマクロを「待たせる」「待たせない」の指定ができます。
マクロを待たせる場合は"True"を、待たせない場合は"False"を指定します。
実際のコードにすると以下になります。
メモ帳(notepad.exe)を起動させ、ウインドウを表示(表示指定=1)させ、メモ帳が起動したらマクロが終了(終了待ち=False)します。
CreateObject("WScript.Shell").Run "notepad.exe", 1, False
上記が最も短い書き方になりますが、WshShellを複数使用する場合は、オブジェクト変数から参照させる方がコードは整理されます。
後述する使用例①~③では、この書き方を採用しています。
Dim objWSH As Object Set objWSH = CreateObject("WScript.Shell") objWSH.Run "notepad.exe", 1, False
上記ではCreateObject関数でWshShellを参照しましたが、VBEの参照設定から参照させる方法もあります。
やり方は、VBEのツールバーから「ツール」⇒「参照設定」を選択し、「Windows Script Host Object Model」にチェックを入れます。
続いて、変数定義時に以下のように「IWshRuntimeLibrary.WshShell」を指定します。
Dim objWSH As New IWshRuntimeLibrary.WshShell objWSH.Run "notepad.exe", 1, False
この方法であればSetステートメントが不要になります。
また、ソースコード入力時にプロパティやメソッドを参照できるようになるので、マクロ作成しやすくなるメリットもあります。
使用例
使用例① 外部アプリケーションと連携
exeファイルのパスを指定して、外部アプリケーションを起動します。
起動するアプリケーションのパスを変更すれば他のアプリケーションの起動もできます。
アプリケーションパスにスペースがある場合には、パスの前後にダブルクオーテーションを2つ付ける必要があります。下記のコードでは3つ付いていますが、これはアプリケーションパスの前後をダブルクオーテーションで囲んでいるため、このようになっています。
Sub ExcelVBA_014_001() '===使用例1=== Dim objWSH As Object Set objWSH = CreateObject("WScript.Shell") 'WShShellクラスを参照する変数をセット objWSH.Run "notepad.exe", 1, True 'メモ帳を起動 objWSH.Run """C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe""", 1, True 'Microsoft Edgeを起動 End Sub
使用例② エクスプローラーと連携
エクスプローラー(explorer.exe)を起動するアプリケーションにすることで、指定したフォルダを開くことができます。
ショートカット(lnk)を指定して開くことも可能です。
Sub ExcelVBA_014_002() '===使用例2=== Dim objWSH As Object Set objWSH = CreateObject("WScript.Shell") 'WShShellクラスを参照する変数をセット objWSH.Run "C:\Windows\explorer.exe ""C:\Program Files (x86)""", 1, False '指定したフォルダを開く objWSH.Run "C:\Windows\explorer.exe ""C:\Users\Public\Documents\サンプル\動作確認テスト.txt - ショートカット.lnk""", 1, False 'ショートカットを開く End Sub
使用例③ Windowsバッチファイルを実行
前回の記事「テキストファイルの操作(読込&書込)」の使用例②を応用して、バッチファイルを作成後に実行します。バッチファイルの実行中は、VBAマクロ側は実行中のまま待機します。
バッチファイルにはワークシートA列の文字列が記録されます。
バッチファイルは中身のデータがテキスト形式なので、このようなやり方が可能です。
Sub ExcelVBA_014_003() '===使用例3=== 'テキストファイルの書き込み操作 Dim FileNum Dim RowCnt As Long, LastRow As Long Dim FilePath As String FileNum = FreeFile 'ファイル番号を取得 FilePath = ThisWorkbook.Path + "\Sample.bat" 'テキストファイルの保存先パスを指定 Open FilePath For Output As #FileNum '書込モードでファイルを開く LastRow = Cells(Rows.Count, 1).End(xlUp).Row 'ExcelシートA列の最終行を取得 For RowCnt = 1 To LastRow '1行目から最終行まで繰り返し Print #FileNum, Cells(RowCnt, 1).Value 'ExcelシートA列の値を書き込み Next Close #FileNum 'ファイルを閉じる 'Windowsバッチファイルを実行する Dim objWSH As Object Set objWSH = CreateObject("WScript.Shell") objWSH.Run ThisWorkbook.Path + "\Sample.bat", 1, True End Sub
終わりに
以上、マクロと外部アプリケーションと連携の方法を紹介いたしました。
使用例③ではバッチファイルを実行していますが、これ以外にもWinSCPやTeratermなどのアプリケーションでのスクリプト実行にも応用できます。
工夫次第で活用の幅はさらに広がりますので、現場での業務に応用できないか考えてもいいかもしれません。
それでは、また次回お会いしましょう!