使用VSTO创建UDF而不使用VBA

与此问题类似(但在我的情况下不是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

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

     Public Class MyManagedFunctions Public Function GetNumber() As Integer Return 42 End Function End Class 
  2. 在VSTO中将您的课程连接到VBA

     Private Sub ThisWorkbook_Open() Handles Me.Open Me.Application.Run("RegisterCallback", New MyManagedFunctions) End Sub 
  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 

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

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

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

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

有没有理由认为有必要在VSTO中使用UDF?

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

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

我不熟悉使用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