Страница 1 из 1

выделение нескрытых листов книги

Добавлено: 27 май 2014, 15:42
jaroslav
Всем привет. У меня такой вопрос: как выделить листы, которые идут перед листом с именем Лист3. Проблема заключается в том, что в книге есть скрытые и очень скрытые листы.
Вот мой код:

Код: Выделить всё

k = Sheets("Лист3").Index
ReDim arr2(1 To k - 1)
For m = 1 To k - 1
arr2(m) = m
Next
Sheets(arr2).Select

Re: выделение нескрытых листов книги

Добавлено: 27 май 2014, 16:03
jaroslav
Вот ответ:

Код: Выделить всё

Sub test()
    k& = Sheets("Лист3").Index

    Dim sh As Worksheet, n&
    For Each sh In ThisWorkbook.Worksheets
        If sh.Visible = xlSheetVisible And sh.Index < k& Then
            sh.Select n = 0
            n = n + 1
        End If
    Next sh
End Sub

Re: выделение нескрытых листов книги

Добавлено: 27 май 2014, 16:24
pashulka
Если нужно перебрать листы только до определённого, то Ваша первоначальная идея (в которой нет перебора всех рабочих листов) заслуживает внимания :)

Код: Выделить всё

Private Sub Test()
    With ActiveWorkbook.Worksheets
         For iCount& = 1 To .Item("Лист3").Index - 1
             If .Item(iCount&).Visible = True _
             Then .Item(iCount&).Select False
         Next
    End With
End Sub

Re: выделение нескрытых листов книги

Добавлено: 27 май 2014, 16:38
Naeel Maqsudov
:)
А если хочется всё-таки через динамический массив, то

Код: Выделить всё

Sub SelectVisibleSheetsBeforeTheSheet3()
    
    Dim ToBeSelected()
    ReDim ToBeSelected(1 To 1) 'Чтобы макрос не зависел от Option Base
    
    For i = 1 To sheets("Лист3").Index - 1
        If sheets(i).Visible = xlSheetVisible Then
            If Not IsEmpty(ToBeSelected(1)) Then ReDim Preserve ToBeSelected(1 To UBound(ToBeSelected) + 1)
            ToBeSelected(UBound(ToBeSelected)) = i
        End If
    Next
    If Not IsEmpty(ToBeSelected(1)) Then
       sheets(ToBeSelected).Select
    Else
       MsgBox "There are no sheets that could be selected"
    End If
End Sub

Re: выделение нескрытых листов книги

Добавлено: 27 май 2014, 16:40
jaroslav
pashulka, ваш макрос выделяет листы, которые идут перед листом с именем Лист3 и Лист3. А как сделать так, чтобы Лист3 не выделялся?

Re: выделение нескрытых листов книги

Добавлено: 27 май 2014, 16:44
jaroslav
Спасибо, ребята

Re: выделение нескрытых листов книги

Добавлено: 27 май 2014, 17:57
pashulka
jaroslav, Вы правы, только группируется не конкретно "Лист3", а все выделенные до выполнения макроса - листы + те, что требуются в техзадании. Бороться с этим безобразием можно путём усложнения кода (см. далее), а если потребуется проверить, произошло ли выделение[группировка] нужных рабочих листов, то достаточно будет проверить значение переменной flagSVW (True - значит нет, False - хотя бы один раб.лист был выделен)

Код: Выделить всё

Private Sub Test()
    With ActiveWorkbook.Worksheets
         Dim iCount&, flagSVW As Boolean
         flagSVW = True
         For iCount = 1 To .Item("Лист3").Index - 1
             If .Item(iCount).Visible = True Then
                .Item(iCount).Select flagSVW
                flagSVW = False
             End If
         Next
    End With
End Sub
P.S. Если логика, где False это True, и наоборот, покажется странной, что, в общем-то понятно, ибо изначально переменная flagFVW использовалась для других целей, то :

Код: Выделить всё

Private Sub TestNotTest()
    With ActiveWorkbook.Worksheets
         Dim iCount&, flagSVW As Boolean
         For iCount = 1 To .Item("Лист3").Index - 1
             If .Item(iCount).Visible = True Then
                .Item(iCount).Select Not flagSVW
                flagSVW = True
             End If
         Next
    End With
End Sub

Re: выделение нескрытых листов книги

Добавлено: 27 май 2014, 19:16
jaroslav
pashulka, вот теперь работает

Re: выделение нескрытых листов книги

Добавлено: 06 июн 2014, 03:08
pashulka
jaroslav, Вот родил ещё один вариант решения поставленной задачи, причём принципиально иной, ибо здесь вообще не используется индекс(номер) листа :)

Код: Выделить всё

Private Sub Testv2()
    Dim iList As Worksheet, flagSVW As Boolean
    Set iList = Worksheets("Лист3").Previous

    Do Until iList Is Nothing
       If iList.Visible = True Then
          iList.Select Not flagSVW
          flagSVW = True
       End If
       Set iList = iList.Previous
    Loop
End Sub
или

Код: Выделить всё

Private Sub Testv3()
    Dim iList As Worksheet, flagSVW As Boolean
    Set iList = Worksheets(1)
    
    Do Until iList Is Worksheets("Лист3")
       If iList.Visible = True Then
          iList.Select Not flagSVW
          flagSVW = True
       End If
       Set iList = iList.Next
    Loop
End Sub