【问题标题】:Jacob : calling vb function in Excel file without invoking "Open" statementJacob:在 Excel 文件中调用 vb 函数而不调用“打开”语句
【发布时间】:2013-03-25 10:10:04
【问题描述】:

我正在使用 Jacob 调用驻留在 Excel 文件中的宏中的 VB 函数。

这是我的代码:[我将文件和 vb 函数名称作为参数传递给下面的 java 方法]

private static void callExcelMacro(File file, String macroName) {
    ComThread.InitSTA();

    final ActiveXComponent excel = new ActiveXComponent("Excel.Application");

    try {
        // This will open the excel if the property is set to true
        excel.setProperty("Visible", new Variant(false));


        final Dispatch workbooks = excel.getProperty("Workbooks").getDispatch();
        //String    eventSink = null ;
        int id = Dispatch.get(workbooks, "Count").getInt();
        System.out.println("le nbre" + id);
        Dispatch.call(workbooks, "Add");
        Dispatch workBook = Dispatch.call(workbooks, "Open", file.getAbsolutePath()).toDispatch();
        //new DispatchEvents(sourceOfEvent, eventSink, progId)

        //new DispatchEvents(workBook, w , "Excel.Application");
        //System.out.println("le résultat"+eventSink);      

        //d.safeRelease();
        Variant V1 = new Variant( file.getName() + macroName);
        // Calls the macro
        final 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();
    }
}

代码运行良好,但我的问题是我不想调用指令

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

它向我展示了默认宏执行的内容(带有输入字段的界面)。

有没有办法在不“打开”Excel文件的情况下“运行”VB函数?

谢谢。

【问题讨论】:

  • 当包含编译器(?)的应用程序没有启动时,VB代码将如何“运行”?
  • 我的 Java 代码将动态调用 VB 函数(通过按钮)。所以正常的执行是:加载excel文件,运行宏并释放对象。希望我回答了你的问题。
  • 打开 excel 并启用代码后,您还可以启用嵌入或由 Workbook_Open 触发的任何代码,我担心如果没有另一个 (Workbook_Open),您将无法拥有一个(您想要的脚本)跨度>
  • 这是必须在打开工作簿之前设置的 Application EnableEvents 属性,以防止执行任何 Auto_open 或 WOrkbook OPen 事件,请参阅下面的答案...

标签: java excel jacob vba


【解决方案1】:

没有办法在不打开文件的情况下在 Excel 工作簿中执行 VBA 函数...

当然,您可以通过禁用 Excel 应用程序对象上的事件来阻止 AUto_open 宏运行。

在 Excel VBA 中,我们这样做:

Application.enableevents=false

(经常与 ScreenUpdating 和 DisplayAlerts 等其他设置结合使用)

在 Java 中你可能会使用:

excel.setProperty("EnableEvents", new Variant(false));

我希望指点你在正确的方向(大声笑,繁荣繁荣!)

菲利普

【讨论】:

  • 感谢正确答案。有没有办法用 Jacob 禁用消息框? excel.setProperty("DisplayAlerts", new Variant(false));好像不行。
  • 也许 excel.setProperty("DisplayAlerts", new Variant(FALSE));
  • 嗯,除非您收到错误消息,否则它可以正常工作 - 您收到的是实际错误消息吗?
  • 在我调用的 vb 函数中,我将 "Dim Msg Msg = MsgBox("Sessi", vbInformation, "Module1")" 以及可能的 excel.setProperty("DisplayAlerts ", 新变体(FALSE));当我运行对我的 vb 函数的调用时,正在显示消息“Sessi”。似乎警报和 MsgBox 之间存在差异。
  • 绝对有,Alerts是来自Application的消息,比如Workbook是ReadOnly什么的。消息框由开发人员控制以向用户显示带有消息的对话框
猜你喜欢
  • 2021-08-26
  • 2020-01-19
  • 2011-04-09
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多