Доброго вечера, Планетяне! Помогите, пожалуйста макросом сгруппировать строки по критериям в ячейке. Критерием для диапазонов последовательной группировки является наличие "ааа_" или "яяя_" в ячейке. Я сначала хотел их в диапазон забрать как тут и сгруппировать, но это ведь отдельные диапазоны, которые и группироваться должны отдельно. На скрине показано, какой результат от макроса жду. В файле-примере - "до" и "после"
P.S.: к форматированию сознательно не привязывался (и использовал вот эти "тэги", которые впоследствии удаляю), поскольку форматирование может меняться
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Sub GroupText()
Dim lstr, i&, y&
Application.ScreenUpdating = False
ActiveSheet.Outline.ShowLevels RowLevels:=2
lstr = Cells(Rows.Count, 1).End(xlUp).Row
ReDim t(1 To lstr, 1 To 2)
For i = 5 To lstr
If Cells(i, 1) Like "ааа_*" Or Cells(i, 1) Like "яяя_*" Then
y = y + 1
t(y, 1) = Cells(i, 1): t(y, 2) = Cells(i, 2)
End If
Next
[D5].Resize(y, 2) = t
Application.ScreenUpdating = True
End Sub
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
Владимир, спасибо за ответ, но у меня не работает((( и Rows.Group я не вижу в коде - думал через него группировка происходит…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Нашёл вот такой код, но никак не могу применить у себя… Чую, что что-то очень похожее должно быть. Не получается именно определять начало и конец диапазонов для группировки.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Вы меня изначально дезинформировали. Я думал, что группировка уже существует. -------- Тогда бежим циклом, расставляем метки. Затем по этим меткам делаем группировку. Метки удаляем.
Код
Sub GroupText()
Dim lstr&, i&, lev As Range, r As Range
Application.ScreenUpdating = False
lstr = Cells(Rows.count, 1).End(xlUp).row
For i = 5 To lstr
If Cells(i, 1) Like "ааа_*" Or Cells(i, 1) Like "яяя_*" Then
Cells(i, 3) = 1
End If
Next
Set lev = Range("C5:C" & lstr).SpecialCells(xlCellTypeConstants)
For Each r In lev.SpecialCells(xlCellTypeConstants).Areas
Rows(r.row & ":" & r.row + lev.Rows.count - 1).Rows.group
Next
Columns("C:C").Clear
Application.ScreenUpdating = True
End Sub
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
Владимир, большое спасибо - всё работает))) Наверное, именно скрин ввёл в заблуждение, поскольку в файл-примере всё именно так, как вы показали - лист "как щас" и "как надо"))) Идею группировки по дополнительному столбцу понял. Теперь попробую обойтись без него (в массив какой-нибудь собирать). По результатам отпишусь сюда) Уважаемые знатоки, а что ВЫ можете сказать по поводу быстродействия? Что должно быстрее работать при большом объёме отчёта - доп. столбец или что-то другое?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Макрос (финальный) с Union и макрос от Владимира - в этой книге
Группировка диапазонов через Union
Код
Sub UnionGroup()
Dim iCell As Range, группировка As Range, группа As Range
Dim lastrow&
lastrow = Cells(Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
For Each iCell In Range("A1:A" & lastrow)
If iCell Like "ааа_*" Or iCell Like "яяя_*" Then
If группировка Is Nothing Then
Set группировка = UNION(iCell, iCell)
Else
Set группировка = UNION(группировка, iCell)
End If
End If
Next
If Not группировка Is Nothing Then
For Each группа In группировка.Areas
Rows(группа.Row & ":" & группа.Row + группа.Rows.Count - 1).Rows.Group
Next
End If
Application.ScreenUpdating = True
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