Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jacob:在Excel文件中调用vb函数而不调用;开放式;陈述_Java_Excel_Jacob_Vba - Fatal编程技术网

Java Jacob:在Excel文件中调用vb函数而不调用;开放式;陈述

Java Jacob:在Excel文件中调用vb函数而不调用;开放式;陈述,java,excel,jacob,vba,Java,Excel,Jacob,Vba,我使用Jacob调用Excel文件中宏中的VB函数 下面是我的代码:[我将文件和vb函数名作为参数传递给下面的java方法] private static void callExcelMacro(File file, String macroName) { ComThread.InitSTA(); final ActiveXComponent excel = new ActiveXComponent("Excel.Application"); try {

我使用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函数


谢谢。

如果不打开文件,就无法在Excel工作簿中执行VBA函数

当然,可以通过禁用Excel应用程序对象上的事件来防止自动打开宏运行

在Excel VBA中,我们这样做:

Application.enableevents=false
(经常与屏幕更新和显示警报等其他设置结合使用)

在Java中,您可能会使用:

excel.setProperty("EnableEvents", new Variant(false));
我希望这能给你指明正确的方向(哈哈,砰,砰!)


Philip

当包含编译器(?)的应用程序未启动时,VB代码将如何“运行”?我的Java代码将动态调用VB函数(通过按钮)。因此,正常的执行是:加载excel文件,运行宏并释放对象。希望我能回答你的问题。一旦你打开excel并启用代码,你也会启用工作簿\u open中嵌入或触发的任何代码,我担心你不能有一个(你想要的脚本)而没有另一个(工作簿\u open)这是在打开工作簿之前必须设置的Application EnableEvents属性,以防止执行任何自动打开或工作簿打开事件,请参见下面的我的答案…谢谢您提供正确的答案。有没有办法禁用Jacob的消息框?setProperty(“DisplayAlerts”,新变量(false));似乎不起作用。可能是excel.setProperty(“DisplayAlerts”,新变量(FALSE));嗯,除非你得到一个错误,否则它是工作的-你得到了一个实际的错误消息吗?在我调用的vb函数中,我把“Dim Msg Msg=MsgBox(“session”,vbInformation,“Module1”)”和可能的excel.setProperty(“DisplayAlerts”,新变量(FALSE));当我运行对vb函数的调用时,将显示消息“Sessi”。警报和MsgBox之间似乎有区别。当然有区别,警报是来自应用程序的消息,例如工作簿为只读或其他内容。消息框由开发人员控制,以向用户显示带有消息的对话框