使用VSTO创建UDF而不使用VBA

ng5*_*000 4 c# vsto excel-interop

与此问题类似(但在我的情况下不是VSTO SE),我只是想确认在Visual Studio 2005和Excel 2003中使用纯VSTO创建UDF是不可能的 - 所以,绝对清楚,我的问题是:

是否可以使用Visual Studio 2005和VSTO解决方案创建Excel 2003 UDF而无需使用任何VBA或其他技巧?

我知道ManagedXLL,ExcelDNA,Excel4Net等,但暂时不想考虑这些.

谢谢

Dir*_*mar 8

关于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

  1. 使用VSTO中的函数创建一个类

    <System.Runtime.InteropServices.ComVisible(True)>
    Public Class MyManagedFunctions
        Public Function GetNumber() As Integer
            Return 42
        End Function 
    End Class
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在VSTO中将您的课程连接到VBA

    Private Sub ThisWorkbook_Open() Handles Me.Open
        Me.Application.Run("RegisterCallback", New MyManagedFunctions)
    End Sub
    
    Run Code Online (Sandbox Code Playgroud)
  3. 为托管代码创建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
    
    Run Code Online (Sandbox Code Playgroud)

现在你可以输入=GetNumberFromVSTO() 一个单元格,当excel启动时,单元格值应为42.