Nauczyłem się czytać i pisać plik Excela przy użyciu programu Java za pomocą interfejsu API Jxl i POI. Czy można uruchomić program Java za pomocą makr?Makro Microsoft Excel do uruchomienia programu Java
Odpowiedz
Tak, jest to możliwe.
Rzeczywiście istnieje wiele sposobów i mam nadzieję, że podoba mi się moje przykłady.
Aby to zademonstrować, tworzę program, w którym tekst jest wysyłany jako argumenty, a program odpowiada zmienioną wersją. Zrobiłem z tego słoik. Pierwszy przykład odczytuje argument z args i innych ze standardowego wejścia.
pliku Hello.java i 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());
}
}
pliku Hello2.java i 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());
}
}
Można zapisać je w pojedynczy słoik, ale musisz utworzyć i use a manifest (to trochę przesada).
Teraz w programie Excel dodaję moduł i odwołanie do obiektu Host skryptów systemu Windows. Jeśli nie podoba ci się sleep
, można zastąpić go 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
I przetestować go uratowałem pliki do c:\
napędu i wykorzystał kod:
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
W moim przypadku uzyskaj odpowiedź:
STDOUT: Hello Margus.
STDOUT: Cześć Margus.
Jeśli znalazłeś to przydatne, nie zapomnij upvote: D
Należy zauważyć, że zmienny ** program ** zawiera dodatkowe przydatne informacje, takie jak strumień błędów i kod powrotu. – Margus
@sreehari Wątpię, napisałem program, który odczytuje dane z komórek z już istniejącego pliku Excel i przetwarza go i umieszcza z powrotem w tym samym pliku. Nie jestem nowy w Javie, ale z pewnością jestem nowy w marce Excel. Czy muszę napisać makro? Nie mam pojęcia o tym, a samouczki nie dają żadnych informacji. Jak więc można to zrobić? –
Aby otworzyć środowisko VBA w Excelu, możesz użyć "alt + f11". Alternatywnym sposobem byłoby użycie przycisku wstążki programisty Visual Basic. Excel ma strony kodowe dla każdego arkusza, ale moduł jest podobny do przestrzeni wspólnej. Zauważ, że mogę użyć polecenia ** java -jar "C: \ H1.jar" Margus **, aby uruchomić program w CMD - jest bardzo mało kodu, który trzeba zapisać. – Margus
Twój VBA może zapisywać dane wyjściowe do pliku, a Java może okresowo odpytywać o modyfikacje plików i czytać z pliku. I zapisz dane z powrotem do VBA za pomocą innego pliku. VBA - integracja Java jest prawie niemożliwa, chyba że chcesz tylko wystrzelić program Java z powłoki przez System.execute (...).
Nieprawda. Integracja VBA-Java jest daleka od niemożliwości.Jakiś czas temu istniał nawet stary dobry Sun Java ActiveX Bridge, który niestety został przerwany przez Oracle (nadal dostępny dla Java 1.4: http://docs.oracle.com/javase/1.4.2/docs/guide/beans/ axbridge/developerguide /). Ale wciąż są dostępne technologie. Obba http://www.obba.info może być używany z VBA. Można również użyć xlloop. –
Użyłem go .. Uwaga, należy javaw inaczej czarne okna pojawiały się
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
Pytanie brzmiało, jak napisać program Java – user7294900
dziękuję za komentarz, ale pytanie brzmiało "Czy można uruchomić program Java za pomocą makr?" a to rozwiązanie robi to bez metody sleep i wskazywałem javaw zamiast java – mschwehl
sprawdzić ten - [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
Wszystkie te dyskusje mówią, że nie jest to możliwe. –
Co powiesz na to? http://stackoverflow.com/questions/10879757/vba-shell-java-call-errors – JimmyPena