2014-10-07 51 views
9

Bir Excel çalışma kitabını yüklemeye çalışırken garip davranışlar buluyorum.Koşullu derleme ile Otomasyon Hatası

.NET'te COM Interop ile yazılmış bir Excel-AddIn var. Özellikle kendi Ribbon-Tab'ımı oluşturmak, çalışma kitaplarını bir menüden yüklemek ve bazı proje yönetimini yapmak için kullanılır. Ben eklentisi her şey çalışıyor içinden Çalışma Kitabı (Excel 2003-Version) yüklediğinizde,

İlk: Ben iki şekilde kullanarak bir çalışma kitabını açmaya çalıştığınızda

, ben farklı sonuçlar elde ederler. Şerit'in Düğme Etkinliğinden, Excel çalışma kitabını yüklemek için application.workbooks.open(...) kullanan Eklenti'nin openWorkbook genel işlevi çağrılır.

Bu şekilde, çalışma kitabı hata olmadan açılır.

İkincisi, ben gibi kod kullanarak VBA içinden eklentisi-Fonksiyonu çağırmak çalıştığınızda:

Derleme Hatası

Otomasyon Hatası

:

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

bir hata mesajı almak

ve IDE, ilk olarak gibi bakıyor çalışma kitabı-modüllerinden birinde koşullu derleme, aşağıdaki gibidir:

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

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

end sub 

aynı etkiyle numara yerine boolean veri türü kullanmaya çalıştı.

Aklımın sonuna geliyorum.

+0

Sınıflarınızı ve yöntemlerinizi VBA'ya nasıl sundunuz? [bunun gibi bir şey var mı?] (http://davecra.com/2013/02/01/how-to-expose-methods-in-your-vsto-add-in/) –

+0

[vba4all] (http: // stackoverflow .com/kullanıcı/2140173/vba4all), evet - Tam olarak senin Bağlantısında açıklandığı gibi. (VB.NET \t içinde ve C# değil). – DrMarbuse

+1

, vba projenizdeki eklentinize referans mı verdiniz? – ZAT

cevap

1

Otomasyon modunda Excel does not load add-ins by default. Excel, eklentiler ile derlenmiş olan koşulları kullanarak eklentileri yükler. Otomasyon modunda Eklenti çalışmalarının yapılabilmesi için, Excel'in bu eklentiye bağlı olarak herhangi bir çalışma kitabını yüklemeden önce yüklemek için Excel'i zorlaması gerekir. Aşağıda bu yükleme sırasını JScript'te uygulayan gerçek projemden (bazı sürümlerle) kod örneği sağladım. Yorumlar adımları açıklar.

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