4

我已经在网上搜索过,我已经在 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

4

3 回答 3

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 加载项更稳健地处理此类句柄的方法。

于 2009-09-02T00:26:18.387 回答
1

这看起来是一个坚韧的饼干。这有点做作,但您可以做的是让您的 Initialize 函数返回一个名称(字符串),然后将 name 参数添加到 Get 函数。基本上是直接操作名称字符串而不是对象。

于 2009-08-31T18:03:27.387 回答
0

嵌套不起作用,因为一旦 UDF 执行完毕, myvar 就会超出范围。实际上可能存在与尝试在工作表函数中返回对象相关的其他问题(肯定有),但即使没有范围问题仍然会杀死它。

您可以将指向对象的指针存储在单元格中并通过该指针获取对象,但作用域将再次杀死它。要从指针中获取对象,它必须保持在范围内,所以为什么还要麻烦存储指针。

显然,您的现实生活情况比您的示例更复杂。所以答案是否定的,将对象存储在单元格中,但如果你解释你想要完成的事情,可能会有其他选择。

于 2009-08-31T22:19:37.370 回答