简体   繁体   中英

Ignore Failing Macro when Opening Excel File with C# Interop

I have been asked to write a script to crawl through a load of folder locations and list out all the Excel spreadsheets that have connections to a set of SQL and other data sources that are due to be upgraded to a new server.

In order to do this, I need to open each file, then check the connections and return those that match the criterion set. All this happens fine until I hit any file where the end user has made a macro to run on open that refers to a non-existent file - As the C# script opens the file, the file presents the following message:

错误弹出窗口

If I manually click "End", the script moves on to the next file and all is ok, but I would much rather avoid any user input and record the fact that there was a problem with the macro... How would I go about doing that?

I have set the Excel property "Disable all macros without notification" to true on the computer that will be running the script, using the same username as will run it, which I thought would prevent this kind of thing happening. I also open Excel with DisplayAlerts=false , so that isn't the problem...

I don't need to run the macro at all and would rather not..!

for context, the code snippet that opens each file looks like this:

var app = new Application
{
    Visible = false,
    DisplayAlerts = false,
    ScreenUpdating = false
};
Workbook thisFile = null;
try
{
    //send a false password to stop Excel asking for one - when it is wrong, the error will be caught.
    thisFile = app.Workbooks.Open(file.FullName, ReadOnly: true, Password: "FakePassword");

    foreach (WorkbookConnection connection in thisFile.Connections)
    {

EDIT: It occurs to me that maybe I could do something with a timeout..? If there were some way to close the popup box from the script, that would do the job - I could just record that the timer expired in the output, which would be enough. So... alternatively is there a way to just close the box after it has popped up?

I have been able to disable startup macros when I open the workbook by holding down shift when opening the file.

I believe the interop way to handle this is to use the application AutomationSecurity property:

Excel.Application app = new Excel.Application();
app.Visible = true;
app.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable;

I tested this on a simple workbook that popped up a message box and put the current time in A1, and it seemed to work properly.

Excel.Workbook wb = app.Workbooks.Open("c:/cdh/foot.xlsm");

Default, the message box popped up and A1 had a value, and when I set it to disable neither happened.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM