Excel vba группировать строки

Return to VBA Code Examples

This tutorial will demonstrate how to group and ungroup rows and columns in VBA.

Group Rows or Columns

To group rows or columns apply the Group Method to the rows or columns:

Rows("3:5").Group

or

Columns("C:D").Group

Ungroup Rows or Columns

To ungroup the rows or columns, simply use the Ungroup Method:

Rows("3:5").Ungroup

or

Columns("C:D").Ungroup

Expand All “Grouped” Outline Levels

To expand all grouped outline levels, use this line of code:

ActiveSheet.Outline.ShowLevels RowLevels:=8, ColumnLevels:=8

To collapse all outline levels, use this line of code:

ActiveSheet.Outline.ShowLevels RowLevels:=1, ColumnLevels:=1

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

0 / 0 / 0

Регистрация: 25.04.2006

Сообщений: 5

1

25.04.2006, 19:11. Показов 56908. Ответов 25


Студворк — интернет-сервис помощи студентам

Помогите, пожалуйста, я так устала вручную группировать строки. Как написать макрос, чтобы в таблице EXCEL строки автоматом группировались по одинаковым названиям в первом столбце. Т.е. сбоку слева появлялся «плюсик» и можно было группу свернуть или развернуть.

В первом столбце названия групп повторяются, а во втором столбце уже идут точные названия, т.е. в первом столбце ткань, а во втором м.б. и драп и ситец. Я хочу сделать группу по первому столбцу ткань.



0



3 / 3 / 0

Регистрация: 08.09.2011

Сообщений: 111

25.04.2006, 20:27

2

А нужен ли макрос, если есть встроенный инструмент?
Data -> Subtotals… далее по инструкции….



0



0 / 0 / 0

Регистрация: 25.04.2006

Сообщений: 5

25.04.2006, 20:37

 [ТС]

3

Спасибо буду искать, что это такое Если у ВАс есть возможность можно чуть подробнее…



0



3 / 3 / 0

Регистрация: 08.09.2011

Сообщений: 111

25.04.2006, 20:53

4

По-русски это называется консолидация…
Вот здесь можно почитать:

http://www.firststeps.ru/
— MS Office
— Шаг 65 — Попробуем консолидацию



0



5 / 5 / 3

Регистрация: 17.10.2007

Сообщений: 1,119

25.04.2006, 21:03

5

lullul,

Vi mozhete poprobovat’ sovet Tsveta. Vot vam esche odin: idite v menu [bold]Data/Pivot Table[/bold] …
V techenie 20 sekund sdelal vashu zadachu metodom Drag and Drop…

vladconn



0



0 / 0 / 0

Регистрация: 25.04.2006

Сообщений: 5

25.04.2006, 21:34

 [ТС]

6

Про консолидацию прочитала спасибо, но мне не надо сумировать и т.д. Мне надо просто огромную таблицу привести в более сжатый вид. Одинаковые позиции по первому столбцу сгруппировать так, чтобы сбоку слева появлялся «плюсик» и можно было группу свернуть или развернуть. Чтобы клиент мог сначала выбрать нужную группу в списке и только затем с помощью плюсика её развернуть и искать подробнее что ему надо.

Я это обычно делаю в ручную с помощью меню Данные-группа и структура-группировать. Очень хочу эту процедуру автоматизировать



0



5 / 5 / 3

Регистрация: 17.10.2007

Сообщений: 1,119

25.04.2006, 22:01

7

lullul,

Esche variant:

MSHFLEXGRID i OLEDB data control!

MSHFLEXGRID kak raz dlya vashej zadachi.

vladconn



0



0 / 0 / 0

Регистрация: 25.04.2006

Сообщений: 5

25.04.2006, 22:20

 [ТС]

8

Всем спасибо, буду стараться



0



VladConn

5 / 5 / 3

Регистрация: 17.10.2007

Сообщений: 1,119

25.04.2006, 22:23

9

A, chto-to vrode etogo:

