【发布时间】: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 UDFAFunction,主要可从 Excel 调用,我使用Application.Run从 VBA(个人方便)调用。你是说我可以在我的上下文中使用CallByName吗? -
是的,如果您有一个将函数公开为其成员的类。例如。 Excel 内置函数是
WorksheetFunction类的成员,可以使用CallByName调用(它们没有 byref 参数,但如果有,它会起作用)。我不熟悉 Excel DNA,但如果某个地方也有父类,它可以工作。
标签: c# vba reference excel-dna