在Excel单元格中返回用户定义的数据类型

时间:2009-08-30 14:56:54

标签: excel vba user-defined-functions

我在网上搜索过,我在stackoverflow上搜索了这些问题,但是我找不到解决方案。

以下是我想做的事情:

假设我在名为“MyClass”的类模块中有以下代码


Option Explicit
Dim var1 as integer

Sub Initialize(v as integer) var1 = v End Sub

Function GetVar1() GetVar1 = var1 End Function

然后我在一个带代码的单独模块中有一个UDF

 
Function InitializeMyClass(v as integer) as MyClass
   Dim myvar as MyClass
   Set myvar = new MyClass
   Call myvar.Initialize(v)
   Set InitializeMyClass = myvar
End Function

Function GetMyVar(m as MyClass) GetMyVar = m.GetVar1() End Function

现在在单元格A1中我有“= InitializeMyClass(3)”,在单元格A2中我有“= GetMyVar(A1)”。我在两个单元格中都出现#VALUE错误。这当然是由于我试图将用户定义的数据类型返回到单元格A1的事实。我觉得这应该是可能的,但我不确定如何。

编辑:哦,是的,问题是,“我有没有办法将用户定义的数据类型返回到单元格中,然后在上面给出的示例中从另一个UDF调用它?我不知道知道这是否需要COM。如果确实如此,任何人都知道如何开始?理想情况下,如果某人有一个如何工作的例子,那就太棒了!“

另一个编辑:我们走了,现在我知道它可以做到:阅读这个描述,它不是定量的,但会让你了解他们做了什么,http://www.quanttools.com/index.php?option=com_content&task=view&id=19

3 个答案:

答案 0 :(得分:2)

正如其他答案所示,你问题的字面答案是“不”。您不能在单元格中存储除数字,字符串,布尔值,错误等之外的任何内容。您不能从UDF返回除了简单值之外的任何内容,例如那些,数组或范围引用。

但是,你可以基本上通过传递(并存储在单元格中)对象的某种句柄来实现你想要的,这是一个合法的单元格值(即“myclass:instance:42” )。这可能是您在编辑中链接到的示例。但是,您的代码必须能够解释句柄值的含义并将对象保存在内存中。如果您不关心泄漏对象,这可能会变得棘手,因为如果您使用VBA执行所有操作,有很多方法可以擦除或覆盖您无法检测到的句柄。

我现在没有把它放在我面前,但你可能想看看Steve Dalton在C / C ++中使用Excel加载项开发的财务应用程序一书:

http://www.amazon.com/Financial-Applications-using-Development-Finance/dp/0470027975/ref=ntt_at_ep_dpt_1

他讨论了如何使用XLL加载项更加强大地处理这样的句柄。

答案 1 :(得分:1)

这看起来很难吃。这是一个小小的问题,但你可以做的是让你的Initialize函数返回一个名字(字符串),然后将name参数添加到Get函数。基本上是直接操作名称字符串而不是对象。

答案 2 :(得分:0)

嵌套将无效,因为一旦UDF执行完毕,myvar就会超出范围。实际上可能存在与尝试在工作表函数中返回对象相关的其他问题(当然也有),但即使没有范围问题仍然会将其删除。

您可以在单元格中存储指向对象的指针,并通过该指针获取对象,但范围将再次将其终止。要从指针获取对象,它必须保留在范围内,所以为什么还要存储指针。

显然,你的现实生活情况比你的榜样更复杂。所以答案不是将对象存储在单元格中,但如果你解释你想要完成的东西,那么可能有其他选择。