【问题标题】:Access return value from VBA Function in .NET?从 .NET 中的 VBA 函数访问返回值?
【发布时间】:2011-04-24 15:15:57
【问题描述】:

我在 VBA 中有以下代码(位于 Excel 2007 工作簿中):

Public Function Multiply(a As Double, b As Double) As Double
    Multiply = a * b
End Function

如果我从其他 VBA 代码调用乘法,它会返回正确的值。但是,当我从 C# 调用乘法时:

var excel = new Application {Visible = true};
excel.Workbooks.Open(filename);
var returned = excel.Run("Sheet1.Multiply", (Double) a, (Double) b);

... 发生了乘法(我可以通过在 VBA 中向 Multiply 函数添加跟踪来验证这一点),但返回的值在我的 C# 代码中不可用; returned 始终是 null

有人可以告诉我如何从我的 C# 代码中获取乘法的返回值吗?

【问题讨论】:

  • 我已经能够通过修改 Multiply() 将单元格的值设置为返回值,并从 C# 读取该单元格的值来解决此问题。丑陋但有效。
  • 知道为什么它可以在模块中工作而不是在工作表中吗?
  • 恐怕没有。实际上,自 2011 年以来,我还没有在 Microsoft 方面做过任何重要的工作,所以除非其他人可以提供帮助,否则这可能不会得到解答......

标签: c# .net excel vba office-interop


【解决方案1】:

您是否尝试过将函数移至 Excel 中的常规模块(不是工作表模块)?

【讨论】:

  • 我创建了一个新模块,将函数移至该模块,并将“Sheet1.Multiply”更改为“MyModule.Multiply”。工作得很好,谢谢 :-) 只有一个问题:这是您通过经验获得的洞察力,还是实际上记录在某个地方? MSDN 等上的信息对于通过调用 VBA 来说非常稀少。互操作。
  • @DuncanBayne Sheet1 是一个对象,是Worksheet 类的一个实例。为了调用一个类的成员,你需要一个实例——Sheet1 实例只存在于 VBA 运行时中,.net 看不到它。标准模块就是这样:通过公共成员公开可执行代码的过程模块;你不需要(无论如何你不能)实例化它来调用它的成员。这就是为什么它可以在 Module1 而不是 Sheet1 中工作的原因。
【解决方案2】:

一个简单的例子:

测试 spreadsheet.xlsmModule1 包含:

Public Function test() As String
  test = "hello 1234"
End Function

objExcel 已设置为电子表格...

Dim result = objExcel.Run("Module1.test")
MsgBox(result)

... 在弹出消息中生成hello 1234

因为我最初在 VBA 即时窗口中使用 ? module1.test() (成功) 对此进行了测试,所以我最初试图让 objExcel.Run("Module1.test()") 工作 - 但我收到一个错误:@987654328 @ - 删除括号就可以了。

【讨论】:

    【解决方案3】:

    尝试将 Multiply 函数修改为如下代码:

    Public Function Multiply(a As Double, b As Double) As Double
        return a * b
    End Function
    

    【讨论】:

    • 那甚至不是有效的 VBA。见:office.microsoft.com/en-in/excel-help/…
    • 您不能在 VBA 中使用 return 关键字 - 您需要将返回值设置为函数名称,例如乘法 = a * b,在原始问题中。
    • 这是 VB.Net,不是 VBA。
    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多