使用VSTO创建UDF而不使用VBA

时间:2009-02-12 09:42:45

标签: c# vsto excel-interop

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

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

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

由于

5 个答案:

答案 0 :(得分:8)

关于COM或VBA是否有办法我不认为这是可能的(至少没有任何非常肮脏的技巧)。原因是Office可以执行外部代码(即加载项)的唯一方法是通过COM。甚至VSTO仍然使用下面的旧IDTExtensibility2 COM接口。 IDTExtensibility2是一个COM接口,Microsoft Office应用程序的所有加载项都必须实现。

在VSTO之前,Office加载项必须自己实现此IDTExtensibility2接口。在这种基于COM的加载项(或COM可见的托管加载项)中,您只需按照here所述添加UDF即可。

然而,现在使用VSTO,还有一个额外的抽象层:VSTO使用实现IDTExtensibility2的所谓Solution Loader,它是VSTO运行时提供的dll。这意味着您的加载项不再是COM可见的。因此,如果您向VSTO加载项添加了UDF,则Office将无法看到它。

Paul Stubbs在博客中解释了如何处理VSTO和VBA:How to create Excel UDFs in VSTO managed code

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

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

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

    现在您可以输入=GetNumberFromVSTO()   在单元格中,当excel启动单元格时   值应为42。

答案 1 :(得分:2)

我不明白你为什么要这样做?

VSTO和通过COM interop(来自.NET)公开UDF是两个不同的任务。 为什么要在VSTO项目中托管UDF方法?

注册.net UDF程序集的方式意味着它必须位于VSTO项目的单独项目中。但是,如果您想在两个应用程序之间共享数据,那么您可以使用各种本机.net方法,或者只是从VSTO项目中的相应范围对象“调用”UDF函数。

您认为有必要在VSTO中使用UDF吗?

答案 2 :(得分:1)

this文章中,埃里克·卡特继续解释如何做你要问的事。在顶部,他甚至链接到上述博客文章的更新。

答案 3 :(得分:1)

按照Eric Carter的说明创建UDF并将其作为参数传递给UDF Excel范围。您可以使用给定的范围通过VSTO访问Excel的对象模型: Excel.Range rg = param1 as Excel.Range; Excel.Workbook wb = rg1.Worksheet.Application.ActiveWorkbook;

答案 4 :(得分:0)

我不熟悉使用VS2005和VSTO在Excel 2003中创建UDF的方法,而不需要至少一点VBA。以下是2个链接,可以进一步讨论这个问题:

http://geekswithblogs.net/Denis/archive/2007/01/03/102623.aspx

http://blogs.msdn.com/pstubbs/archive/2004/12/31/344964.aspx