Visual Basic
1
2
3
4
5
6
7
8
Sub Macro1()
 
    Range("A2:C5").Select 'tkan', vid tkani, kol-vo
    Selection.Rows.Group
    Range("A7:C9").Select 'Kamen', nazvanie kamnya, kol-vo
    Selection.Rows.Group
 
End Sub

vladconn



0



Masalov

22 / 5 / 1

Регистрация: 05.09.2010

Сообщений: 370

26.04.2006, 10:41

10

Выделить ту часть листа где необходима массовая группировка и выполнить макрос:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub Группировка()
  ' вначале выдели строки для массовой группировки
  x = 1 ' номер колонки
  Dim rng As Range
  Set rng = Selection.EntireRow
  y = rng.Row
  yend = y + rng.Rows.Count - 1
  mes = "Выполнить массовую группировку" & vbCr & _
      "со строки " & y & " по строку " & yend & "?"
  If MsgBox(mes, vbQuestion + vbOKCancel, "") = vbCancel Then End
  ybeg = y
  ActiveSheet.Outline.SummaryRow = xlAbove
  For y = y To yend
    If Cells(y, x) <> Cells(y + 1, x) _
    Or y = yend Then
      If ybeg + 1 <= y Then Rows(ybeg + 1 & ":" & y).Rows.Group
      ybeg = y + 1
    End If
  Next
  MsgBox "Готово", vbInformation, ""
End Sub



0



rank1

30.04.2006, 23:30

11

У меня тут возникла сходная задачка — нужно было в зависимости от уровня группы в колонке группировать строки. Первое что пришло в голову:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Option Explicit
Sub grp() 'Группировка
 On Error GoTo errH
 Dim h: Set h = New Scripting.dictionary
 Dim x As Range
 Set x = Selection.EntireColumn.Cells.SpecialCells(xlCellTypeConstants)
    Dim i As Long, j As Long, c As Range
    For i = 1 To 10
      For Each c In x.Cells
         c.Select
         For j = i To 10
            DoEvents
            If c.Value = j Then
                 If IsEmpty(h(i)) Then
                    Set h(i) = c
                 Else
                    Set h(i) = Union(h(i), c)
                 End If
            End If
         Next j
      Next c
    Next i
 Dim k
 Dim a As Range
 For Each k In h.Keys
  For Each a In h(k).Areas
   DoEvents
   a.Rows.Group
  Next a
 Next k
 If 0 Then
errH:
   MsgBox Err.Description
 End If
 Set h = Nothing
End Sub
Sub ugp() 'Разгруппировка
On Error Resume Next
   Rows.Ungroup
   Rows.Ungroup
   Rows.Ungroup
   Rows.Ungroup
   Rows.Ungroup
   Rows.Ungroup
   Rows.Ungroup
   Rows.Ungroup
End Sub

rank1

30.04.2006, 23:31

12

Для работы необходимо подключить scrrun.dll — для Dictionary

rank1

30.04.2006, 23:33

13

…и курсор должен стоять в той колонке где уровни вложенности указаны.

Сумрак

01.05.2006, 22:11

14

Сначала отсортировать придется для группировки…

22 / 5 / 1

Регистрация: 05.09.2010

Сообщений: 370

02.05.2006, 11:11

15

Здесь еще пример группировки, но по номерам параграфа…

http://relib.com/forums/Topic846792-11-1.aspx



0



0 / 0 / 0

Регистрация: 21.02.2014

Сообщений: 14

21.02.2014, 15:24

16

Доброго дня! Мне нужен макрос чтобы из разноцветных строк группировал только бесцветные. Кто-нибудь может мне помочь в этом.



0



15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

21.02.2014, 15:31

17

Артем 1981, приложите пример.



1



0 / 0 / 0

Регистрация: 21.02.2014

Сообщений: 14

03.04.2014, 12:50

18

Приложил пример (2 вкладки). Макрос должен делать из таблицы во вкладке «до», таблицу такую как во вкладке «после», то есть группировать только строки без выделения цветом.



0



15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

03.04.2014, 13:41

19

