JxlとPOIAPIを使用してJavaプログラムを使用してExcelファイルを読み書きすることを学びました。Javaプログラムを実行することは可能ですか?マクロの助け?
はい、可能です。
実際にはかなりの数の方法があります。私の例を気に入っていただければ幸いです。
これを実証するために、一部のテキストが引数として送信され、プログラムがその変更されたバージョンで応答するプログラムを作成します。実行可能な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());
}
}
それらを単一のjarに保存できますが、作成して マニフェストを使用 (少しやり過ぎです)が必要です。
ここで、Excelで、モジュールとWindows Script HostObjectへの参照を追加します。 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:こんにちはマーガス。
これが便利だと思ったら、:Dに賛成することを忘れないでください
VBAは出力をファイルに書き込むことができ、Javaはファイルの変更を定期的にポーリングしてファイルから読み取ることができます。また、別のファイルを介してデータをVBAに書き戻すことができます。VBA-Javaの統合は、JavaプログラムをシェルからSystem.execute(...)を介して起動するだけでない限り、ほぼ不可能です。
私はそれを使用しました..注意、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 を参照してください。
マクロだけでなく、ユーザー定義の関数やメニューを作成することもできます。
実際、VBAの完全な代替としてJavaを使用できます!Excelの呼び出し方法については、 https://github.com/exceljava/jinx-com4j を参照してください。 JavaからVBAで実行できるすべてのことを実行できるオブジェクトモデル。