如何向COM对象传递参数数组?(Excel Interop场景)
问题:将ParamArray参数传递给Excel Interop的Application.Run方法
已有一些关于传递参数数组的类似方案,但仅在托管代码中有效。使用Microsoft.Office.Interop.Excel时,可通过Application.Run方法执行Excel文件中的宏。该方法签名显示它接受宏名称及任意数量的参数(传递给VBA过程),外观和行为类似参数数组,但实际并非如此。
直接将参数数组传入.Run方法的参数部分时,会抛出以下错误:
System.Runtime.InteropServices.COMException: 'Parameter not optional.
(Exception from HRESULT: 0x8002000F (DISP_E_PARAMNOTOPTIONAL))'
这说明参数数组未被正确传递,根源在于COM互操作中不存在ParamArray类型。
问题:如何将任意长度的ParamArray展开为可传递给COM对象的任意参数列表?
示例代码:
''' <summary> ''' 在后台静默运行Excel宏,运行结束后退出。 ''' </summary> ''' <param name="excelFileName">Excel文件的完整路径。</param> ''' <param name="macroName">要运行的宏名称。</param> ''' <param name="args">要传入宏过程的参数。</param> Public Shared Sub RunMacro(excelFileName As String, macroName As String, ParamArray args As String()) ' 创建新的Excel实例 Dim excelApp = New Application With { .Visible = True, .EnableEvents = False ' 抑制Workbook_Open事件 } Dim excelBooks As Workbooks = excelApp.Workbooks ' 打开Excel工作簿 Dim thisWorkbook As Workbook = excelBooks.Open(excelFileName) ' 宏运行时隐藏窗口 excelApp.Visible = False ' 运行VBA过程。 excelApp.Run(macroName, args) ' <-- 因无法接受ParamArray而抛出异常 ' 清理资源 thisWorkbook.Close(SaveChanges:=False) excelApp.Quit() End Sub
内容的提问来源于stack exchange,提问作者HackSlash
相关产品推荐
相关产品推荐

