Глобальная ссылка на книгу!

Я создаю довольно большой макрос, который в настоящее время занимает 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()», и она работает счастливо.

Почему?

ТИА

(Названия рабочих тетрадей и листов изменены для защиты невиновных)


person JustAPleb    schedule 05.01.2011    source источник


Ответы (1)


Я предполагаю, что вы открываете пару рабочих книг перед вызовом функции 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
person marg    schedule 05.01.2011
comment
Спасибо, Марг, что нашли время ответить - я только что узнал, что я идиот. Должен был активировать рабочую книгу, прежде чем я попытаюсь сослаться на рабочий лист. Думаю, больше кофе. Извините за потраченное время! - person JustAPleb; 05.01.2011
comment
О, и хорошая идея с коллекцией - воспользуюсь. Та :-D - person JustAPleb; 05.01.2011