Макрос для запуска по списку переменных

У меня есть макрос, который запускает ряд других макросов. Макрос запускается автоматически, когда я изменяю значение определенной ячейки (B1). Макрос генерирует отчет по проекту для номера проекта, указанного в B1. У меня есть около 75 активных проектов в любой момент времени.

То, что я хотел бы сделать, это добавить список проектов в рабочую книгу и выполнить его через каждое значение. Значения и количество значений меняются каждую неделю, поэтому я не хочу жестко кодировать значения в макрос. Я предполагаю, что использовал бы функцию цикла, но не уверен, как это сделать.

Мой код для текущего макроса:

Sub AA_RunAll()

Application.ScreenUpdating = False
ActiveWorkbook.RefreshAll
DoEvents
Call OpenFile
Call Copy1
Call DeleteRows1
Call DeleteRows2
Call DetailCopy
Call RemoveEmptySheets
Call SummarySheet

Workbooks("Project WIP Template.xlsm").Worksheets("Summary").Activate
Application.Goto Range("A1"), True
Application.ScreenUpdating = True
Application.DisplayAlerts = True


Call SaveAs

Workbooks("Project WIP V5.xlsm").Worksheets("Summary").Activate
Range("b1").Select

MsgBox "Report Complete"

End Sub

заранее спасибо

1 ответ

Если ваш макрос запускается каждый раз, когда вы изменяете значение Range("B1")Полагаю, ты стреляешь Worksheet_Change тестирование событий для:

If Target.Address = "$B$1" Then
    AA_RunAll '<-- call your macro
End If

Если это так, самый простой способ обмануть свой собственный дизайн - написать список номеров проектов в электронной таблице, скажем, Project numbersколонка А:

1
2
3
...

... а затем перебрать этот список, чтобы заменить значение вашей ячейки B1:

Sub allProjects()
    For j = 1 To Sheets("Project numbers").Range("A1").End(xlDown).Row
        Range("B1").Value = Sheets("Project numbers").Range("A" & j).Value
        'the above set will call the worksheet change and run your macro for a given value
    Next j
End Sub

Я должен сказать, однако, что дизайн не идеален. Я бы предпочел, чтобы ваш макрос принимал параметр:

Sub AA_RunAll(ByVal projectNumber As Integer)
    'your code, pass the projectNumber to other submacros if needed
End Sub

... и вызывать макрос программно с правильным номером, вместо того, чтобы обмануть лист Excel, чтобы запустить Worksheet_Change событие.

Другие вопросы по тегам