excel - Error de automatización con compilación condicional
vba excel-vba (1)
En el modo de automatización, Excel no carga los complementos de forma predeterminada . Excel carga complementos utilizando las condiciones en las que se compilaron complementos. Para que Add-In funcione durante el modo de automatización, uno debe obligar a Excel a cargarlo antes de cargar cualquier libro de trabajo dependiendo de ese complemento. A continuación, proporciono el ejemplo de código de mi proyecto real (con algunas ediciones) que implementa esta secuencia de carga en JScript. Los comentarios explican los pasos.
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");
}
Encuentro un comportamiento extraño cuando intento cargar un libro de Excel.
Tengo un Excel-AddIn, escrito en .NET con COM Interop. Se usa principalmente para crear mi propia Ribbon-Tab, cargar libros de trabajo desde un menú y hacer algo de administración de proyectos.
Cuando intento abrir un libro de trabajo de dos maneras, obtengo resultados diferentes:
Primero, cuando cargo el libro (Excel 2003-Version) desde el Addin todo funciona bien. Desde el evento de botón de la cinta, se llama a una función pública openWorkbook
del complemento que utiliza application.workbooks.open(...)
para cargar el libro de Excel.
De esta manera, el libro de trabajo se abre sin un error.
En segundo lugar, cuando trato de llamar a la función Addin dentro de VBA usando un código como:
Set addIn = Application.COMAddIns("WMExcelAddin1")
Set automationObject = addIn.Object
automationObject.openWorkbook (filename)
Aparece un mensaje de error:
Error de compilación
Error de automatización
y el IDE se detiene en la primera aparición de una compilación condicional en uno de los módulos de libro de trabajo, con el siguiente aspecto:
#const ebind = 0
[...]
sub proc1()
#if ebind = 1 then '' IDE Stops here
[...]
#else
[...]
#end if
end sub
Traté de usar el tipo de datos booleano en lugar de números con el mismo efecto.
Estoy al final de mi ingenio.