Вызов макроса из Java с использованием Jacob 1.18

У меня есть макрос, определенный в файле Excel, и я хочу вызвать его из Java-программы, используя Jacob 1.18 jar и dll.

Ниже приведен сегмент кода, который я сейчас использую.

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();
        }
    }
}

Следующее исключение я получаю при вызове макроса.

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)

Я также включил макросы в файл Excel, выполнив следующие действия.

  1. Файл-> Параметры
  2. Центр управления безопасностью-> Настройки центра управления безопасностью
  3. Настройки макроса
  4. Включено "Включить все макросы" и "Доверительный доступ к объектной модели проекта VBA"
  5. нажмите "ОК"

3 ответа

Вам нужно изменить ваш макрос вызова на

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

потому что внутри excel имя файла находится в кавычках, поэтому он не находит имя вашего макроса без "\"

Если быть точным:

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

Не нужно добавлять file.getname() при вызове макроса. Достаточно только макронамена.

использование

Variant result = Dispatch.call(excel, "Run", new Variant(macroName));
Другие вопросы по тегам