2012-09-03 67 views
1

我想编写一个使用我已定义为参数的类的自定义工作表函数。我试图做到以下几点:使用类作为自定义工作表函数的参数

我创建了一个名为包装类:

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!”。我究竟做错了什么?这可能吗?

+0

似乎从来没有用这两个公式调用“square” - 也许Excel在公式中收到非标准值时立即停止?你可以定义一个单独的函数,这个函数实际上是将square(make_wrapper(foo))作为整数返回(即使从Excel工作表也可以)。 – enderland

+0

是的,但这正是我所做的*不*想要做的。我想用它来构造函数的非常复杂的参数,并通过使用不同的类作为参数来获得一些“类型安全”。 – MadScientist

+0

我希望Excel不喜欢在UDF中从第一个函数make_wrapper返回的类型'wrapper'。尝试重写以输出已知类型,例如'Variant' – user3357963

回答

-1

参数名称无效:“包装器”已经是类的名称。

试试这个:

Function square(MyWrapper As wrapper) As Integer 
    square = MyWrapper.value * MyWrapper.value 
End Function 
+0

这不起作用。 – enderland

+1

如果您无法提供关于它如何失败的详细信息 - 输出,错误消息,来自编译器的警告 - 那么我无法为您提供帮助。我认为你最好的行动方式是阅读一些基础知识 - 在VBA中传递参数,UDF如何工作,使用Option Explicit - 并且用更简单的编程任务重新开始。 –

0

似乎没有人给你一个明确的答案。

这可能吗?

您不能像这样将自定义类型返回给UDF。

试试这个:

Function square(iValue) As Integer 
    Dim w As New wrapper 

    w.value = iValue 

    square = w.value * w.value 
End Function 

虽然我不知道你的努力实现与类模块是什么。

相关问题