Страница 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