C# VB.NET通过Excel以ByRef的形式传递参数。应用程序运行不';使用Excel.Application时不更新变量,但在使用Object时有效

C# VB.NET通过Excel以ByRef的形式传递参数。应用程序运行不';使用Excel.Application时不更新变量,但在使用Object时有效,c#,excel,vb.net,C#,Excel,Vb.net,我在VB.NET中有一个运行Excel应用程序的类。该类具有返回Excel工作簿/应用程序实例的属性Excel.Application Private m_ExcelProgramHandle As Microsoft.Office.Interop.Excel.Application ' Sets the Excel.App Instance m_ExcelProgramHandle = somefunc() Public ReadOnly Property ExcelProgramHand

我在VB.NET中有一个运行Excel应用程序的类。该类具有返回Excel工作簿/应用程序实例的属性Excel.Application

Private m_ExcelProgramHandle As Microsoft.Office.Interop.Excel.Application

' Sets the Excel.App Instance
m_ExcelProgramHandle = somefunc()

Public ReadOnly Property ExcelProgramHandle() as Microsoft.Office.Interop.Excel.Application

     Get
          ExcelProgramHandle = m_ExcelProgramHandle
     End Get

End Property
现在,我想从VB.NET应用程序调用Excel应用程序中的宏来传递和更新一些变量

以下是VBA宏:

Public Function pass_string_byref(byref str as String) as Integer
     str = "abcde"
     pass_string_byref = 1
End Function

Public Function pass_arr_byref(byref arr() as String) as Integer
     ReDim arr(3)

     arr(1) = "a"
     arr(2) = "b"
     arr(3) = "c"

     pass_arr_byref = 1
End Function
下面是VB.NET调用宏的方式:

strArr = New String() {""}

retShort = sampleObj.ExcelProgramHandle.Run("pass_string_byref", str)

retShort = ssampleObj.ExcelProgramHandle.Run("pass_arr_byref", strArr)
但变量不会得到更新。但是,如果我将属性的数据类型从Excel.Application更改为Object,则它可以工作。

Private m_ExcelProgramHandleAsObj As Object

' Somewhere in the Constructor
' This is how its being set
m_ExcelProgramHandleAsObj = m_ExcelProgramHandle

Public ReadOnly Property ExcelProgramHandle() as Object

     Get
          ExcelProgramHandle = m_ExcelProgramHandleAsObj
     End Get

End Property
有人能解释一下为什么会这样吗

我是否可以使用Microsoft.Interop.Excel.Application而不是Object?该类的其他成员正在使用ExcelProgramHandle属性,因此将其更改为Object可能会破坏该类。因此,我认为最好使用Excel.Application


谢谢

请提供一份报告。无法传递byref参数,并使用当前提供的值通过Val传递它们。这以前是有文档记录的,但显然在现代的简化帮助中不再有了。@GSerg感谢您提供的信息。我试图将基于VB6构建的类迁移到.NET。显然,这种使用VB6应用程序中的ByRef传递变量的方法似乎有效。我假设.NET中的行为将是相同的。但奇怪的是,如果我使用Object而不是Excel.App,它为什么会起作用,正如我在解决方法中提到的那样。我希望你能分享一些想法。谢谢谢谢你!实际上,将
应用程序
强制转换为对象确实允许通过
应用程序传递参数byref。在Excel内部运行
。我不知道它为什么会发生,但它真的不应该发生。我只能推测这是同一种情况,但我想知道为什么它也会在.NET中发生。