Артем 1981, почему группировка «вниз»? Строки 8,9 вроде относятся к 7?



0



0 / 0 / 0

Регистрация: 21.02.2014

Сообщений: 14

03.04.2014, 14:48

20

Да совершенно верно п.8,9 относятся к п.7, это у меня просто настройка такая.



0



 

Snaff

Пользователь

Сообщений: 8
Регистрация: 29.05.2017

Доброго времени суток.

Столкнулся со следующей задачей: требуется с помощью макроса сгруппировать строки в обновляемой сводной таблице.
Количество строк постоянно меняется, группы всегда 3 (группа 1, группа 2, без группы).
Хочется применить именно структуру. Группировка самой сводной таблицы («+») не подходит.

Честно изучил много вопросов по данной теме. Ответа, к сожалению, самостоятельно не нашёл.
Пример прикладываю.

 

Дорожный

Пользователь

Сообщений: 78
Регистрация: 17.03.2017

Так вам нужны итоги по группам или группировка строк по группам?

 

gling

Пользователь

Сообщений: 4024
Регистрация: 01.01.1970

#3

29.05.2017 12:30:12

Цитата
Snaff написал:
Хочется применить именно структуру

Так что группировка с промежуточными итогами не устраивает? Она же получается точно такая как и на листе «Как нужно видеть». На листе «Исходные данные» данные сделал пром итоги (На ленте Данные—Структура—Промежуточные итоги)

Прикрепленные файлы

  • Пример группировки.xlsm (16.25 КБ)

Изменено: gling29.05.2017 12:30:43

 

Snaff

Пользователь

Сообщений: 8
Регистрация: 29.05.2017

Дорожный, Группировка строк по группам.
Итоги по группах мне уже даёт сводная таблица.

Технически вручную это выглядит так: я выделяю строки с каждой группой и группирую через Данные-Группировка.

Изменено: Snaff29.05.2017 12:39:33

 

Snaff

Пользователь

Сообщений: 8
Регистрация: 29.05.2017

gling, спасибо за ответ.

Нужно решение в виде макроса vba.
Технически, опять же, я вижу порядок действий такой:

— Поиск строк о значением «1 группа»
— Выделение этих строк
— группировка

— Поиск строк о значением «2 группа»
— Выделение этих строк
— группировка

— Поиск строк о значением «Без группы»
— Выделение этих строк
— группировка

 

gling

Пользователь

Сообщений: 4024
Регистрация: 01.01.1970

#6

29.05.2017 12:54:54

Цитата
Snaff написал:
Нужно решение в виде макроса vba.

Включите запись макроса макрорекордером —Выделите весь диапазон — сортировка по столбцу А— На вкладке данные, структура—ПромИтоги—Выключайте запись макроса. При необходимости подкорректируйте, в плане диапазона (постоянный или выделенный) и вешайте на кнопку. Не так формируется? У меня получилось так

Код
Sub Макрос1()
'
' Макрос2 Макрос
'

'
    Range("A1:C10").Select
    ActiveWorkbook.Worksheets("Исходные данные").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Исходные данные").Sort.SortFields.Add Key:=Range( _
        "A2:A10"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Исходные данные").Sort
        .SetRange Range("A1:C10")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(3), _
        Replace:=True, PageBreaks:=False, SummaryBelowData:=True
End Sub

Изменено: gling29.05.2017 12:58:54

 

Snaff

Пользователь

Сообщений: 8
Регистрация: 29.05.2017

gling, спасибо большое за ответ.

Данное решение не подходит, так как требуется сгруппировать строки ИМЕННО в сводной таблице, как было указано в моём первом сообщении.
Вкладка «исходные данные» носит справочный характер и к задаче относится косвенно.

 

gling

Пользователь

Сообщений: 4024
Регистрация: 01.01.1970

#8

29.05.2017 13:29:36

Цитата
Snaff написал:
ИМЕННО в сводной таблице,

Раз так, тогда пробуйте макрос

