使用 VSTO 创建 UDF,而不使用 VBA

发布于 2024-07-13 03:51:32 字数 390 浏览 9 评论 0原文

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

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

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

谢谢

Similar to this question (but in my case not VSTO SE), however, I just want to confirm that it is not possible to create a UDF using pure VSTO in Visual Studio 2005 and Excel 2003 - so, to absolutely clear, my question is:

Is it possible to create a Excel 2003 UDF using Visual Studio 2005 and a VSTO solution without using any VBA or other tricks?

I'm aware of ManagedXLL, ExcelDNA, Excel4Net etc but don't want to consider those for the moment.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

柠栀 2024-07-20 03:51:32

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

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

但是,现在使用 VSTO,有一个额外的抽象层:VSTO 使用所谓的 解决方案加载器实现 IDTExtensibility2,它是 VSTO 运行时提供的 dll。 这意味着您的加载项不再是 COM 可见的。 因此,如果您将 UDF 添加到 VSTO 外接程序,Office 将看不到它。

Paul Stubbs 在他的博客上解释了如何使用 VSTO 和 VBA:< strong>如何在 VSTO 托管代码中创建 Excel UDF

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

     
      公共类 MyManagedFunctions 
          公共函数 GetNumber() 作为整数 
              返回 42 
          结束功能  
      结束课程 
      
  2. 将您的类连接到 VSTO 中的 VBA

    私有子ThisWorkbook_Open()处理Me.Open 
          Me.Application.Run("RegisterCallback", New MyManagedFunctions) 
      结束子 
      
  3. 为托管代码创建 Hook 并为 VBA 中的函数创建包装器

    在电子表格或文档的 VBA 模块中

    将 ManagedObject 调暗为对象 
    
      公共子RegisterCallback(回调作为对象) 
          设置托管对象 = 回调 
      结束子 
    
      公共函数 GetNumberFromVSTO() 作为整数 
          GetNumberFromVSTO = ManagedObject.GetNumber() 
      结束功能 
      

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

Concerning whether there is a way around COM or VBA I don't think that it is possible (at least not without any very dirty tricks). The reason is that the only way Office can execute external code (i.e. you add-in) is via COM. Even VSTO is still using the old IDTExtensibility2 COM interface underneath. IDTExtensibility2 is a COM interface that all add-ins for Microsoft Office applications must implement.

Before VSTO, Office add-ins had to implement this IDTExtensibility2 interface themselves. In such a COM based add-in (or COM-visible managed add-in) you can simply add your UDF as described here.

However, now with VSTO, there is an additional layer of abstraction: VSTO uses a so-called Solution Loader implementing IDTExtensibility2, which is a dll provided by the VSTO runtime. This means that your add-in is no longer COM-visible. Hence, if you added a UDF to your VSTO add-in it won't be visible to Office.

Paul Stubbs explains on his blog how to do with VSTO and VBA: How to create Excel UDFs in VSTO managed code

  1. Create a class with your functions in VSTO

    <System.Runtime.InteropServices.ComVisible(True)>
    Public Class MyManagedFunctions
        Public Function GetNumber() As Integer
            Return 42
        End Function 
    End Class
    
  2. Wire up your class to VBA in VSTO

    Private Sub ThisWorkbook_Open() Handles Me.Open
        Me.Application.Run("RegisterCallback", New MyManagedFunctions)
    End Sub
    
  3. Create Hook for managed code and a wrapper for the functions in VBA

    In a VBA module in your spreadsheet or document

    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
    

Now you can enter =GetNumberFromVSTO()
in a cell, when excel starts the cell
value should be 42.

小傻瓜 2024-07-20 03:51:32

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

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

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

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

I don't understand why you want to do this?

VSTO and exposing UDFs via COM interop (from .NET) are two different tasks.
Why do you want to host a UDF method inside of a VSTO project?

The way you register the .net UDF assembly means it will have to be in a seperate project to the VSTO project. However if you wanted to share data between the two apps then you have a variety of native .net methods for this, or simply "call" the UDF function from the appropriate range object within your VSTO project.

Is there a reason that you feel it is necessary to have UDF in VSTO?

三月梨花 2024-07-20 03:51:32

这篇文章中,Eric Carter 继续解释了如何做你要求的事情。 在顶部,他甚至链接到上述博客文章的更新。

In this article Eric Carter goes on to explain how to do what you're asking. At the top he even links to an update of the aforementioned blog post.

无声情话 2024-07-20 03:51:32

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

Create the UDF as Eric Carter explained and pass as parameter to your UDF an Excel range. You're able to access Excel's object model through VSTO by using the given range:
Excel.Range rg = param1 as Excel.Range;
Excel.Workbook wb = rg1.Worksheet.Application.ActiveWorkbook;

伊面 2024-07-20 03:51:32

我不熟悉在 Excel 2003 中使用 VS2005 和 VSTO 创建 UDF 的方法,而无需至少一点 VBA。 这里有两个链接进一步讨论这个问题:

<链接>

链接>

I am not familiar with a method of creating a UDF in Excel 2003 using VS2005 and VSTO without having at least a bit of VBA. Here are 2 links that discuss this a bit further:

<Link>

<Link>

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文