关于VBA中调用VSTO托管代码的问题
最近做的项目需要在excel vba中调用.Net的托管代码,在MSDN的英文论坛上看到了一篇文章,便试着实现了一下 结果发现问题多多
首先在VS中新建一个excel-addin项目
在ThisAddIn_Startup事件中加入如下代码:
this.Application.Run("RegisterCallback", new MyManagedFunctions(), missing, missing, missing, missing, missing
, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing, missing);
此函数的目的是在excel打开的时候 运行RegisterCallback这个宏,RegisterCallback这个宏带有一个object参数
然后我们是实现MyManagedFunctions类如下:
[System.Runtime.InteropServices.ComVisible(true)]
public class MyManagedFunctions
{
public MyManagedFunctions() { }
public int GetNumber()
{
return 42;
}
}
勾选项目属性为对cominterop可见。
在VBA中新建一个模块 加入 VBA代码:
Dim managedObject As Object
Public Sub RegisterCallback(callback As Object)
Set managedObject = callback
End Sub
Public Function GetNumberFromVSTO() As Integer
GetNumberFromVSTO = managedObject.GetNumber()
End Function
保存后退出,运行VS项目后在excel中输入=GetNumberFromVSTO() 发现输出了非法值,为了这个问题,我在网上找了一天,并且试了很久的时间
最后,试着给MyManagedFunctions类显试的声明一个默认的构造函数,问题解决。
问题很诡异,不知道为什么必须要显示的给出构造函数,这可能于VBA有关,具体没时间细究,我已经在MSDN上问了这个问题,希望能给遇到同样
问题的朋友一个解决思路