はじめに
業務現場では、Excelマクロ(VBA)とJavaで開発されたアプリケーションの連携ニーズが増えています。
たとえば、Excelで入力されたデータをJavaで処理したい、既存のJavaシステムをVBAから操作したいといったケースです。
この記事では、VBAから外部プロセスとしてJavaアプリを呼び出す方法と、その際の注意点を解説します。
前提条件
- Windows環境
- Javaアプリケーション(JARファイル)が作成済み
- Excel 2013以降、VBA編集可能
1. Javaアプリケーションの用意
サンプルJavaコード
// HelloApp.java
public class HelloApp {
public static void main(String[] args) {
System.out.println("Javaアプリが実行されました!");
}
}
コンパイルとJAR化
javac HelloApp.java
jar cfe HelloApp.jar HelloApp HelloApp.class
このコマンドで HelloApp.jar
が生成されます。
2. VBAからJavaを呼び出すコード
VBAコード(Shell関数でJARを実行)
Sub RunJavaApp()
Dim javaCmd As String
javaCmd = "java -jar C:\JavaApps\HelloApp.jar"
Dim result As Double
result = Shell(javaCmd, vbNormalFocus)
MsgBox "Javaアプリを起動しました(Shell戻り値: " & result & ")"
End Sub
ポイント
Shell
関数でJavaをコマンドライン起動しますjava
コマンドのパスが通っている必要があります(例:環境変数 PATH に設定)
3. Javaアプリに引数を渡す
Java側(引数対応)
public class HelloApp {
public static void main(String[] args) {
if (args.length > 0) {
System.out.println("VBAからの引数: " + args[0]);
} else {
System.out.println("引数がありません。");
}
}
}
VBA側(引数付き)
Sub RunJavaWithArgs()
Dim value As String
value = "テストデータ"
Dim cmd As String
cmd = "java -jar C:\JavaApps\HelloApp.jar """ & value & """"
Shell cmd, vbNormalFocus
End Sub
ダブルクォートで囲むことで、日本語の引数にも対応できます。
4. Javaの出力をVBAで取得する(WshShell)
VBAコード(WshShellで標準出力を取得)
Sub RunJavaAndCaptureOutput()
Dim shell As Object
Set shell = CreateObject("WScript.Shell")
Dim exec As Object
Set exec = shell.Exec("java -jar C:\JavaApps\HelloApp.jar")
Dim output As String
Do While Not exec.StdOut.AtEndOfStream
output = output & exec.StdOut.ReadLine & vbCrLf
Loop
MsgBox "Java出力:" & vbCrLf & output
End Sub
Exec
を使うと Java の出力(System.out.println)を VBA 側で取得可能です。
5. 実運用に向けたヒント
- JavaアプリからCSVやJSONで出力し、VBAで読み取る構成にすれば安定性UP
- バッチ処理は非同期実行+ログ出力でトラブル対応も簡単に
- 双方向通信が必要ならファイルやソケット、あるいは中間APIサーバを検討
まとめ
- VBAからJavaアプリを簡単に呼び出すには
Shell
またはWshShell.Exec
を使用 - 引数や出力取得も可能なので、実務でも十分に使える構成
- さらに連携精度を上げたい場合は、JSONファイルやREST APIも選択肢に入れてください