使用类作为自定义工作表函数的参数

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——然后从更简单的编程任务重新开始。

以上是关于使用类作为自定义工作表函数的参数的主要内容,如果未能解决你的问题,请参考以下文章

表值函数--自定义工作日历

Visual Studio 自定义安装操作似乎无法正常工作

脚本编辑器中的功能可以正常工作,但不能来自工作表自定义功能

Excel 自定义功能不适用于工作表

R语言使用reshape2包的melt函数将dataframe从宽表到长表(Wide- to long-format)指定行标识符变量并自定义生成的长表的标识符列的名称

Oracle 的用户自定义聚合函数可以定义为与两列一起使用吗?