我已经在网上搜索过,我已经在 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
最佳答案
正如其他答案所暗示的那样,您的问题的字面答案是“不”。您不能在单元格中存储除数字、字符串、 bool 值、错误等之外的任何内容。除了从 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 加载项更稳健地处理此类句柄的方法。
关于excel - 在 Excel 单元格中返回用户定义的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1354046/