与此question类似(但在我的情况下不是VSTO SE),我只是想确认在Visual Studio 2005和Excel 2003中使用纯VSTO创建UDF是不可能的 - 所以,绝对清楚,我的问题是:
是否可以使用Visual Studio 2005和VSTO解决方案创建Excel 2003 UDF而无需使用任何VBA或其他技巧?
我知道ManagedXLL,ExcelDNA,Excel4Net等,但暂时不想考虑这些。
由于
答案 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
使用VSTO中的函数创建一个类
<System.Runtime.InteropServices.ComVisible(True)> 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。
答案 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