2011-01-05 6 views
0

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

Почему?

ТИА

(Названия книг и таблиц были изменены, чтобы защитить невинных)

ответ

2

Я предполагаю, что вы открываете пару Workbooks перед вызовом функции 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 
+0

Спасибо Маргу за то, что нашли время ответить - я только что узнал, что я идиот. Должен был активировать рабочую книгу, прежде чем я попытаюсь ссылаться на рабочий лист. Думаю, кофе больше. Извините за то, что тратишь свое время! – JustAPleb

+0

Ох, и хорошая идея о коллекции - я буду использовать это. Ta: -D – JustAPleb

Смежные вопросы