Сделал макрос, для удаления q-кол-ва листов использвал функцию reDim по аналогии с примера другого совсем. Вроде всё работает как мне надо, но я совсем не пойму принципа работы. Может кто-нибудь пояснить три вопроса по коду? [vba]
Код
Sub УдалениеПочтиВсехЛистов() Dim sheet As Worksheet: ReDim GroupIndex(1 To 1) '1 Application.DisplayAlerts = False For Each sheet In ActiveWorkbook.Worksheets q = sheet.Index If q <= 273 Then ReDim Preserve GroupIndex(1 To q): GroupIndex(q) = sheet.Index '2 Sheets(GroupIndex).Select '3 End If Next ActiveWindow.SelectedSheets.Delete Application.DisplayAlerts = True End Sub
[/vba]
1) Dim sheet As Worksheet: ReDim GroupIndex(1 To 1) :Вот тут, что именно обозначает ReDim дословно, и что значит 1to 1? 2) ReDim Preserve GroupIndex(1 To q): GroupIndex(q) = sheet.Index :Что означает Redim Perserve? 3) Sheets(GroupIndex).Select :мне казалось, что данная функция работает с перечнем листов, то есть все индексы листов должны быть записаны через ",", чтобы выделить диапазон, поэтому, я рассчитывал при выводе в MgsBox (GroupIndex) увидеть запись последовательности чисел через запятую, но такого не получается. Не пойму почему.
Сделал макрос, для удаления q-кол-ва листов использвал функцию reDim по аналогии с примера другого совсем. Вроде всё работает как мне надо, но я совсем не пойму принципа работы. Может кто-нибудь пояснить три вопроса по коду? [vba]
Код
Sub УдалениеПочтиВсехЛистов() Dim sheet As Worksheet: ReDim GroupIndex(1 To 1) '1 Application.DisplayAlerts = False For Each sheet In ActiveWorkbook.Worksheets q = sheet.Index If q <= 273 Then ReDim Preserve GroupIndex(1 To q): GroupIndex(q) = sheet.Index '2 Sheets(GroupIndex).Select '3 End If Next ActiveWindow.SelectedSheets.Delete Application.DisplayAlerts = True End Sub
[/vba]
1) Dim sheet As Worksheet: ReDim GroupIndex(1 To 1) :Вот тут, что именно обозначает ReDim дословно, и что значит 1to 1? 2) ReDim Preserve GroupIndex(1 To q): GroupIndex(q) = sheet.Index :Что означает Redim Perserve? 3) Sheets(GroupIndex).Select :мне казалось, что данная функция работает с перечнем листов, то есть все индексы листов должны быть записаны через ",", чтобы выделить диапазон, поэтому, я рассчитывал при выводе в MgsBox (GroupIndex) увидеть запись последовательности чисел через запятую, но такого не получается. Не пойму почему.Roman777
Про ReDim Statement читайте помощь - там всё написано. GroupIndex у Вас будет массив - никакого перечня через запятую там нет, это "набор" чисел.
1. Выделять листы внутри цикла - лишняя трата сил и времени. 2. Если в книге будут ещё и другие листы - код выпадет в ошибку. 3. Если в книге листов будет меньше 274 - код выпадет в ошибку.
Про ReDim Statement читайте помощь - там всё написано. GroupIndex у Вас будет массив - никакого перечня через запятую там нет, это "набор" чисел.
1. Выделять листы внутри цикла - лишняя трата сил и времени. 2. Если в книге будут ещё и другие листы - код выпадет в ошибку. 3. Если в книге листов будет меньше 274 - код выпадет в ошибку.Hugo
Вот такому варианту не страшно наличие других листов: [vba]
Код
Sub УдалениеПочтиВсехЛистов() Dim sheet As Worksheet, flag As Boolean: ReDim GroupIndex(1 To 1) '1 Application.DisplayAlerts = False For Each sheet In ActiveWorkbook.Worksheets q = sheet.Index If q <= 273 Then flag = True GroupIndex(UBound(GroupIndex)) = q '2 Sheets(GroupIndex).Select ReDim Preserve GroupIndex(1 To UBound(GroupIndex) + 1): '3 End If Next If flag Then ActiveWindow.SelectedSheets.Delete Application.DisplayAlerts = True End Sub
[/vba] Выделение в цикле оставил - некогда усложнять код
Вот такому варианту не страшно наличие других листов: [vba]
Код
Sub УдалениеПочтиВсехЛистов() Dim sheet As Worksheet, flag As Boolean: ReDim GroupIndex(1 To 1) '1 Application.DisplayAlerts = False For Each sheet In ActiveWorkbook.Worksheets q = sheet.Index If q <= 273 Then flag = True GroupIndex(UBound(GroupIndex)) = q '2 Sheets(GroupIndex).Select ReDim Preserve GroupIndex(1 To UBound(GroupIndex) + 1): '3 End If Next If flag Then ActiveWindow.SelectedSheets.Delete Application.DisplayAlerts = True End Sub
[/vba] Выделение в цикле оставил - некогда усложнять код Hugo
Если в книге листов будет меньше 274 - код выпадет в ошибку.
[vba]
Код
Sub мяу() Dim arr, Sheets_count& Sheets_count = 273 If Sheets_count >= Sheets.Count Then Exit Sub ReDim arr(1 To Sheets_count) For i = 1 To UBound(arr) arr(i) = i Next Application.DisplayAlerts = False Sheets(arr).Delete Application.DisplayAlerts = True End Sub
Если в книге листов будет меньше 274 - код выпадет в ошибку.
[vba]
Код
Sub мяу() Dim arr, Sheets_count& Sheets_count = 273 If Sheets_count >= Sheets.Count Then Exit Sub ReDim arr(1 To Sheets_count) For i = 1 To UBound(arr) arr(i) = i Next Application.DisplayAlerts = False Sheets(arr).Delete Application.DisplayAlerts = True End Sub
RAN, Спасибо, тоже интересный вариант. Понял некоторые ошибки. Hugo, я просто ни разу не пользовался другими листами, видимо потому и не в курсе...)
RAN, Спасибо, тоже интересный вариант. Понял некоторые ошибки. Hugo, я просто ни разу не пользовался другими листами, видимо потому и не в курсе...)Roman777