Я создаю довольно большой макрос, который в настоящее время занимает 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()", и она работает счастливо.
Почему?
ТИА
(Названия рабочих тетрадей и листов изменены для защиты невиновных)
Ответ 1 · рейтинг 2 · marg
Я предполагаю, что вы открываете пару рабочих книг перед вызовом функции Whatever. Вы можете вызывать функцию Select только на видимом листе в активной книге.
Это означает, что вам нужно добавить E1_workbook.Activate перед E1_workbook.Worksheets("worksheet name").Select, и если лист "имя рабочего листа" является скрытым листом, вам также нужно сделать его видимым, используя E1_workbook.Worksheets("worksheet name").Visible = xlSheetVisible, вы можете снова скрыть лист, установив значение xlSheetHidden
Кстати, я бы посоветовал вам поместить все свои рабочие книги в коллекцию или массив и передать этот массив любой функции, а не использовать общедоступные глобальные переменные. Один из способов сделать это:
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