Как зациклить макрос через именованный массив листов в книге - PullRequest
0 голосов
/ 28 апреля 2019

Сводка: цикл макроса через определенный массив ws.Имя массива определяется в менеджере имен.Каким-то образом макрос перебирает дополнительный ws, который НЕ находится в массиве.

Цель состояла в том, чтобы заменить длинную подпрограмму вызова макроса для каждого ws, мне нужно выполнить код и узнать, как использовать именованный массив диапазона какони являются динамическими.

Код: (нашел его в stackoverflow, а затем настроил его для моей цели)

    Public Sub Tester02()
    Dim SH As Worksheet
    Dim rng As Range
    Dim rCell As Range

    Set rng = 
    ActiveWorkbook.Sheets("ListOfSheets").Range("ListOfWorksheetsHRIB")

    For Each SH In ActiveWorkbook.Worksheets
    If Not IsError(Application.Match(SH.Name, rng, 0)) Then
    Call SingleCtrRefreshHRIB
    End If
    Next SH
    Worksheets("Dashboard").Activate
    End Sub

По какой-то причине макрос проходит по дополнительному листу (Sheet1 = Dashboard).

В моем нетренированном макросе идет «Панель инструментов» после ПОСЛЕ того, как он прошел через указанный диапазон.Поэтому этот рабочий лист не должен быть включен.

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

Не уверен, что он актуален, но sub SingleCtrRefreshHRIB снимает защиту, обновляет фильтр и защищает ws в названном диапазоне..

С другой стороны, я был удивлен, увидев, что цикл не был действительно более эффективным (по времени), чем прохождение каждого отдельного ws.Более элегантный и, очевидно, динамичный, но не более быстрый.

При необходимости код вызываемого макроса (я уберу активацию и выделю в этом коде, как только смогу).

    Sub SingleCtrRefreshHRIB()
    '
    ' In active IB worksheet macro unprotects, refreshes the "ACTIVE" 12 
    field and reprotects for HR
    '
    Application.ScreenUpdating = False
    ActiveSheet.Select
    ActiveSheet.Unprotect
    ActiveSheet.Range("$A$1:$AB$1051").AutoFilter Field:=12
    ActiveSheet.Range("$A$1:$AB$1051").AutoFilter Field:=12, Criteria1:= 
    _"ACTIVE"
    ActiveSheet.Select
    ActiveSheet.Protect DrawingObjects:=False, Contents:=True, 
    Scenarios:= _False, AllowFormattingColumns:=True, 
    AllowFiltering:=True
    End Sub

спасибо!

1 Ответ

0 голосов
/ 28 апреля 2019

Использование ActiveSheet может привести к путанице, ошибкам и нежелательному и непредсказуемому поведению.Пожалуйста, избегайте его использования.Это плохая практика.

Сделайте резервную копию ваших файлов, а затем попробуйте сделать копию:

Public Sub Tester02()
Dim SH As Worksheet 'declare a worksheet variable which can hold a worksheet object
Dim WB As Workbook 'declare a workbook variable which can hold a workbook object
Dim rng As Range 'declare a range variable which can hold a range object
Set WB = Application.Workbooks("The Name of your Workbook") 'assign a specific workbook to your workbook variable
Set rng = WB.Worksheets("ListOfSheets").Range("ListOfWorksheetsHRIB") 'assign a specific range to your range variable. Get the named range ListOfWorksheetsHRIB which belongs to the worksheet named ListOfSheets which belongs to WB and assign it to rng.

For Each SH In WB.Worksheets 'loop through all the worksheets that belong to WB
    If Not IsError(Application.Match(SH.Name, rng, 0)) Then 'check if the current worksheet's name is in the list of worksheets contained in rng
        Call SingleCtrRefreshHRIB(SH) 'if it is, pass this particular worksheet as parameter to SingleCtrRefreshHRIB
    End If
Next SH ' move on to the next worksheet and repeat
Worksheets("Dashboard").Activate 'not sure why you need this. Try avoiding .Activate. Use explicit references to worksheets.
End Sub

Sub SingleCtrRefreshHRIB(sht As Worksheet) 'This procedure gets a worksheet as a parameter and uses it to perform some actions
Application.ScreenUpdating = False
sht.Unprotect
sht.Range("$A$1:$AB$1051").AutoFilter Field:=12
sht.Range("$A$1:$AB$1051").AutoFilter Field:=12, Criteria1:="ACTIVE"
sht.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False, AllowFormattingColumns:=True, AllowFiltering:=True
Application.ScreenUpdating = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...