Код
Sub Группировка()
Dim i As Long, Rw As Long
With Sheets("Сводная")
Rw = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To Rw
If .Cells(i, 1) = .Cells(i + 1, 1) Or .Cells(i, 1) = .Cells(i - 1, 1) Then Rows(i).Rows.Group
Next
End With
End Sub

Прикрепленные файлы

  • Пример группировки.xlsm (24.25 КБ)

 

Snaff

Пользователь

Сообщений: 8
Регистрация: 29.05.2017

gling, спасибо Вам большое.

Макрос работает прекрасно.

 

Snaff

Пользователь

Сообщений: 8
Регистрация: 29.05.2017

gling, а в случае если в одной группе всего один артикул.
Он при этом пропускает данную группу. Как можно решить данный момент?

Пример прикладываю.

 

gling

Пользователь

Сообщений: 4024
Регистрация: 01.01.1970

#11

29.05.2017 19:38:00

Может тогда такой подойдет?

Код
Sub Группировка()
Dim i As Long, Rw As Long
With Sheets("Сводная")
Rw = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To Rw
If Application.CountIf(.Cells(i, 1), "*Итог*") = 0 Then Rows(i).Rows.Group
Next
End With
End Sub
 

Snaff

Пользователь

Сообщений: 8
Регистрация: 29.05.2017

gling, спасибо Вам большое за помощь.
Вынужден в очередной раз обратиться.

В случае, если мы также будем иметь в исходных данных помимо группы, еще и категорию.
Требуется группировать категории вторым уровнем структуры. Каким образом это можно осуществить?

Пример прикладываю.

 

4ynaka6pa

Пользователь

Сообщений: 1
Регистрация: 08.04.2020

#13

08.04.2020 10:16:33

не пойму почему макрос отказывается определять итоговые строчки по текстовым значением большого объема.
подскажите пожалуйста где я ошибаюсь

Dim i As Boolean, Rw As Boolean
With Sheets(«Лист1»)
Rw = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To Rw
If .Cells(i, 1) = .Cells(i + 1, 1) Or .Cells(i, 1) = .Cells(i — 1, 1) Then Rows(i).Rows.Group
Next
End With
End Sub

Доброго времени суток дорогие посетители.

Тема сегодня будет не совсем самобытная и не большая. Я тут как то публиковал пост о том как группировать строки в Microsoft Excel вот здесь: http://profi-user.ru/gruppirivka-v-excel. Но там я забыл об одном очень важном моменте, не упомянул, о том что группировку можно выполнять автоматически. Я думаю нужно исправить этот пробел, в данной теме. Приступим.

Автоматизация с помощью кодов

Пора учиться использовать Excel по назначению в полной мере. Табличный редактор дает возможность автоматизировать повторяющиеся задачи, чтобы вы не делали одно и то же каждый раз.

Для этого используется программный язык Visual Basic. В нашем случае он позволит группировать и сразу сворачивать строки.

Это функция в Excel называется VBA группировка строк. Выполняется с помощью такого кода:

Чтобы его записать, необходимо во вкладке «Вид» нажать на кнопку «Макрос» и выбрать «Записать макроса».

Сделать это также можно через вкладку «Разработчик». Но, как правило, она не предусмотрена в меню по умолчанию, поэтому при желании добавьте ее вручную:

  • Откройте Файл — Параметры — Настройка ленты;
  • В группе «Основные вкладки» поставьте галочку возле той, что нам нужна, и нажмите «Ок».

В принципе всё, теперь нужно просто нажать на макрос два раза и мы видим как в нашем документе появились нужные нам группы, которые можно сворачивать и разворачивать:

Цифры значений

With Rows («2:5»)

.Rows (3)

Естественно выберите такие какие вам нужно.

На этом всё.

До встречи дорогие друзья, сохраняйте ссылку на этот сайт в закладки.

Понравилась статья? Поделить с друзьями:
  • Excel vba границы таблицы
  • Excel vba границы листа
  • Excel vba глобальный массив
  • Excel vba вставить картинку в word
  • Excel vba вставить диапазон в ячейку