96544


現在、エクセルVBAからjava処理を呼び出したいと考えています。  
以下のようなコードを用意したのですが、うまく動きません。

調べるとjarに対して、マニフェストファイルへの記載が必要？とのことなのですが、  
ここでは、`jar -xvf Sample.jar`で解凍したマニフェストファイルに `Main-Class: Sample`
を記載して、もう一度圧縮すればいいのでしょうか？

圧縮コマンドは `jar -cvfm Sample.jar manifest.mf *.class` を自分のものに置き換えて実行する予定でいます。  
どなたかご存知でしょうか？

用意したJavaコード

[code]

    import java.io.*;
    import java.util.List;
    import java.util.ArrayList;
    import org.hibernate.engine.jdbc.internal.BasicFormatterImpl;
    
    public class SqlFormatter {
        public static void main(String[] args) throws IOException {
            if (args.length != 2) {
                System.out.println("Usage: java SqlFormatter <inputFolder> <outputFolder>");
                return;
            }
    
            String inputFolder = args[0];
            String outputFolder = args[1];
    
            File folder = new File(inputFolder);
            File[] files = folder.listFiles((dir, name) -> name.endsWith(".txt"));
    
            if (files != null) {
                for (File file : files) {
                    List<String> formattedSqlList = new ArrayList<>();
    
                    try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
                        String line;
                        while ((line = reader.readLine()) != null) {
                            // SQL文を抽出
                            String sql = extractSql(line);
    
                            if (sql != null && !sql.isEmpty()) {
                                // SQL文をフォーマット
                                String formattedSql = new BasicFormatterImpl().format(sql);
                                formattedSqlList.add(formattedSql);
                            }
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                    // 出力ファイル名を生成
                    String outputFileName = outputFolder + File.separator + file.getName();
    
                    // 新しいファイルを作成してフォーマットされたSQLを書き込む
                    try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFileName))) {
                        for (String formattedSql : formattedSqlList) {
                            writer.write(formattedSql);
                            writer.newLine();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        // SQL文を抽出するメソッド（正確な実装はコンテキストに依存します）
        private static String extractSql(String line) {
            // 実装を追加してSQLを抽出
            return line;
        }
    }
    
    
[/code]

VBA内の記述

[code]

    Sub RunJavaProgram()
        Dim javaPath As String
        Dim jarPath As String
        Dim inputFolder As String
        Dim outputFolder As String
        Dim javaCommand As String
    
        ' Javaの実行可能ファイルのパス（java.exe）を設定
        javaPath = "C:\Program Files\Java\jdk1.8.0_301\bin\java.exe"  ' あなたのJavaのパスに合わせて設定
    
        ' 実行するJavaプログラムのJARファイルのパスを設定
        jarPath = "C:\path\to\your\java\program.jar"  ' あなたのJARファイルのパスに合わせて設定
    
        ' 入力フォルダと出力フォルダのパスを設定
        inputFolder = "C:\path\to\input\folder"
        outputFolder = "C:\path\to\output\folder"
    
        ' Javaプログラムを実行するコマンドを組み立て
        javaCommand = """" & javaPath & """ -jar """ & jarPath & """ """ & inputFolder & """ """ & outputFolder & """"
    
        ' コマンドを実行
        Call Shell(javaCommand, vbNormalFocus)
    End Sub
    
[/code]


CC BY-SA 4.0
2023-10-19T23:52:13.633
96527
2023-10-21T12:58:42.303
2023-10-21T06:51:01.503
3060
59944
question
java vba excel jar
エクセルVBAからjavaを呼び出す方法


最も簡単な方法を紹介します。

ファイル名をTest.javaとして以下のコードを保存してください。

[code]

    public class Test {
        public static void main(String[] args) {
            System.out.println("Test");
        }
    }
    
[/code]

上記のJavaコードは、以下のコマンドで、コマンドラインから実行することができました。

[code]

    java Test.java
    (もしくは)
    "C:\Program Files\Java\jdk1.8.0_301\bin\java.exe" Test.java
    
[/code]

エクセルVBAのjavaCommand変数に、  
"C:\Program Files\Java\jdk1.8.0_301\bin\java.exe" Test.java  
を指定して、動作するか確認できないでしょうか。

複雑さが増し、上記の方法では、管理しきれなくなってきたら、  
コンパイルして.classファイルを利用してもよいですし、  
マニフェストファイルや.jarアーカイブファイルを利用していくことを、  
検討していけばよいかと思います。


CC BY-SA 4.0
2023-10-21T08:59:58.840
96544
2023-10-21T08:59:58.840
35267
96527
answer


> 調べるとjarに対して、マニフェストファイルへの記載が必要？とのことなのですが、  
>  ここでは、jar -xvf Sample.jarで解凍したマニフェストファイルに Main-Class: Sample
> を記載して、もう一度圧縮すればいいのでしょうか？

はい、そうです。マニュフェストファイルを作成/変更して、もう一度圧縮します。  
マニュフェストを作成する場合は、

[code]

    Main-Class: Sample
    
[/code]

ではなく、メイン関数のあるクラスをフルパス(パッケージ名を含めたクラス名)で指定します。  
例）Main-Class: com.example.app.MainAppなど

[code]

    Main-Class: SqlFormatter
    
[/code]


CC BY-SA 4.0
2023-10-21T09:34:31.470
96545
2023-10-21T12:58:42.303
2023-10-21T12:58:42.303
35267
35267
96527
answer