2016-08-30 3 views
0

Мой новый вопрос относится к this post. У меня есть Master macro, который вызывает macro на лист в книге. Я получаю ошибку Subscript out of range в ответ на переход от macro в моем предыдущем посте в листе «Сводка», в другой macro на следующем листе. Я думаю, что я могу устранить ошибку и сделать работу Master macro, если я могу исключить инструкцию .Select и вызвать макрос, идентифицируя лист в одной строке. Любая помощь?VBA- Call Macro Per Sheet Issue

Как теперь, с ошибкой наступающем после Call ReformatSummary на Sheets("Boston").Select:

Sub ReformatTheWorkbook() 

    Sheets("Summary").Select 
    Call ReformatSummary 

    Sheets("Boston").Select 
    Call ReformatSheetAndAddDropdowns 

    Sheets("London").Select 
    Call ReformatSheetAndAddDropdowns 

    Sheets("Hong Kong").Select 
    Call ReformatSheetAndAddDropdowns 

End Sub 

Это то, что я хочу сделать, но без Sheet("name").Select того, чтобы определить следующий лист:

Sub ReformatTheWorkbook() 

Sheets("Summary").Select 
Call ReformatSummary 

Application.Run "RefreshAllStaticData" 
Application.OnTime Now + TimeValue("00:00:05"), "Part2RTW" 

End Sub 


Sub Part2RTW() 

Sheets("Boston").Select 
Call ReformatSheetAndAddDropdowns 

Sheets("London").Select 
Call ReformatSheetAndAddDropdowns 

Sheets("Hong Kong").Select 
Call ReformatSheetAndAddDropdowns 

End Sub 
+0

Что имеется в сводке «Реформат»? – OpiesDad

+1

Передайте рабочий лист в качестве параметра. – Comintern

+1

Ошибка подстрочного индекса обычно указывает на то, что лист не существует .... вы уверены, что у вас есть лист под названием «Бостон»? – OpiesDad

ответ

2

Вот пример того, что Коминтерн сделал комментарий о ... вы должны передать рабочий лист в качестве параметра:

Sub ReformatSummary(ws As Worksheet) 
    'instead of ActiveSheet.Range("A1").Value = "Test" use: 
     ws.Range("A1").Value = "Test" 
End Sub 
Sub ReformatSheetAndAddDropdowns(ws As Worksheet) 
    ....Whatever you are doing to the sheets 
End Sub 

Sub ReformatTheWorkbook() 
    Call ReformatSummary(Sheets("Summary")) 
    Call ReformatSheetAndAddDropdowns(Sheets("Boston")) 
    .... 
End Sub 

Это будет листок в качестве параметра. Обратите внимание, что когда вы используете параметр в процедуре, вам нужно использовать рабочий лист вместо того, что вы, вероятно, выполняете как «ActiveSheet».

Итак, если у вас есть код, такой как ActiveSheet.Range ("A1"). Value = "TestValue"

это установит ячейку A1 в выбранном листе равным TestValue

Вместо этого, вы следует использовать

ws.Range("A1").Value = "TetsValue" 

это установит ячейку A1 в листе, определенном в объекте ws равна TestValue

В этом примере объект рабочего листа генерируется в заявлении Sheets("Summary")

Как отмечено в комментарии, это не соответствует сообщение об ошибке вы имеете, хотя. Недопустимая погрешность подстрочного индекса обычно указывает, что объект не существует. В этом случае я бы предположил, что нет листа с именем «Бостон».

+0

Извините, я все еще не очень хорошо знаком с VBA. Как бы это выглядело, если бы я только запускал первый макрос ReformatSummary? Я в замешательстве, куда это пойдет. – plankton