【问题标题】:Passing by ref a parameter to macro calling a excel DNA function with Application.Run通过 ref 将参数传递给使用 Application.Run 调用 excel DNA 函数的宏
【发布时间】:2017-10-15 09:37:01
【问题描述】:

我有一个通过 excel DNA 定义的 c# 函数:

[ExcelFunction(Description = "does stuff", IsVolatile = false, IsMacroType = true, IsThreadSafe = true)]
public object AFunction(long k \* other parameters *\)
{
    // do stuff
}

在 VBA 中调用如下:

Dim v As Variant
v = Application.Run("AFunction", k)

现在我修改我的 excel DNA c# 如下:

[ExcelFunction(Description = "Retrieves valo folio", IsVolatile = false, IsMacroType = true, IsThreadSafe = true)]
public object AFunction(ref double x, long k \* other parameters *\)
{
    // do stuff
    // update x
}

我将传递给它的 double 将被更新,我将在之后使用它。

我在 VBA 中这样称呼它:

Dim v As Variant
v = Application.Run("AFunction", x, k)

但是x ("dimed" as Double) 没有更新。我试过了

Dim x() as Double
Redim x(1)

还有一个

Dim v As Variant
v = Application.Run("AFunction", x(1), k)

但这里x(1) 也没有更新。

c#中的ref有问题,还是Application.Run引起的问题?

【问题讨论】:

  • Application.Run 在设计上不支持 byref 参数。它将传递的值包装成变体并向前传递。
  • 您可以将其放在答案中,以便我接受。无论如何谢谢。
  • 相反,CallByName 支持byref。有没有可以拨打CallByName 的课程?
  • 不,AFunction 是一个c# Excel DNA 函数,它产生一个 Excel UDF AFunction,主要可从 Excel 调用,我使用 Application.Run 从 VBA(个人方便)调用。你是说我可以在我的上下文中使用CallByName 吗?
  • 是的,如果您有一个将函数公开为其成员的类。例如。 Excel 内置函数是 WorksheetFunction 类的成员,可以使用 CallByName 调用(它们没有 byref 参数,但如果有,它会起作用)。我不熟悉 Excel DNA,但如果某个地方也有父类,它可以工作。

标签: c# vba reference excel-dna


【解决方案1】:

问题确实是Application.Run,正如怀疑的那样,因为它不能先验通过引用传递参数。但其实可以,看这里:

http://www.tushar-mehta.com/publish_train/xl_vba_cases/1022_ByRef_Argument_with_the_Application_Run_method.shtml

基本上将 UDF 包装在 VBA 类的方法中,该方法的实例使用 Application.Run 传递

繁琐但有效。

【讨论】:

    猜你喜欢
    • 2012-07-29
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多