2010-10-13 86 views
6

我在VBA下面的代码(驻留在Excel 2007工作簿):从.NET中的VBA函数访问返回值?

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乘法功能验证这一点),但返回的值不可用在我的C#代码; returned总是null

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

+0

我已经能够通过修改Multiply()将单元格的值设置为返回值并从C#中读取该单元格的值来解决此问题。丑,但它的作品。 – 2010-10-14 01:48:14

+0

任何想法,为什么它从一个模块工作,但不是从工作表? – anakic 2015-04-22 16:21:15

+0

没有,我很害怕。实际上我从2011年起就没有在微软的东西上做过任何重要的工作,所以这可能会得不到回答,除非其他人可以帮助... – 2015-04-22 22:43:38

回答

4

您是否尝试过你的函数移动到正规的模块在Excel中(不是板模块)?

+0

我创建了一个新模块,将函数移动到该模块,并将“Sheet1.Multiply”更改为“MyModule.Multiply”。工作完美,谢谢:-)只有一个问题:这是你通过经验获得的洞察力,还是实际记录在某处?有关MSDN等的信息对于通过调用VBA来说相当稀少。互操作。 – 2010-10-15 01:24:44

+0

@DuncanBayne'Sheet1'是'Worksheet'类的*对象*,*实例*。为了调用一个类的成员,你需要一个实例 - 并且'Sheet1'实例只存在于VBA运行时中,.net没有看到它。标准模块就是:通过公共成员公开可执行代码的程序模块;你不需要(你也不能)*实例化它来调用它的成员。这就是为什么它在'Module1'而不是'Sheet1'中工作的原因。 – 2016-05-13 13:51:43

-4

尝试修改您的乘函数要像下面的代码:

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

这甚至不是有效的VBA。请参阅:http://office.microsoft.com/en-in/excel-help/create-custom-functions-in-excel-2007-HA010218996.aspx – 2010-10-13 02:46:38

+1

无法在VBA中使用return关键字 - 您需要将返回值设置为函数名称,例如乘以= a * b,这是原始问题。 – Jazza 2010-10-20 16:21:42

+0

这是VB.Net,而不是VBA。 – Icemanind 2014-12-30 21:21:42

0

一个简单的例子:

测试spreadsheet.xlsm具有Module1含有:

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()")工作 - 但我得到了一个错误:Cannot run the macro .... The macro may not be available in this workbook or all macros may be disabled. - 去掉括号奏效了。