【问题标题】: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 是正确的。

标签: vba excel


【解决方案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——然后从更简单的编程任务重新开始。
    猜你喜欢
    • 2012-11-04
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多