2013-03-25 1 views
2

Я использую Jacob для вызова функции VB, которая находится в макросе в файле Excel.Jacob: вызов функции vb в файле Excel без вызова «Open»

Вот мой код: [я передаю файл и имя функции 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, когда приложение, содержащее компилятор (?), Не запущено? –

+0

Мой Java-код будет запускать функцию VB на лету (с помощью кнопок). Таким образом, обычное выполнение: загрузить файл excel, запустить макрос и освободить объект. Надеюсь, я ответил на ваш вопрос. – javadev

+0

После того как вы откроете код excel и enable, вы также включите любой код, который встроен или запущен Workbook_Open, я боюсь, что у вас его не будет (сценарий, который вы хотите), без другого (Workbook_Open) –

ответ

2

нет никакого способа для выполнения функции VBA в книге Excel без открытия файла ...

Конечно, вы можете предотвратить запуск макроса Auto_Open отключив события на объекте Excel Application.

В Excel VBA мы делаем это так:

Application.enableevents=false 

(часто в сочетании с другими параметрами, такими как ScreenUpdating и DisplayAlerts)

в Java может быть, вы используете:

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

Надеюсь, что указатели вы в правильном направлении (lol, boom boom!)

Philip

+0

Спасибо за правильный ответ. Есть ли способ отключить ящики сообщений с Якобом? excel.setProperty ("DisplayAlerts", новый вариант (false)); похоже не работает. – javadev

+0

возможно * excel.setProperty («DisplayAlerts», новый вариант (FALSE)); * –

+0

Juste отредактировал мой комментарий, «ложный», что я имел в виду. – javadev