Excel と VBAは、COM インターフェイスを備えている場合、つまり、アプリケーションをオブジェクトとして宣言し、オブジェクトのインスタンスを作成し、そのメソッドと属性を確認できる場合、外部アプリケーションを制御できます。
プログラムの COM ラッパーを入手できる可能性がある場合は、そのようにしてください。
それができない場合... I/O ストリームと Windows シェル オブジェクトを使用してそれを行うのは楽しくありません。コマンドライン DOS インターフェイスはユーザー インターフェイスとしては特に使いやすくなく、環境でのブレイクダンスよりも不安定だからです。それらを VBA で API として使用しようとすると、ペストリー ファクトリになります。
まず、Windows スクリプト ホスト オブジェクト モデルによって公開される 'WshShell' オブジェクトが必要です。次のように、遅延バインディングによって宣言およびインスタンス化できます。
Dim objWshell As Object
Set objWshell = CreateObject("WScript.Shell")
ただし、正しい方法 (プロパティとメソッドの Intellisense ドロップダウンが表示されます) は、[ツール:参照...] ダイアログを使用して、通常は C:\Windows にある親ライブラリへの参照を作成することです。 \System32\wshom.ocx
次に、Shell オブジェクトを次のように宣言できます。
Dim objWshell As IWshRuntimeLibrary.WshShell
Set objWshell = New IWshRuntimeLibrary.WshShell
コマンドライン実行可能ファイルを実行し、VBA で I/O ストリームを読み取る
:
これは、コマンド ウィンドウを開いてコマンド ライン実行可能ファイルを実行し、コマンド ライン スイッチ '-s' と二重引用符で囲まれたパラメーターを入力する例です。
私が実行している実行可能ファイルは「regsvr32.exe」ではないことに注意してください。私のシェル オブジェクトは cmd.exe を実行しており、それが I/O ストリームのソースとシンクです。
もちろん、アプリケーションを直接実行することもできます。それはうまくいくかもしれません。しかし、.StdOut.ReadLine または .StdOut.ReadAll を呼び出すときに、出力ストリームが呼び出し元の関数とその VBA スレッドをロックまたは「ハング」することは非常に一般的です。
With objWshell.Exec("CMD /K")
.StdIn.WriteBlankLines 3
.StdIn.WriteLine "C:"
.StdIn.WriteLine "CD C:\"
.StdIn.WriteLine "regsvr32.exe -s " & Chr(34) & "%LIBDIR%\FXPricer.dll" & Chr(34)
.StdIn.WriteBlankLines 1
Do Until .StdOut.AtEndOfStream
Debug.Print .StdOut.ReadLine
Loop
Do Until .StdErr.AtEndOfStream
Debug.Print .StdOut.ReadLine
Loop
.Terminate
End With
共有してお楽しみください。また、いつものように、ブラウザ (または StackOverflow のテキスト ボックス インターフェイス) によってソース コード サンプルに挿入された改行に注意してください。