【问题标题】:Using Excel-DNA created functions on VBA without Application.run使用 Excel-DNA 在没有 Application.run 的 VBA 上创建函数
【发布时间】:2018-03-02 19:56:54
【问题描述】:

我正在使用 VB.NET 和 Excel-DNA Library 创建 Excel 插件。 在我的 Addin 项目上创建的函数在工作表上作为公式调用时可以完美运行。但我也希望它们在编写 VBA 代码时可用。

所以,假设我在 Excel-DNA 上创建了一个函数 SumCalculation,如下所示:

<ExcelFunction(Category:="Calculations", Description:="Sum values", Name:="")>
Public Function SumCalculation(<ExcelArgument("First Value to sum")> Value1 As Double,
                               <ExcelArgument("Second Value to sum")> Value2 As Double) As Double
    Return Value1 + Value2
End Function

在 Excel 上生成并加载 XLL 后,可以像这样在 VBA 上调用它:

Result = Application.Run("SumCalculation", 1, 1)

但是有什么方法可以直接调用如下吗?

Result = SumCalculation(1, 1)

【问题讨论】:

  • 当您搜索“在 VBA 上使用 Excel-DNA 创建的函数”时,您在网络上发现的技术有什么问题?

标签: excel vb.net vba excel-dna


【解决方案1】:

Excel-DNA 允许将 .xll 用作您可以从 VBA 引用和使用的 COM 服务器。这将不允许您直接调用该函数,但您可以创建一个可以在 VBA 例程中实例化的对象,并且您的计算可以是该对象上的方法。这使您可以:

  • 公开一个丰富的对象模型以在 VBA 中进行编程,
  • COM 对象共享插件其余部分的 AppDomain(内存空间),因此可以共享缓存等,并且
  • 以不需要管理员权限的方式实现注册。

这里是 COM 服务器功能的分步示例:https://github.com/Excel-DNA/Samples/tree/master/DnaComServer

也可以在此处找到更多详细信息(尽管不使用简单的 NuGet 包来构建加载项):

【讨论】:

    【解决方案2】:

    你可以使用“包装器”

    Function SumCalculation(val1 As Double, val2 As Double) as Variant
        SumCalculation = Application.Run("SumCalculation", 1, 1)
    End Function
    

    所以你可以在你的代码中输入

    Result = SumCalculation(1, 1)
    

    【讨论】:

    • 感谢您的回答,但这是我试图避免的那种事情,因为我会做很多 UDF,并且为所有这些 UDF 创建一个 Wrapper 是不切实际的。跨度>
    猜你喜欢
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-02-28
    • 2015-02-14
    • 2015-09-15
    相关资源
    最近更新 更多