JxlとPOIAPIを使用して、Javaプログラムを使用してExcelファイルを読み書きする方法を学びました。マクロの助けを借りてJavaプログラムを実行することは可能ですか?
4 に答える
はい、可能です。
実際にはかなりの数の方法があります。私の例を気に入っていただければ幸いです。
これを実証するために、いくつかのテキストが引数として送信され、プログラムがその変更されたバージョンで応答するプログラムを作成します。実行可能なjarファイルを作成しました。最初の例では、引数をargsから読み取り、その他を標準入力から読み取ります。
ファイルHello.javaおよびH1.jar:
public class Hello {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
if (args.length > 0)
sb.append(' ').append(args[0]);
System.out.println(sb.append('.').toString());
}
}
ファイルHello2.javaおよびH2.jar:
import java.util.Scanner;
public class Hello2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder("Hello");
sb.append(' ').append(sc.nextLine());
System.out.println(sb.append('.').toString());
}
}
それらを1つのjarに保存できますが、マニフェストを作成して使用する必要があります(これは少しやり過ぎです)。
ここで、Excelで、モジュールとWindows ScriptHostObjectへの参照を追加します。が気に入らない場合は、次のようにsleep
置き換えることができますDoEvents
。
'add a reference to Windows Script Host Object Model
'for example : Tools-References
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub RunSleep( _
exec As WshExec, _
Optional timeSegment As Long = 20 _
)
Do While exec.Status = WshRunning
Sleep timeSegment
Loop
End Sub
Private Function RunProgram( _
program As String, _
Optional command As String = "" _
) As WshExec
Dim wsh As New WshShell
Dim exec As WshExec
Set exec = wsh.exec(program)
Call exec.StdIn.WriteLine(command)
Call RunSleep(exec)
Set RunProgram = exec
End Function
そしてそれをテストするために、私はファイルをドライブに保存しc:\
、コードを使用しました:
Public Sub Run()
Dim program As WshExec
Set program = RunProgram("java -jar ""C:\\H1.jar"" Margus")
Debug.Print "STDOUT: " & program.StdOut.ReadAll
Set program = RunProgram("java -jar ""C:\\H2.jar", "Margus")
Debug.Print "STDOUT: " & program.StdOut.ReadAll
End Sub
私の場合、私は次の応答を受け取ります:
STDOUT:こんにちはマーガス。
STDOUT:こんにちはマーガス。
VBAは出力をファイルに書き込むことができ、Javaはファイルの変更を定期的にポーリングしてファイルから読み取ることができます。そして、別のファイルを介してデータをVBAに書き戻します。VBA-System.execute(...)を介してシェルからJavaプログラムを起動するだけでない限り、Java統合はほぼ不可能です。
私はそれを使用しました..注意、javawを使用してください。そうしないと、黒いウィンドウがポップアップします。
Dim result As String
Dim commandstr As String
commandstr = "javaw -jar somejar someparameter"
' try with or without cast to string
result = CStr( shellRun(commandstr) )
'somewhere from SO but forget.. sorry for missing credits
Public Function ShellRun(sCmd As String) As String
'Run a shell command, returning the output as a string'
Dim oShell As Object
Set oShell = CreateObject("WScript.Shell")
'run command'
Dim oExec As Object
Dim oOutput As Object
Set oExec = oShell.exec(sCmd)
Set oOutput = oExec.StdOut
'handle the results as they are written to and read from the StdOut object'
Dim s As String
Dim sLine As String
While Not oOutput.AtEndOfStream
sLine = oOutput.ReadLine
If sLine <> "" Then s = s & sLine & vbCrLf
Wend
ShellRun = s
End Function
他の提案された解決策よりもはるかに優れているのは、Jinx( https://exceljava.com )を使用してJavaでExcelアドインを作成することです。
JavaでExcelマクロを作成する方法の詳細については、https://exceljava.com/docs/macros.htmlを参照してください。
マクロだけでなく、ユーザー定義の関数やメニューを作成することもできます。
実際、JavaをVBAの完全な代替として使用できます。Excelオブジェクトモデルを呼び出してJavaからVBAで実行できるすべてのことを実行できるようにする方法については、https://github.com/exceljava/jinx-com4jを参照してください。