2014-10-07 5 views
9

При попытке загрузить книгу Excel я нахожу странное поведение.Ошибка автоматизации с условной компиляцией

У меня есть Excel-AddIn, написанный на .NET с COM Interop. В основном используется для создания моей собственной ленты-ленты, загрузки книг из меню и администрирования некоторых проектов.

При попытке открыть книгу, используя два пути, я получаю разные результаты:

во-первых, когда я загрузить Workbook (Excel 2003-версия) из внутри Аддин все работает отлично. Из Button-события ленты вызывается открытая функция openWorkbook надстройки, которая использует application.workbooks.open(...) для загрузки книги Excel.

Таким образом, рабочая книга открывается без ошибок.

Во-вторых, когда я пытаюсь вызвать Addin-Function внутри VBA, используя код, как:

Set addIn = Application.COMAddIns("WMExcelAddin1") 
Set automationObject = addIn.Object 
automationObject.openWorkbook (filename) 

Я получаю сообщение об ошибке:

Compile Error

Automation Error

и IDE останавливается при первом вхождении условная компиляция в одной из рабочих книг-модулей, похожий следующим образом:

#const ebind = 0 
[...] 
sub proc1() 

    #if ebind = 1 then   ' IDE Stops here 
      [...] 
    #else 
      [...] 
    #end if 

end sub 

Я пытался использовать булеву тип данных вместо чисел с тем же эффектом.

Я нахожусь в своем остроумие.

+0

Как вы показали свои классы и методы для VBA? [что-то вроде этого?] (http://davecra.com/2013/02/01/how-to-expose-methods-in-your-vsto-add-in/) –

+0

[vba4all] (http: // stackoverflow .com/users/2140173/vba4all), да - точно так, как описано в вашей ссылке. (в VB.NET \t, хотя и не в C#). – DrMarbuse

+1

У вас есть ссылка на ваш addin в проекте vba? – ZAT

ответ

1

В режиме автоматизации Excel does not load add-ins by default. Excel загружает надстройки, используя условия, над которыми были скомпилированы надстройки. Для того, чтобы надстройка работала в режиме автоматизации, необходимо принудительно загрузить Excel для загрузки любых книг в зависимости от этой надстройки. Ниже я приводю пример кода из моего реального проекта (с некоторыми изданиями), который реализует эту последовательность загрузки в JScript. Комментарии объясняют шаги.

function run_excel() { 
    dbg_log("run_excel"); 
    g_xla_addin = null; 
    g_xla = null; 
    try { 
    g_add_ins = get_excel_app().AddIns; 
    dbg_log("finding add_in.xlam"); 

    //Searching for the installed add-in like Application.COMAddIns("WMExcelAddin1") 
    g_xla_addin = find_addin(g_add_ins, "add_in.xlam"); 
    } catch(v_err) { 
     throw new error(
     "xla_loading" 
     , CR_xla_loading 
     , 'Unexpected error occurred while determining if add_in.xlam is installed.' 
     , v_err 
    ); 
    } 
    if (g_xla_addin == null) throw new error(
     "xla_loading" 
    , CR_xla_not_installed 
    , "MS Excel addin is not installed." 
    ); 
    try { 
    dbg_log("opening add_in.xlam"); 

    //In the example, the add-in has the name of its workbook 
    try { g_xla = g_excel.Workbooks(g_xla_addin.Name); } catch(e) {} 
    if (g_xla == null) { 
     g_excel.AutomationSecurity = 1; // 1 == msoAutomationSecurityLow 

     //Loading the add-in. The add-in also handles `OpenWorkbook` at this time. 
     g_xla = g_excel.Workbooks.Open(
     g_xla_addin.FullName //FileName 
     , 2  //UpdateLinks 
     , true //ReadOnly 
     , null //Format 
     , null //Password 
     , null //WriteResPassword 
     , true //IgnoreReadOnlyRecommended: not display the read-only recommended message 
     , 2  //Origin: xlWindows 
     , null //Delimiter 
     , null //Editable 
     , null //Notify 
     , null //Converter 
     , false //AddToMru: don't add this workbook to the list of recently used files 
     , true //Local: saves files against the language of Microsoft Excel. 
     , 0  //CorruptLoad: xlNormalLoad 
    ); 
     hide_excel(); //To speed up and not interfere with user actions 
    } 
    } catch(v_err) { 
    throw new error(
     "xla_loading" 
    , CR_xla_loading 
    , 'Unexpected error occurred while loading add_in.xlam:\n' 
    , v_err 
    ); 
    } 

    //Now the Add-In is loaded, so the VBA engine knows its API, and the workbook referencing to it are loaded fine. 
    try { 
    g_sig_cat_wbk = g_excel.Workbooks.Open(
     g_sig_cat_fn //FileName 
    , 2  //UpdateLinks 
    , true //ReadOnly 
    , null //Format 
    , null //Password 
    , null //WriteResPassword 
    , true //IgnoreReadOnlyRecommended: not display the read-only recommended message 
    , 2  //Origin: xlWindows 
    , null //Delimiter 
    , null //Editable 
    , null //Notify 
    , null //Converter 
    , false //AddToMru: don't add this workbook to the list of recently used files 
    , false //Local: saves files against the language of Microsoft Excel. 
    , 0  //CorruptLoad: xlNormalLoad 
    ); 

//Calling on the loaded workbook the target macro from the loaded add_in.xlam 
    vba_ret(g_excel.Run(g_xla_addin.Name+"!my_addin.prepare_sig_import", g_sig_cat_wbk.Name)); 
    } catch(v_err) { 
     throw new error(
     "sig_cat_loading" 
     , CR_sig_cat_loading 
     , 'Error occured while loading catalog of signals:\n' 
     , v_err 
    ); 
    } 
    finally { 
    g_sig_cat_wbk.Close(false); 
    g_sig_cat_wbk = null; 
    } 
    dbg_log("run_excel done"); 
} 
Смежные вопросы