使用 VSTO 创建 UDF,而不使用 VBA
与此类似 问题(但在我的情况下不是 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
关于是否有办法绕过 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
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
我不明白你为什么要这样做?
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?
在这篇文章中,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.
按照 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;
我不熟悉在 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>