禁用 Excel Debug/End 弹出窗口或从 c# 项目读取 excel 变量

Disable Excel Debug/End popup or Read excel variable from c# project

我有一个 C# Interop 方法可以打开一个 excel 文件,运行一个宏,保存并关闭它。

    private void DoExcelMacro(string fileName, string macroName)
    {
        Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
        Microsoft.Office.Interop.Excel.Workbook workbook;
        workbook = excel.Workbooks.Open(fileName);
        excel.DisplayAlerts = false;

        excel.Run(macroName);
        Worksheet ws = workbook.ActiveSheet;

        workbook.SaveAs(fileName);
        excel.DisplayAlerts = true;

        ws = null;
        workbook.Close();
        workbook = null;
        excel = null;

        GC.Collect();
    }

它工作得很好,除非宏中出现错误,例如:

    Public Sub MacroEntry()
    Dim test AS Integer
        test = "A"
    End Sub

关闭 DisplayAlerts 不起作用。如果我在弹出窗口中单击 "End",我会在我的 C# 应用程序中收到错误。

问题 1:有没有办法抑制错误弹出窗口,但让错误落入 C# 应用程序?

我可以修改 Excel 宏来捕获错误

    Public macroError As ErrObject

    Public Sub MacroEntry()
    On Error GoTo ErrorHandler
    Dim test As Integer
        test = "A"

    ErrorHandler:
        Set macroError = Err
        Exit Sub
    End Sub

问题 2:我如何从 C# Interop 对象中读取 Excel 变量 macroError

如果可能的话,我更喜欢问题 1 的解决方案。

如果你是 运行 一个通常是 Sub(void returning) 的宏,然后更改为 Function(happy-path returns a string of ""),但会捕获错误,您可以在 C# 中检查非空字符串。

Public Function MacroEntry() As String
On Error GoTo ErrorHandler
    Dim test As Integer
    test = "A"

    Exit Function
ErrorHandler:
    MacroEntry= Err.Description
    Exit Function
End Function

C#:

string macroErrorReturn = excel.Run(macroName).ToString();
if (macroErrorReturn != "") {
    //error occurred in macro   
}