VBAからJava文字列の出力を取得する
Java関数の出力文字列をVBAプロジェクトに取り込む必要があります。簡単な例として、Javaバージョンの出力をインストールしようとしていますが、実際のアプリケーションでは他のプライベート関数になります。
最初の試み:
' Needs a reference to Windows Script Host Object Model
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub get_java_output()
Dim cmd_windows As New WshShell
Dim execution_cmd As WshExec
Dim command_str As String
command_str = "java -version"
Set execution_cmd = cmd_windows.exec("cmd.exe /c " & command_str)
Do While execution_cmd.Status = WshRunning
Sleep 20
Loop
final_string = execution_cmd.StdOut.ReadAll
Debug.Print final_string
End Sub
2回目の試み:
Sub get_java_output_2()
Dim windows_shell As Object
Set windows_shell = CreateObject("WScript.Shell")
command_str = "java -version"
shell_output = windows_shell.Run("cmd /c " & command_str & " > c:\temp\output.txt", 0, False)
Set fso = CreateObject("Scripting.FileSystemObject")
Set File = fso.OpenTextFile("c:\temp\output.txt", 1)
final_string = File.ReadAll
File.Close
Debug.Print final_string
End Sub
それらのどれも私のために働いていませんでした。
2回目の試行例のように、一時ファイルの使用を避けたいと思います。最終的な使用法では、この関数を数十万回呼び出しますが、その量のファイルを作成したり、そのファイルを何度も編集したりすることは好みません...
回答
私は両方の試みの解決策を見つけましたが、基本的には同じ問題です。コマンドシェルに表示されるJava関数の出力はエラーとして扱われるため、出力ではありません。疑問はここで解決されました
Java出力をファイルに送信する場合、ここで説明されているようにでは2>
なく、を使用して解決さ>
れます。とにかく、この他のリンクで報告されているように、必要なものに応じてさまざまなバリエーションがあります。この方法の小さな問題は、出力ファイルの作成に時間がかかることです。したがって、Run
コマンドの最終変数を次のように設定する必要があります。True
そして、コードは次のとおりです。
Sub get_java_output_2()
Dim windows_shell As Object
Set windows_shell = CreateObject("WScript.Shell")
command_str = "java -version"
shell_output = windows_shell.Run("cmd /c " & command_str & " 2> c:\temp\output.txt", 0, True)
Set fso = CreateObject("Scripting.FileSystemObject")
Set File = fso.OpenTextFile("c:\temp\output.txt", 1)
final_string = File.ReadAll
File.Close
Debug.Print final_string
End Sub
Java出力を変数に直接取得する場合は、のStdErr
代わりにを使用して解決されStdOut
ます。このリンクを読んでイルミネーションを手に入れました。WshExec
オブジェクトは、3つの主要な要素がありますStdErr
、StdIn
とStdOut
。Java出力文字列がエラーとして扱われる場合は、StdErr
代わりに内部にある必要があります。
そして、コードは次のとおりです。
' Needs a reference to Windows Script Host Object Model
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub get_java_output()
Dim cmd_windows As New WshShell
Dim execution_cmd As WshExec
Dim command_str As String
command_str = "java -version"
Set execution_cmd = cmd_windows.exec(command_str)
Do While execution_cmd.Status = WshRunning
Sleep 20
Loop
final_string = execution_cmd.StdErr.ReadAll
Debug.Print final_string
End Sub