【发布时间】:2012-09-03 14:51:14
【问题描述】:
我想编写一个自定义工作表函数,该函数使用我定义为参数的类。我已尝试执行以下操作:
我创建了一个名为 Wrapper 的类:
Private m_value As Integer
Public Property Get value() As Integer
value = m_value
End Property
Public Property Let value(value As Integer)
m_value = value
End Property
然后我写了两个函数:
Function make_wrapper(value As Integer) As wrapper
Set make_wrapper = New wrapper
make_wrapper.value = value
End Function
Function square(wrapper As wrapper) As Integer
square = wrapper.value * wrapper.value
End Function
如果我直接从 VBA 链接这些函数,一切都会按预期工作
Sub doit()
MsgBox (square(make_wrapper(7)))
End Sub
显示 49。
如果我尝试直接从 excel 调用该函数,它不起作用。如果我在单元格中键入“=square(make_wrapper(7))”,它会显示“#VALUE!”。我究竟做错了什么?这有可能吗?
【问题讨论】:
-
似乎
square从来没有被这两个公式调用过——也许Excel 在收到公式中的非标准值时会立即停止?您可以定义一个单独的函数,该函数本质上是返回square(make_wrapper(foo)) as integer的函数(即使在 Excel 工作表中也可以使用)。 -
是的,但这正是我不想想做的。我想用它来构造函数的非常复杂的参数,并通过使用不同的类作为参数来获得一些“类型安全”。
-
我希望 Excel 不喜欢 UDF 中第一个函数
make_wrapper返回的类型wrapper。尝试重写以输出已知类型,例如Variant -
刚刚注意到您还尝试在函数 square 中传递类型
wrapper。我几乎可以肯定这不能通过 UDF 完成。 -
make_wrapper调用类型的工作 - 如果您在代码中设置断点并在单元格中输入=make_wrapper(7)您可以看到代码运行正常,但单元格仅显示#VALUE!.对square的调用直接失败,代码中的断点永远不会到达。结论:看来@ooo 是正确的。