我有一个C#互操作方法,它打开一个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#互操作对象中读取Excel变量macroError
?
如果可能的话,我更喜欢问题1的解决方案。
发布于 2019-03-05 04:49:00
如果您运行的宏通常是Sub(返回空值),则更改为一个函数(happy-path返回字符串""),但在捕获错误后,您可以在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
}
https://stackoverflow.com/questions/54990637
复制相似问题