使用类作为自定义工作表函数的参数
Posted
技术标签:
【中文标题】使用类作为自定义工作表函数的参数【英文标题】:Using a class as argument of a custom worksheet function 【发布时间】: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 是正确的。
【参考方案1】:
似乎没有人给你一个明确的答案。
这可能吗?
您不能像这样将自定义类型返回给 UDF。
试试这个:
Function square(iValue) As Integer
Dim w As New wrapper
w.value = iValue
square = w.value * w.value
End Function
虽然我不确定你想用类模块实现什么。
【讨论】:
【参考方案2】:参数名称无效:'Wrapper' 已经是类的名称。
试试这个:
Function square(MyWrapper As wrapper) As Integer
square = MyWrapper.value * MyWrapper.value
End Function
【讨论】:
如果您无法提供有关它如何失败的详细信息 - 输出、错误消息、来自编译器的警告 - 那么我无法为您提供帮助。我认为您最好的做法是阅读一些基础知识——VBA 中的参数传递、UDF 如何工作、使用 Option Explicit——然后从更简单的编程任务重新开始。以上是关于使用类作为自定义工作表函数的参数的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用reshape2包的melt函数将dataframe从宽表到长表(Wide- to long-format)指定行标识符变量并自定义生成的长表的标识符列的名称