我在网上搜索过,我在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
答案 0 :(得分:2)
正如其他答案所示,你问题的字面答案是“不”。您不能在单元格中存储除数字,字符串,布尔值,错误等之外的任何内容。您不能从UDF返回除了简单值之外的任何内容,例如那些,数组或范围引用。
但是,你可以基本上通过传递(并存储在单元格中)对象的某种句柄来实现你想要的,这是一个合法的单元格值(即“myclass:instance:42” )。这可能是您在编辑中链接到的示例。但是,您的代码必须能够解释句柄值的含义并将对象保存在内存中。如果您不关心泄漏对象,这可能会变得棘手,因为如果您使用VBA执行所有操作,有很多方法可以擦除或覆盖您无法检测到的句柄。
我现在没有把它放在我面前,但你可能想看看Steve Dalton在C / C ++中使用Excel加载项开发的财务应用程序一书:
他讨论了如何使用XLL加载项更加强大地处理这样的句柄。
答案 1 :(得分:1)
这看起来很难吃。这是一个小小的问题,但你可以做的是让你的Initialize函数返回一个名字(字符串),然后将name参数添加到Get函数。基本上是直接操作名称字符串而不是对象。
答案 2 :(得分:0)
嵌套将无效,因为一旦UDF执行完毕,myvar就会超出范围。实际上可能存在与尝试在工作表函数中返回对象相关的其他问题(当然也有),但即使没有范围问题仍然会将其删除。
您可以在单元格中存储指向对象的指针,并通过该指针获取对象,但范围将再次将其终止。要从指针获取对象,它必须保留在范围内,所以为什么还要存储指针。
显然,你的现实生活情况比你的榜样更复杂。所以答案不是将对象存储在单元格中,但如果你解释你想要完成的东西,那么可能有其他选择。