2012-07-05 17 views
10

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

+2

チェックをポップアップさjavawを使用します - [http://stackoverflow.com/questions/5297341/calling-java-library-jar-from-vba-vbscript-visual-basic-classic][1] [1]:のhttp:// stackoverflow.com/questions/5297341/calling-java-library -jar-from-vba-vbscript-visual-basic-classic – sreehari

+0

これらの議論はすべて不可能であると伝えています。 –

+0

これはいかがですか? http://stackoverflow.com/questions/10879757/vba-shell-java-call-errors – JimmyPena

答えて

22

はい、可能です。

実際にはかなりの方法があり、私の例が好きであれば幸いです。

これを実証するために、いくつかのテキストが引数として送信され、プログラムが変更されたバージョンで応答するプログラムを作成します。私はそれを実行可能な瓶を作った。最初の例は、argsなどの引数を標準入力から読み込みます。

ファイルHello.javaH1.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.javaH2.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ですが、次に作成する必要があります。use a manifest(これは少し過剰です)。

今ExcelでモジュールとWindows Script Host Objectへの参照を追加します。あなたが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 

I応答を得る:

STDOUT:こんにちはMargus。

STDOUT:こんにちはMargus。

あなたはこれが有用であることが判明した場合、upvoteすることを忘れないでください:私はそれを使用しましたD

+1

変数** program **には、エラーストリームやリターンコードなどの有用な情報が追加されています。 – Margus

+1

@sreehari私は、既存のExcelファイルからセルのデータを読み込んで処理し、同じファイルに戻すプログラムを作成しました。私はJavaには新しいものではありませんが、Excelのマルコスにとってはまったく新しいものです。マクロを書く必要がありますか?私はそれについての手がかりを持っていないし、チュートリアルはあなたに何か情報を与えていない。それでどうすればいいですか? –

+1

ExcelでVBA環境を開くには、 "alt + f11"を使用します。別の方法は、開発者のリボンのVisual Basicボタンを使用することです。 Excelには各シートのコードページがありますが、Moduleは共有スペースのようです。 CMDでプログラムを実行するには、** java -jar "C:¥H1.jar" Margus **コマンドを使用できます。書き込む必要のあるコードはほとんどありません。 – Margus

3

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

+0

本当ではありません。 VBAとJavaの統合は不可能ではありません。しばらく前には、残念なことにOracleによって廃止された良い古いSun Java ActiveX Bridgeもありました(まだJava 1.4でも利用可能です:http://docs.oracle.com/javase/1.4.2/docs/guide/beans/ axbridge/developerguide /)。しかし、まだ利用可能な技術があります。 Obba http://www.obba.infoはVBAから使用できます。また、xlloopを使用することもできます。 –

0

は...注意、それ以外の場合は黒いウィンドウがこの

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 
+0

質問はJavaプログラムを書くことでした – user7294900

+0

コメントありがとうございましたが、質問は 'マクロの助けを借りてJavaプログラムを実行できますか?この解決法はsleepメソッドを使わず、javaの代わりにjavawを指摘しています – mschwehl

関連する問題