【发布时间】:2012-08-01 07:21:35
【问题描述】:
我正在尝试创建一个工作簿集合,以便我更轻松地跟踪所有打开的工作簿。因为每次工作簿的命名都不同,而且我需要在不假设 Excel 没有打开其他工作簿的情况下完成这项工作,所以我不能使用索引。因此我决定使用一个集合。但是,当我放入第二个工作簿时,我不断收到错误,我不确定发生了什么。我已经在两个模块中设置了代码(我不确定这是否会成为问题),但我只是提供了相关代码以便于阅读。
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
我不确定是因为该集合位于不同的模块中,还是我上面的代码有问题。我完全不知所措。任何帮助都会很棒。
更新
我已经回答了这个问题,但在相关说明中,似乎每次我引用该集合时,它都会清除该集合的所有先前部分。我把这段代码放在我的答案下面,但我在这里添加它以供参考:
'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 操作实际上如何不创建对象的帖子,但这对我来说并不清楚。如果您认为这应该是一个单独的问题,请告诉我,我会这样做。谢谢。
【问题讨论】:
-
在调用
AddNewFile时不要使用括号 -
我在一个单独的模块中明确添加了第二个子。
-
哦,是的,应该提到:我使用了 Call addNewFile(usedWorkBooks)。
-
你那里有其他代码有错误处理或“on error resume next”吗?这个
addNewFile(usedWorkBooks)应该会抛出一个错误... -
谢谢大家,原来我写的代码解决了我的问题。上面的代码以这样一种方式重新排列,以限制你必须阅读多少代码,但我做了一些修复它。我真的认为这只是一个范围问题。无论如何感谢您的帮助!
标签: vba excel automation office-automation