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

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
jaroslav
Сообщения: 45
Зарегистрирован: 07 дек 2009, 13:25

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

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

k = Sheets("Лист3").Index
ReDim arr2(1 To k - 1)
For m = 1 To k - 1
arr2(m) = m
Next
Sheets(arr2).Select
jaroslav
Сообщения: 45
Зарегистрирован: 07 дек 2009, 13:25

Вот ответ:

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

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
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

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

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

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
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

:)
А если хочется всё-таки через динамический массив, то

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

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
jaroslav
Сообщения: 45
Зарегистрирован: 07 дек 2009, 13:25

pashulka, ваш макрос выделяет листы, которые идут перед листом с именем Лист3 и Лист3. А как сделать так, чтобы Лист3 не выделялся?
jaroslav
Сообщения: 45
Зарегистрирован: 07 дек 2009, 13:25

Спасибо, ребята
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

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
jaroslav
Сообщения: 45
Зарегистрирован: 07 дек 2009, 13:25

pashulka, вот теперь работает
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

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
Ответить