2013-03-25 31 views
2

我正在使用雅可比來調用駐留在Excel文件的宏中的VB函數。雅各布:在不調用「打開」語句的情況下在Excel文件中調用vb函數

這裏是我的代碼:我的文件和VB的函數名作爲PARAMATERS傳遞給下面的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(); 

它向我顯示默認宏執行的操作(帶有輸入字段的接口)。

有沒有辦法「運行」的VB功能沒有「打開」Excel文件?

謝謝。

+1

當包含編譯器(?)的應用程序未啓動時,VB代碼將如何「運行」? – 2013-03-25 11:57:06

+0

我的Java代碼將通過按鈕即時調用VB函數。所以正常的執行是:加載excel文件,運行宏並釋放對象。希望我回答你的問題。 – javadev 2013-03-25 12:43:48

+0

一旦你打開了excel並啓用了代碼,你還啓用了嵌入Workbook_Open或由其觸發的任何代碼,但是我擔心你不能使用其中一個(你想要的腳本)(Workbook_Open) – 2013-03-25 12:52:38

回答

2

沒有辦法在Excel工作簿執行VBA功能,無需打開文件...

當然,你也可以通過禁用Excel應用程序對象上的事件阻止Auto_Open宏的運行。

在Excel VBA我們這樣做,像這樣:

Application.enableevents=false 

(經常與像ScreenUpdating其他設置和DisplayAlerts一起)在Java中

也許你使用:

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

我希望指針你在正確的方向(笑,熱潮!)

Philip

+0

感謝您的正確答案。有沒有辦法用雅各禁用消息框? excel.setProperty(「DisplayAlerts」,new Variant(false));似乎不起作用。 – javadev 2013-03-25 15:30:22

+0

maybe * excel.setProperty(「DisplayAlerts」,new Variant(FALSE)); * – 2013-03-25 15:31:56

+0

Juste編輯我的評論,我的意思是「假」。 – javadev 2013-03-25 15:33:09

相關問題