2012-07-31 47 views
0

我正在嘗試創建一個工作簿集合,這將允許我更輕鬆地跟蹤打開的所有工作簿。由於工作簿每次都會有不同的命名,並且因爲我需要在不假設Excel沒有打開其他工作簿的情況下使其工作,所以我無法使用索引。因此我決定使用一個集合。但是,當我放入第二個工作簿時,我不斷收到錯誤信息,但我不確定發生了什麼。我已經將代碼設置爲兩個模塊(我不確定這是否會成爲問題),但我剛剛提供了相關代碼以便於閱讀。未添加到對象集合的Excel VBA工作簿

Sub run() 
    Dim usedWorkbooks As New Collection 
    Dim mainWorkBook As Workbook 
    Set mainWorkBook = ActiveWorkbook 
    Dim testwb As Workbook 

    usedWorkbooks.Add Item:=mainWorkBook, key:="main" 'Added successfully 
    usedWorkbooks.Add Item:=testwb, key:="test" 'Added successsfully 
    addNewFile(usedWorkBooks) 
End Sub 

'In a separate module 
Public Sub addNewFile(ByRef usedWorkBooks as Collection) 
    Dim ptCsv As String 
    ptCsv = someFilePath 
    'Filegrabber.grab simply returns the path of the desired workbook and works correctly 
    'This is not the problem, can be substituted with any file path string 
    ptCsv = FileGrabber.grab(ptCsv) 
    Dim ptCsvWorkBook As Workbook 
    Set ptCsvWorkBook = Workbooks.Open(ptCsv) 'Successfully opens workbook 

    'Prints out the type of object as "Workbook" 
    MsgBox "the object is: " & TypeName(ptCsvWorkBook) 
    'Fails to add. Says I need an object 
    usedWorkbooks.Add Item:=ptCsvWorkBook, key:="ptCsv" 
End Sub 

我不確定是因爲集合在不同的模塊中,還是上面的代碼有問題。我處於全面虧損狀態。任何幫助都會很棒。

UPDATE

因爲我已經回答了這個問題,但在一個相關的說明,似乎每一次我引用它是消滅所有集合的前幾部分的集合。我把這段代碼放在我的答案中,但我在這裏添加它作爲參考:

'UserForm to login to system 
Dim usedWorkbooks As New Collection 
Private Sub login_Click() 
    Dim mainWorkBook As Workbook 
    Set mainWorkBook = ActiveWorkbook 

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

    intializeProcess 'a worksheet is added to the array here 
    'This will print out as saying there are 0 worksheets 
    MsgBox "the size of the array is: " & usedWorkBooks.Count 
End Sub 

Public Sub addNewFile(filepath As String, sheetKey As String) 
    Dim newWorkBook As Workbook 

    Set newWorkBook = Workbooks.Open(filepath) 

    usedWorkBooks.Add Item:=newWorkBook, key:=sheetKey 
    MsgBox "the size of the array is: " & usedWorkBooks.Count 

End Sub 

'Part of the initialize Module 
Public Sub intializeProcess() 
    Call LoginModule.login(username, password, "pt", ie) 
    ptCsv = FileGrabber.grab(ptCsv) 'ptcsv is set to some filepath by the grab sub 

    'This will print out that the array size is 1 
    UserLogin.addNewFile ptCsv, "ptCsv" 
End Sub 

我不明白髮生了什麼事情。看起來你無法在VBA中傳遞集合的參考?我已閱讀關於New操作如何實際上不創建對象的文章,但對我而言這並不明確。如果你認爲這應該是一個單獨的問題,讓我知道,我會做到這一點。謝謝。

+0

此代碼適用於我... – Trace 2012-07-31 16:14:26

+3

不要在您對'AddNewFile'的調用中使用小括號 – 2012-07-31 16:17:05

+0

而且我明確將第二個子項添加到單獨的模塊中。 – Trace 2012-07-31 16:17:05

回答

0

上面的代碼被重寫,以防止在頁面上有太多的代碼。我不確定我是否修改了這個問題,所以我添加了原來的代碼,以防有人想解決原始問題。我也許應該張貼整個代碼每當我對未來的問題:

'UserForm to login to system 
Dim usedWorkbooks As New Collection 'Correct placement of collection 
Private Sub login_Click() 
    Dim usedWorkbooks As New Collection 'Should be defined outside of this sub 
    Dim mainWorkBook As Workbook 
    Set mainWorkBook = ActiveWorkbook 

    usedWorkbooks.Add Item:=mainWorkBook, key:="main" 
    intializeProcess 
End Sub 

Public Sub addToWorkbookCollection(obj As Workbook, name As String) 
    usedWorkBooks.Add Item:=obj, key:=name 
End Sub 

'Part of the initialize Module 
Public Sub intializeProcess() 
    ptCsv = FileGrabber.grab(ptCsv) 
    Dim ptCsvWorkBook As Workbook 

    Set ptCsvWorkBook = Workbooks.Open(ptCsv) 

    MsgBox "the object is: " & TypeName(ptCsvWorkBook) 
    UserLogin.addToWorkbookCollection ptCsvWorkBook, "ptCsv" 

End Sub 

而且讀了上面所輸入的代碼後,我意識到,我創建集合的login_click()子裏面,這樣就產生一個範圍問題。對這個問題抱歉,但至少它幫助解決了我的問題。