2015-05-28 45 views
2

我有一个集合作为一个全局变量,其中会包含Project Task对象。项目关闭后全局变量会丢失它的值

我的宏的结构将是以下几点:

Public TaskCollection As Collection 
Sub Main() 
    Set TaskCollection = New Collection 

    GetData(List of project paths) 

    For Each task in TaskCollection 
     //ProcessTask() 
    Next 

End Sub 


Function GetData(List of project paths) 
    for each project path 
     Open project p 

      //do something else with the opened project... 

      for each Task t in p.Tasks 
       TaskCollection.Add t 
      next 
     Close project p 
     //AFTER THIS, the TaskCollection object will be totally empty 
    next 
End Function 

正如我在评论中所提到的,之后我关闭该项目,从那里我得到了任务到TaskCollection的TaskCollection失去了它的价值。奇怪的是,它保留了以前的对象数量,但它们都是空的;

我试图在GetData函数中本地创建一个集合对象,然后将它传递到TaskCollection全局变量的末尾,但效果是一样的。

回答

3

当您将Task添加到Collection时,您正在添加对象的引用。这些参考只有在它们所指的对象存在时才有意义。这些对象在项目关闭时被销毁。

如果你想使用他们的数据,你需要使用值类型(String,Integer等)复制它,而不是引用对象。或者,您可以保持项目打开,直到完成使用对象。

+0

哦,这很有道理!感谢拜伦的答案。有没有办法将整个对象引用复制到项目关闭时不会死亡的对象中? – Laureant

+2

你正陷入一片混乱。该技术被称为“深层复制”,您可以将所有数据放入一个新对象中。不确定VBA在这方面提供了什么。您将更好地创建自己的课程,并只移动想要的数据。问题成为如何处理'Task'内存在的引用之一。你也复制所有这些吗?他们的参考呢?如果你知道你想要的属性,只需抓住它们并将它们存储在某个地方。这不太可能你需要它。 –