与此类似question(但在我的情况下不是 VSTO SE),但是,我只是想确认不可能在 Visual Studio 2005 和 Excel 2003 中使用纯 VSTO 创建 UDF - 所以,为了绝对清楚,我的问题是:
是否可以使用 Visual Studio 2005 和 VSTO 解决方案创建 Excel 2003 UDF,而不使用任何 VBA 或其他技巧?
我知道 ManagedXLL、ExcelDNA、Excel4Net 等,但暂时不想考虑这些。
Thanks
关于是否有办法绕过 COM 或 VBA,我认为这是不可能的(至少没有任何非常肮脏的技巧)。原因是 Office 执行外部代码(即您的加载项)的唯一方法是通过 COM。甚至 VSTO 仍在使用旧的 IDExtensibility2 COM 接口。 IDTEXtensibility2 是 Microsoft Office 应用程序的所有加载项都必须实现的 COM 接口。
在 VSTO 之前,Office 加载项必须自己实现此 IDTExtensibility2 接口。在此类基于 COM 的加载项(或 COM 可见的托管加载项)中,您只需按所述添加 UDFhere.
然而,现在使用 VSTO,有一个额外的抽象层:VSTO 使用所谓的解决方案加载器实现 IDTEXtensibility2,它是 VSTO 运行时提供的 dll。这意味着您的加载项不再是 COM 可见的。因此,如果您将 UDF 添加到 VSTO 外接程序,Office 将看不到它。
Paul Stubbs 在他的博客中解释了如何使用 VSTO 和 VBA:如何在 VSTO 托管代码中创建 Excel UDF
-
在 VSTO 中使用您的函数创建一个类
<System.Runtime.InteropServices.ComVisible(True)>
Public Class MyManagedFunctions
Public Function GetNumber() As Integer
Return 42
End Function
End Class
-
将您的类连接到 VSTO 中的 VBA
Private Sub ThisWorkbook_Open() Handles Me.Open
Me.Application.Run("RegisterCallback", New MyManagedFunctions)
End Sub
-
为托管代码创建 Hook 并为 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
现在您可以输入=GetNumberFromVSTO()
在单元格中,当 excel 启动单元格时
值应为 42。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)