我正在创建一个相当大的宏,它使用多个工作表来获取目前的5个工作簿(可能会随着时间的推移而增加),并将它们组合成一个工作簿。
现在,我认为最简单的方法来执行所有各种任务,我必须做的是声明对工作簿的全局引用。但它似乎没有用。
所以,我已将其声明为:
Public E1_workbook As Workbook
然后当宏被启动时,它将实例化它。
Private Sub Begin()
...
Set E1_workbook = Workbooks.Open(Filename:="Workbook name")
...
'Do other stuff
...
Whatever
...
'Close workbooks and free up resources...
...
End Sub
然后在另一个子例程中进一步向下,我尝试使用工作簿:
private sub Whatever()
E1_workbook.Worksheets("worksheet name").Select
但是,这将失败,说明“工作表类的选择方法失败”
即使我可以将上面的“Whatever()
”子句中的确切行复制到“Begin()
”子组中,但它仍能正常运行。
为什么?
TIA
(工作簿和工作表的名称已经更改,以保护无辜者)
答案 0 :(得分:2)
我假设您在调用Whatever函数之前打开了几个工作簿。您只能在有效工作簿中的可见工作表上调用Select
功能。
这意味着您需要在E1_workbook.Activate
前添加E1_workbook.Worksheets("worksheet name").Select
,如果工作表名称“工作表名称”是隐藏工作表,您还需要使用E1_workbook.Worksheets("worksheet name").Visible = xlSheetVisible
将其显示为可见将值设置为xlSheetHidden
顺便提一下,我建议你把所有的工作簿放在一个Collection或一个Array中,然后将这个数组传递给any函数,而不是使用public globals。一种方法是:
Private Sub begin()
Dim srcWorkbooks As Collection
Set srcWorkbooks = New Collection
srcWorkbooks.Add workbooks.Open("fileName1")
srcWorkbooks.Add workbooks.Open("fileName2")
whatever srcWorkbooks
End Sub
Private Sub whatever(srcWorkbooks As Collection)
Dim srcWorkbook As Workbook
For Each srcWorkbook In srcWorkbooks
srcWorkbook.Activate
srcWorkbook.Sheets(1).Select
Next srcWorkbook
closeWorkbooks srcWorkbooks
End Sub
Private Sub closeWorkbooks(srcWorkbooks As Collection)
Dim i As Integer
For i = srcWorkbooks.Count To 1 Step -1
srcWorkbooks(i).Close
srcWorkbooks.Remove i
Next i
Set srcWorkbooks = Nothing
End Sub