首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Jacob 1.18从Java调用宏

使用Jacob 1.18从Java调用宏
EN

Stack Overflow用户
提问于 2016-01-13 12:32:07
回答 3查看 5K关注 0票数 3

我在Excel文件中定义了一个宏,我希望使用Jacob 1.18 jar和dll从Java程序中调用它。

下面是我目前使用的代码段。

代码语言:javascript
复制
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();
        }
    }
}

下面是调用宏时遇到的异常。

代码语言:javascript
复制
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. 按"OK“键
EN

回答 3

Stack Overflow用户

发布于 2016-04-22 15:27:08

您需要将宏调用更改为

代码语言:javascript
复制
Variant result = Dispatch.call(excel, "Run", new Variant("\'"+file.getName()+"\'"+ macroName));

因为在excel中,文件的名称位于引号之间,所以它找不到没有"\'“的宏名。

票数 3
EN

Stack Overflow用户

发布于 2017-12-23 21:27:56

准确地说:

代码语言:javascript
复制
Dispatch.call(excel, "Run", new Variant("\'"+file.getName()+"\'!" + macroName));
票数 1
EN

Stack Overflow用户

发布于 2017-02-14 09:00:44

不需要在调用宏时添加file.getname()。只有宏名就够了。

使用

代码语言:javascript
复制
Variant result = Dispatch.call(excel, "Run", new Variant(macroName));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34766840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档