与此问题类似(但在我的情况下不是VSTO SE),我只是想确认在Visual Studio 2005和Excel 2003中使用纯VSTO创建UDF是不可能的 - 所以,绝对清楚,我的问题是:
是否可以使用Visual Studio 2005和VSTO解决方案创建Excel 2003 UDF而无需使用任何VBA或其他技巧?
我知道ManagedXLL,ExcelDNA,Excel4Net等,但暂时不想考虑这些.
谢谢
关于COM或VBA是否有办法我不认为这是可能的(至少没有任何非常肮脏的技巧).原因是Office可以执行外部代码(即加载项)的唯一方法是通过COM.甚至VSTO仍然使用下面的旧IDTExtensibility2 COM接口.IDTExtensibility2是一个COM接口,Microsoft Office应用程序的所有加载项都必须实现.
在VSTO之前,Office加载项必须自己实现此IDTExtensibility2接口.在这样的基于COM加载项(或COM可见的管理加载项)所描述的,你可以简单地添加你的UDF 这里.
但是,现在使用VSTO,还有一个额外的抽象层:VSTO使用实现IDTExtensibility2 的所谓Solution Loader,这是VSTO运行时提供的dll.这意味着您的加载项不再是COM可见的.因此,如果您向VSTO加载项添加了UDF,则Office将无法看到它.
Paul Stubbs在他的博客中解释了如何处理VSTO和VBA: 如何在VSTO托管代码中创建Excel UDF
使用VSTO中的函数创建一个类
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.