2012-08-01 19 views
1

这实在让我感到困惑。我昨天提出了一个关于模块之间传递的集合的问题(see here),但似乎并没有对这个问题进行更多的解释,所以我试图以一种通用的方式更清楚地说明问题。EXCEL数组和模块之间传递值的集合

我有一个模块(module1)和一个用户窗体(userform1)。我在userform1中创建一个集合(或数组)并将工作表对象添加到这个数组中。然后,我将控制权传递给module1,module1调用userform1中的一个名为addNewFile的子元素,它应该将新创建的工作簿添加到集合中。但是,每次module1调用addNewFile时,我都会得到以下两种情况之一:1)集合已被删除,所有已添加的工作表现在都已经消失(对于集合),2)我得到一个错误,说我的类型不匹配(对于数组)。我不知道为什么会发生这种情况,所以下面的代码可以更好地说明问题。任何帮助,将不胜感激,即使它只是告诉我,它是不可能存储在数组中的工作表对象。

UserForm1

Dim workBooksCollection as New Collection 'can also define as an array 
Private Sub CommandButton1_click() 

    Dim mainWorkBook as workbook 
    Set mainWorkBook = ActiveWorkbook 
    Dim testwb As Workbook 

    workBooksCollection.Add Item:=mainWorkBook, key:="main" 'Adds successfully 
    workBooksCollection.Add Item:=testwb, key:="test" 'Adds successfully 
    MsgBox "the size of the array is: " & usedWorkBooks.Count 'Prints off as size 2 

    Module1.initialize 

    'After running initialize, prints off as size 0, meaning collection has been erased 
    MsgBox "the size of the array is: " & usedWorkBooks.Count 'Prints off as size 0 

End Sub 
Public Sub addNewFile(filepath As String, sheetKey As String) 
    Dim newWorkBook As Workbook 
    Set newWorkBook = Workbooks.Open(filepath) 

    MsgBox "The name of the workbook is: " & newWorkBook.name 'Prints off name of workbook successfully 

    workBooksCollection.Add Item:=newWorkBook, key:=sheetKey 
    MsgBox "the size of the array is: " & workBooksCollection.Count 'Prints off as size 1 
End Sub 

模块1

Public Sub intialize() 
    Dim filepath as string 
    'The filepath is set to any path of a workbook 

    'This will print out that the array size is 1 
    UserForm1.addNewFile filePath, "secondBook" 

End Sub 

很抱歉,如果我似乎在这里费口舌,但我真的没有任何想法是怎么回事。我习惯于集合和列表的思想是全局性的,在被另一个模块引用时不会改变。任何关于这里发生的事情的帮助都会很棒。

+0

此外,这发生在所有数据类型,而不仅仅是工作簿。 – derigible 2012-08-01 19:45:02

+2

你似乎没有初始化你的'workBooksCollection'集合对象('Set workBooksCollection = New collection')。这发生在哪里? – 2012-08-01 20:03:40

+0

对不起,我忘了在workBooksCollection之前添加New运算符。它现在重申'Dim workBooksCollection as New Collection' – derigible 2012-08-01 20:27:15

回答

2

我想评论,但我不能,因为我不得不重做我的帐户,因为我被锁定了我原来的。

如果我的答案是没有帮助的,我会删除一些,但如果更换什么 -

Dim workBooksCollection as collection 'can also define as an array 

从用户窗体模块,为模块1为:

Public workBooksCollection as collection 'can also define as an array 

不它有帮助吗?

+0

这是一直存在的问题。我已经连续两天在墙上殴打我的头!谢谢,这真的很简单,我知道它应该是。 – derigible 2012-08-01 20:36:07

+0

@资格 - 我有点惊讶这是你的问题的答案。如果您的集合变量是在用户窗体中定义的,但只能通过用户窗体中的方法访问,则不需要声明为公共。 – 2012-08-01 23:24:12

+0

@TimWilliams这就是我的想法,但我无法让它工作。我对VBA的范围并不太熟悉,而且我发现VBA中有很多奇怪的规则没有在其他语言中找到。我只知道这个答案有效。如果你有一个解决方案,为什么accessor方法不工作,我很想知道。 – derigible 2012-08-02 16:41:06