Ошибка получения индекса вне допустимого диапазона для одной переменной конкретно в массиве - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь настроить подпрограмму, которая защищает и скрывает рабочие листы, помеченные как «ограниченные», и защищаю только рабочие листы с пометкой «только для чтения», как указано пользователем в определенных ячейках (см. Прикрепленное изображение, где пользователь укажет статус для каждого листа). Код работает без проблем, только для ограниченной части листов. Однако, как только я добавляю условие для проверки листов только для чтения, я получаю ошибку индекса вне диапазона для строки, отмеченной **, но странно то, что это всегда для четвертого элемента массива, поэтому не уверен, почему первые 3 работают нормально или почему добавление второго условия останавливает его работу. Если строки «Только для чтения» и условия удалены, все работает нормально. Возможно, мне не хватает чего-то очевидного, я новичок в VBA, как вы можете видеть по тому, что, вероятно, является моим неэффективным кодом. Любая помощь приветствуется!

Пользовательская таблица для выбора листов с ограниченным доступом и только для чтения

enter image description here

Private Sub Test()

Dim NumberOfSheets As Integer     'Variable for counting the sheets in model
NumberOfSheets = Application.Sheets.Count - 2 'Number of Sheets ignores Master Cmd sheet, and array starts at 0 so 2 is subtracted
Dim iCounter As Integer           'Counter for looping through the array
ReDim CheckWorksheets(NumberOfSheets) As String 'Restricted worksheet name variable declaration

Worksheets("Master Cmd").Activate 'Activate Master Cmd
Range("C7").Activate 'Activate first cell with sheet name

For iCounter = 0 To NumberOfSheets 'Loop to cycle through worksheet names

    CheckWorksheets(iCounter) = ActiveCell.Offset(iCounter, 0) 'Setting array variable equal to worksheet name

Next iCounter

For iCounter = 0 To NumberOfSheets 'Loop to change restricted worksheets status to very hidden

    Select Case ActiveCell.Offset(iCounter, 2)

        Case "Restricted"
            Worksheets(CheckWorksheets(iCounter)).Protect password:=AdminPassword 'Protecting sheets

            Worksheets(CheckWorksheets(iCounter)).Visible = xlSheetVeryHidden 'Condition to see if status is restricted in Master Cmd sheet

        Case "Read Only"
            **Worksheets(CheckWorksheets(iCounter)).Protect password:=AdminPassword**

    End Select

Next iCounter

End Sub

1 Ответ

0 голосов
/ 28 мая 2020

Я бы отбросил массив. Непроверено:

Private Sub Test()
    Const VAL_RESTRICTED = "Restricted"
    Dim wb As Workbook, c As Range

    Set wb = ThisWorkbook '? or ActiveWorkbook ?

    For Each c In wb.Worksheets("Master Cmd").Range("C7").Resize(wb.Worksheets.Count - 1, 1).Cells
        With wb.Worksheets(c.Value)
            .Protect Password:=AdminPassword 'Protecting sheets
            If c.Offset(0, 2).Value = VAL_RESTRICTED Then .Visible = xlSheetVeryHidden
        End With
    Next c
End Sub

Изменить: для отладки исходной проблемы вы можете немного изменить свой код.

Dim shtName 

'...
'...

For iCounter = 0 To NumberOfSheets

    shtName = CheckWorksheets(iCounter)
    Debug.Print iCounter, shtName

    Select Case ActiveCell.Offset(iCounter, 2)

        Case "Restricted"
            Worksheets(shtName).Protect password:=AdminPassword 
            Worksheets(shtName).Visible = xlSheetVeryHidden 

        Case "Read Only"
            Worksheets(shtName).Protect password:=AdminPassword

    End Select

Next iCounter

Обратите внимание, что хорошей практикой является явная квалификация Worksheets с указанием c рабочая тетрадь. В этом случае это должно быть ThisWorkbook.Worksheets()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...