Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call macro from Java using Jacob 1.18

I have a macro defined in an Excel file and I want invoke it from a Java program using Jacob 1.18 jar and dll.

The following is the code segment I am currently using.

import java.io.File;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;


public class TestJacob {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        File file = new File("C:\\TestJacob\\TestExcel_copy.xlsm");
        String macroName = "TestMacro";
        callExcelMacro(file, macroName);

    }

    private static void callExcelMacro(File file, String macroName) {
        ComThread.InitSTA(true);
        final ActiveXComponent excel = new ActiveXComponent("Excel.Application");
        try{
            excel.setProperty("EnableEvents", new Variant(false));

            Dispatch workbooks = excel.getProperty("Workbooks")
                    .toDispatch();

            Dispatch workBook = Dispatch.call(workbooks, "Open",
                    file.getAbsolutePath()).toDispatch();

            // Calls the macro
            Variant V1 = new Variant( file.getName() + macroName);
            Variant result = Dispatch.call(excel, "Run", V1);

            // Saves and closes
            Dispatch.call(workBook, "Save");

            com.jacob.com.Variant f = new com.jacob.com.Variant(true);
            Dispatch.call(workBook, "Close", f);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            excel.invoke("Quit", new Variant[0]);
            ComThread.Release();
        }
    }
}

The following is the exception I am getting while calling the macro .

com.jacob.com.ComFailException: Invoke of: Run
Source: Microsoft Excel
Description: Cannot run the macro 'TestExcel_copy.xlsmTestMacro'. The macro may not be available in this workbook or all macros may be disabled.

    at com.jacob.com.Dispatch.invokev(Native Method)
    at com.jacob.com.Dispatch.invokev(Dispatch.java:625)
    at com.jacob.com.Dispatch.callN(Dispatch.java:453)
    at com.jacob.com.Dispatch.call(Dispatch.java:541)
    at TestJacob.callExcelMacro(TestJacob.java:38)
    at TestJacob.main(TestJacob.java:16)

I have also enabled the macros in Excel file by following steps .

  1. File->Options
  2. Trust Center-> Trust Center Settings
  3. Macro Settings
  4. Enabled "Enable all macros" and "trust access to the VBA project object model
  5. press "OK"
like image 503
Priyambada Madala Avatar asked Sep 20 '26 17:09

Priyambada Madala


1 Answers

u need to change your macro call to

Variant result = Dispatch.call(excel, "Run", new Variant("\'"+file.getName()+"\'"+ macroName));

because inside excel the name of the file is between quote, so it doesn't find your macro name without "\'"

like image 78
Alann Avatar answered Sep 23 '26 06:09

Alann



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!