web-dev-qa-db-ja.com

実行するMicrosoftExcelマクロJavaプログラム

JxlとPOIAPIを使用してJavaプログラムを使用してExcelファイルを読み書きすることを学びました。Javaプログラムを実行することは可能ですか?マクロの助け?

9
Nimit_ZZ

はい、可能です。

実際にはかなりの数の方法があります。私の例を気に入っていただければ幸いです。

これを実証するために、一部のテキストが引数として送信され、プログラムがその変更されたバージョンで応答するプログラムを作成します。実行可能な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に賛成することを忘れないでください

21
Margus

VBAは出力をファイルに書き込むことができ、Javaはファイルの変更を定期的にポーリングしてファイルから読み取ることができます。また、別のファイルを介してデータをVBAに書き戻すことができます。VBA-Javaの統合は、JavaプログラムをシェルからSystem.execute(...)を介して起動するだけでない限り、ほぼ不可能です。

3
sreehari

私はそれを使用しました..注意、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
1
mschwehl

他の提案された解決策よりもはるかに優れているのは、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で実行できるすべてのことを実行できるオブジェクトモデル。

0
Tony Roberts