4

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

是否可以在不使用任何 VBA 或其他技巧的情况下使用 Visual Studio 2005 和 VSTO 解决方案创建 Excel 2003 UDF?

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

谢谢

4

5 回答 5

8

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

在 VSTO 之前,Office 加载项必须自己实现这个 IDTExtensibility2 接口。在这种基于 COM 的加载项(或 COM 可见的托管加载项)中,您可以简单地添加您的 UDF,如此所述。

然而,现在有了 VSTO,多了一层抽象:VSTO 使用所谓的实现 IDTExtensibility2 的解决方案加载器,它是 VSTO 运行时提供的一个 dll。这意味着您的加载项不再是 COM 可见的。因此,如果您将 UDF 添加到 VSTO 加载项,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
    
  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。

于 2009-02-18T20:03:35.433 回答
2

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

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

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

您是否有理由认为 VSTO 中有必要使用 UDF?

于 2009-07-31T03:52:42.183 回答
1

本文中,Eric Carter 继续解释如何按照您的要求进行操作。在顶部,他甚至链接到上述博客文章的更新。

于 2009-02-18T13:57:49.900 回答
1

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

于 2010-10-23T22:40:08.033 回答
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

于 2009-02-17T18:41:40.977 回答