2014-10-07 16 views
9

Trovo un comportamento strano quando si tenta di caricare una cartella di lavoro di Excel.Errore di automazione con la compilazione condizionale

Ho un Excel-AddIn, scritto in .NET con COM Interop. Viene principalmente utilizzato per creare la mia propria barra multifunzione, caricare le cartelle di lavoro da un menu e gestire alcuni progetti.

Quando provo ad aprire una cartella di lavoro utilizzando due modi, ottengo risultati diversi:

In primo luogo, quando si carica la cartella di lavoro (Excel 2003-Version) dall'interno del tutto Addin funziona bene. Dall'evento Button del nastro, viene chiamata una funzione pubblica openWorkbook del componente aggiuntivo che utilizza application.workbooks.open(...) per caricare la cartella di lavoro di Excel.

In questo modo, la cartella di lavoro si apre senza errori.

In secondo luogo, quando provo a chiamare l'Addin-Function dall'interno di VBA utilizzando il codice come:

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

ricevo un messaggio di errore:

Compile Error

Errore di automazione

e l'IDE si arresta al primo verificarsi di un compilazione condizionale in una delle cartelle di lavoro moduli, guardando come segue:

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

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

end sub 

Ho provato ad utilizzare tipo di dati booleano invece di numeri con lo stesso effetto.

Sono alla fine dei miei spiriti.

+0

come hai esposto le tue classi e metodi a VBA? [qualcosa di simile?] (http://davecra.com/2013/02/01/how-to-expose-methods-in-your-vsto-add-in/) –

+0

[vba4all] (http: // stackoverflow .com/users/2140173/vba4all), sì - esattamente come descritto nel tuo link. (in VB.NET \t anche se non in C#). – DrMarbuse

+1

hai impostato il riferimento al tuo componente aggiuntivo nel progetto vba? – ZAT

risposta

1

In modalità automazione Excel does not load add-ins by default. Excel carica i componenti aggiuntivi utilizzando le condizioni con cui sono stati compilati i componenti aggiuntivi. Affinché il componente aggiuntivo funzioni durante la modalità di automazione, è necessario forzare Excel a caricarlo prima di caricare qualsiasi cartella di lavoro a seconda del componente aggiuntivo. Di seguito fornisco l'esempio di codice del mio progetto reale (con alcune edizioni) che implementa questa sequenza di caricamento in JScript. I commenti spiegano i passaggi.

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"); 
} 
Problemi correlati