当前位置:  开发笔记 > 编程语言 > 正文

使用VSTO创建UDF而不使用VBA

如何解决《使用VSTO创建UDF而不使用VBA》经验,为你挑选了1个好方法。

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

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

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

谢谢



1> Dirk Vollmar..:

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

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有