Глобальный справочник рабочих книг! - PullRequest
0 голосов
/ 05 января 2011

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

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

1 Ответ

2 голосов
/ 05 января 2011

Я предполагаю, что вы открываете пару рабочих книг перед тем, как вызывать любую функцию.Функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...