Определить уровень группировки excel

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

  1. Сложно скопировать строки определенного уровня, так как при этом отображаются уровни выше.
  2. При копировании строк определенного уровня копируются также и скрытые уровни.
  3. При протягивании формул они распространяются и на скрытые уровни.

С помощью самодельной функции на VBS можно заполнить отдельный столбец, который содержит нумерацию группировки строк. А далее установить фильтр по данному столбцу или заполнить ряд дополнительных колонок.

Функция =УРОВЕНЬСТРОКИ(ЯЧЕЙКА) вернет уровень группировки строки (от 1 до 8)  в указанной ячейке.

Для того чтобы функция заработала, ее надо сначала создать! Как создать функцию в эксель:

1. Открыть файл в эксель и перейти в меню Вид-Макросы

2. Добавить макрос под любым именем.

3. В тело добавить функцию

Function УРОВЕНЬСТРОКИ(ЯЧЕЙКА As Range) As Long
    УРОВЕНЬСТРОКИ = ЯЧЕЙКА.Rows(1).OutlineLevel
End Function

4. Готово. Можно использовать имя функции в ячейке, подобно любым другим, например таким как «=СУММ(…».

5. Использование функции в ячейке файла:

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

behemoth

Сообщения:2
Зарегистрирован:26 окт 2007, 11:32

Добрый день.

Лист Excel.
С помощью команды «Данные»-«Группа и структура»-«Группировать», строки сгруппированы в несколько вложенных уровней. То есть, ячейка в каждом столбце может принадлежать разным уровням группировки. Подскажите, пожалуйста, какая структура (какое свойство) отвечает за принадлежность к уровню группировки. Требуется производить различные действия над данными в ячейке, в зависимости от уровня.

tolikt

Сообщения:93
Зарегистрирован:29 окт 2005, 12:33
Откуда:NewVasюbirsk

22 ноя 2007, 19:19

Типа такое
ActiveSheet.Rows(ActiveCell.Row).OutlineLevel

Бегемот, если сам давно это нашёл, то на форумах принято и своё решение сообщать.

ljuter

Сообщения:2
Зарегистрирован:05 июл 2009, 23:50

05 июл 2009, 23:55

А как узнать максимальный уровень группировки без перебора строк?

Аватара пользователя

mc-black

Сообщения:245
Зарегистрирован:08 май 2008, 16:09
Откуда:Россия, Нижний Новгород
Контактная информация:

06 июл 2009, 14:25

Смотрите справку по Outline Object. А вообще, что, строк слишком много? Можно проверить строки и столбцы на всем листе довольно-таки быстро.

ljuter

Сообщения:2
Зарегистрирован:05 июл 2009, 23:50

06 июл 2009, 15:06

Строк более 3 тыс. Проход по строкам занимает 1-2 минуты. Справку смотрел, но такой функции не нашел, поэтому и обратился за помощью на форум.

Аватара пользователя

Aent

Сообщения:1108
Зарегистрирован:01 окт 2006, 14:52
Откуда:Saratov,Russia
Контактная информация:

06 июл 2009, 16:28

Получить максимальный уровень группировки можно сняв её:

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

Dim i As Integer
i = 1
Application.ScreenUpdating = False
On Error resume next
Do
    Rows.Ungroup
    if err.number <> 0 then exit do
    i = i + 1
Loop
Application.ScreenUpdating = True
MsgBox "MaxOtlinelevel: " & str(i)

Файл можно предварительно сохранить ;)

Как вариант:
Определите имя MyLEVEL как =ПОЛУЧИТЬ.ЯЧЕЙКУ(28;A1)
(Это функция EXCEL4. Непосредственно использовать её на листе нельзя.)
Затем, поместите используя протяжку значений в ячейки некоего столбца формулу
=MyLEVEL
После этого максимальный уровень группирования получается с помощью функции листа
МАКС, применённой к этому столбцу

Андрей Энтелис,
aentelis.livejournal.com

   Sam

03.01.06 — 23:36

Задрался… Подскажите, как определить уровень группировки строки Excel и количество уровней строк в объекте «Excel.Application»… Ничего толкового в Инете не нашел…

   pit

1 — 03.01.06 — 23:40

А таперь внятно, по русски Синим по голубому — что такое группировки строк в Экселе…

   Sam

2 — 03.01.06 — 23:45

;-) В листе Excel есть строки, которые содержат некоторое количество других строк, которые разворачиваются при нажатии на «плюсик» в начале строки-«группы». Вот я и пытаюсь узнать, как мне определить, содержит строка «внутренние строки» или нет, их количество, «уровень», количество «уровней»

   Чучундер

3 — 03.01.06 — 23:53

поможет кусок кода…?
ушло на почту

   Sam

4 — 03.01.06 — 23:59

Сенкс… ;-) Приятно пообщаться с умным челом… ;-)

   Чучундер

5 — 04.01.06 — 00:22

Льстите, это не мое ;-(

   Sam

6 — 04.01.06 — 11:07

Черт… нет нужных команд… Народ! Как все-таки узнать количество уровней, и т.д.!!!

   pit

7 — 04.01.06 — 11:19

Все есть в самом Экселе
/
Закинь пример файла Экселя с этой байдой, покопаю — скину ответ
мыло karkarde(sabaka)pisem.net

   Natalia

8 — 04.01.06 — 13:05

Про метод ShowLevels — параметр RowLevels (ColumnLevels) может быть от 0 до 8 — в help-ах написано, что если это параметр больше количества группировок, то будут показаны все. Для определения максимального уровня группировок — можно последовательно передавать ShowLevels параметры от 1 до 8, пока все строки (или столбцы соотв) не будут не hidden. Аналогично — можно определить уровень группировки для каждой конкретной строки или рассчитать, какие именно строки/столбцы входят в нужную группировку. Плохо только, что после такого исследования файла вид у него будет уже не первоначальный :)

   Sam

9 — 04.01.06 — 13:20

А можно какой-нить пример?… !!!

   Дурочка 1С ®

10 — 04.01.06 — 13:23

(0) А зачем? Это же визуальное представление. С данными в ячейках же это не связано …

   Sam

11 — 04.01.06 — 13:27

Я ваяю обработку по загрузке прайса поставщиков из Excel… Наименования групп товаров (группировки) у них разворачивается на подгруппы (группировки), а в подгруппах — конкретные элементы. И задача стоит — создать справочник в 1С с идентичной иерархией групп, подгрупп и элементов, как в Excel…

   Natalia

12 — 04.01.06 — 14:03

Универсально вряд ли что получится, разве что если расставить для каждой строки руками признак, что это такое (группа или элемент), потому что схему группировок в Excel можно придумать достаточно замысловатую, да и в 1С тоже можно группы и элементы на одном уровне располагать. Для простых случаев – можно последовательно раскрывать уровни от 1 до 8, вычислять номера появляющихся при этом строк и обрабатывать нужным образом

   Дурочка 1С ®

13 — 04.01.06 — 14:09

(11) Как это «Наименования групп товаров (группировки) у них разворачивается»? Разве имя группировки можно задать?
По-моему, ты не тем заморачиваешься … Определить, перебирая строки таблицы, группа это или элемент наверняка можно анализируя содержимое ячеек. Или у группы тоже есть цена?

   Sam

14 — 04.01.06 — 14:28

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

   pit

15 — 04.01.06 — 15:17

Письмо дошло… Файла при нем нет…
.
P.S. прицепи его заархивированным в zip.

   Дурочка 1С ®

16 — 04.01.06 — 15:20

(15) http://www.1c.ru/ftp/pub/pricelst/price_1c.zip

   lebedj

17 — 04.01.06 — 15:31

Узнать уровень вот как (из хелпа):
Worksheets(«Sheet1»).Rows(2).OutlineLevel
А вот содержит ли он другие…
И не факт, что ежели не содержит — то это элемент, а не пустая группа.

   pit

18 — 04.01.06 — 16:49

Сходу не могу воткнуться. Надо покопаться с объектами….
но по хелпу похоже, что можно достать все…

17 — Сенкс!!! А из какого-такого Helpа инфа?

I have the exact same situation where I want to get a proper usage of the outline level that has been outputted from my application. Then, you need to make a visual basic script in Excel. The vb-script editor can be reached through the Macro editor. A typical code that inserts an additional 2nd column that will contain the level and then goes through a file and fills the column with the correct level can look like this:

Sub GetOutlineLevel()
' Initiate where to start. With a header row, typical start is row 2
  RowCount = 2

' Insert a new column B, write "Level" as the title in row 1, 
' and define the width of the column  
  Columns("B:B").Select
  Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
  Cells(1, 2).Value = "Level"
  Columns("B:B").Select
  Selection.ColumnWidth = 5

' Go to the first row you want to analyze
  Cells(RowCount, 1).Activate

' Make a loop to go through all lines that contains data.
' This assumes that there is a continuous row of lines that all have data in the
' first column  
  Do
' Fill the cell in column 2 at the current row with the outline level
    Cells(RowCount, 2).Value = ActiveCell.Rows.OutlineLevel
' Go to the next row
    RowCount = RowCount + 1
    Cells(RowCount, 1).Activate
' Continue and stop at the first empty row
  Loop Until ActiveCell.Value = ""
End Sub

This can then also be extended with other functionality. I kept track of the highest outline level in the loop above, and made as many additional columns as there were levels and then made some logic in each of these columns so that the level structure could be visualilzed.

The insertion of columns looked like this (this included a conditional formatting setting that made cells containing an «X» black):

  ColumnsInserted = 0
  Do
    Columns("C:C").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Cells(1, 3).Value = "L" & MaxLevel - ColumnsInserted
    Columns("C:C").Select
    Selection.ColumnWidth = 4
    Columns("C:C").Select
    Selection.FormatConditions.Add Type:=xlTextString, String:="X", _
        TextOperator:=xlContains
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False

    ColumnsInserted = ColumnsInserted + 1
  Loop Until ColumnsInserted = MaxLevel

And finally a double looped sequence that filled all the cells in the additional columns with a check against the Level-column and put an «X» in the correct cell. This code looked like this:

  FIns = 1
  Do
    RowCount = 2
    Do
      Cells(RowCount, 2 + FIns).Select
      ActiveCell.FormulaR1C1 = "=IF(RC[-" & FIns & "]=" & FIns & ",""X"","""")"
      RowCount = RowCount + 1
    Loop Until Cells(RowCount, 1).Value = ""
    FormulaInsert = FormulaInsert + 1
  Loop Until FormulaInsert > MaxLevel

I see that the nice indentation of the code above is ruined in the final post, but if you are familiar with some coding, you should be able to get that sorted out in a good way.

При обработке большого объема данных довольно часто требуется их упорядочивание. Специально для этого в программе Excel предусмотрены различные функции, одной из которых является группировка. С ее помощью, как следует из названия, можно сгруппировать данные, а также, скрыть неактуальную информацию. Давайте разберемся, как это работает.

  • Настраиваем параметры функции

  • Группируем данные по строкам

  • Группируем столбцы

  • Создаем многоуровневую группировку

  • Разгруппировываем данные

  • Заключение

Настраиваем параметры функции

Чтобы в конечном счете получить желаемый результат, для начала следует выполнить настройки самой функции. Для этого выполняем следующие шаги:

  1. Переключившись во вкладку “Данные” щелкаем по кнопке “Структура” и в открывшемся перечне команд – по небольшому значку в виде стрелки, направленной по диагонали вниз.Переход к параметрам функции Группировка в Эксель
  2. На экране отобразится небольшое окошко с параметрами функции. Здесь мы можем настроить отображение итогов. Ставим галочки напротив нужных опций (в т.ч. автоматические стили) и жмем кнопку OK.Настройка параметров функции Группировать в ExcelПримечание: расположение итоговых данных в строках под данными многим кажется неудобным, поэтому данный параметр можно выключить.
  3. Все готово, теперь можем перейти, непосредственно, к самой группировке данных.

Группируем данные по строкам

Для начала давайте рассмотрим, как можно сгруппировать строки:

  1. Вставляем новую строку над или под строками, которые хотим сгруппировать (зависит от того, какой вид расположения итогов по строкам мы выбрали). Как это сделать, читайте в нашей статье – “Как добавить новую строку в Excel“.
  2. В самой левой ячейке добавленной строки пишем название, которое хотим присвоить группе.Имя итоговой ячейки для группировки данных в Эксель
  3. Любым удобным способом, например, с помощью зажатой левой кнопки мыши производим выделение ячеек строк (кроме итоговой), которые требуется сгруппировать. Во вкладке “Данные” щелкаем по кнопке “Структура” и в открывшемся списке выбираем функцию “Группировать”. Щелкнуть нужно именно по значку команды, а не по ее названию. Группировка выделенных строк в ЭксельЕсли же нажать на последнее (со стрелкой вниз), откроется еще одно подменю, в котором следует нажать на одноименную кнопку.Группировка выделенных строк в Excel
  4. В появившемся окошке отмечаем пункт “строки” (должен быть выбран по умолчанию) и подтверждаем действие нажатием OK.Группировка строк в ЭксельПримечание: Если вместо ячеек выделить все строки целиком на вертикальной панели координат, а затем применить группировку, то промежуточного окна с выбором строки или столбца не будет, так как программа сразу понимает, что именно ей необходимо сделать.Группировка выделенных строк в Эксель
  5. Группа создана, о чем свидетельствуют появившаяся на панели координат полоска со знаком “минус”. Это означает, что сгруппированные данные раскрыты. Чтобы их скрыть, нажимам по минусу или кнопке с цифрой “1” (самый верхний уровень группировки).Сгруппированные строки в Эксель
  6. Теперь строки скрыты. Чтобы их обратно раскрыть, нажимаем по значку “плюса”, который появился вместо “минуса” (или по кнопке “2”).Скрытые сгруппированные строки в Excel

Группируем столбцы

Чтобы сгруппировать столбцы, придерживаемся примерно такого же алгоритма действий, описанного выше:

  1. Вставляем столбец справа или слева от группируемых – зависит от выбранного параметра в настройках функции. Подробнее о том, как это сделать, читайте в нашей статье – “Как вставить столбец в таблицу Эксель“.
  2. Пишем название в самой верхней ячейке нового столбца.Имя итоговой ячейки при группировке столбцов в Эксель
  3. Выделяем ячейки группируемых столбцов (за исключением добавленного) и применяем функцию группировки.Группировка выделенных столбцов в Эксель
  4. Ставим отметку напротив варианта “столбцы” и кликам OK.Группировка столбцов в ЭксельПримечание: как и в случае с группировкой строк, при выделении столбцов целиком на горизонтальной панели координат, группировка данных будет выполнена сразу, минуя промежуточное окно с выбором элементов.Группировка выделенных столбцов в Excel
  5. Задача успешно выполнена. Сгруппированные столбцы в Эксель

Создаем многоуровневую группировку

Возможности программы позволяют выполнять как одноуровневые, так и многоуровневые группировки. Вот как это делается:

  1. В раскрытом состоянии главной группы, внутри которой планируется создать еще одну, выполняем действия, рассмотренные в разделах выше в зависимости от того, с чем мы работаем – со строками или столбцами.Создание многоуровневой группировки в Эксель
  2. Таким образом, мы получили многоуровневую группировку.Многоуровневая группировка в Excel

Разгруппировываем данные

Когда ранее выполненная группировка столбцов или строк больше не нужна или требуется выполнить ее иначе, можно воспользоваться обратной функцией – “Разгруппировать”:

  1. Производим выделение сгруппированных элементов, после чего все в той же вкладке “Данные” в группе инструментов “Структура” выбираем команду “Разгруппировать”. Жмем именно по значку, а не по названию.Разгруппировка в Эксель
  2. В открывшемся окне ставим отметку напротив требуемого пункта (в нашем случае – “строки”) и нажимаем OK.Разгруппировка в Excel Примечание: в случае многоуровневой группировки или наличия нескольких групп данных, каждую из них необходимо расформировать отдельно.
  3. Вот и все, что требовалось сделать.Разгруппированная таблица Эксель

Заключение

Группировка данных выполняется в несколько кликов и не требует особых навыков в работе с программой, однако, данный прием позволяет существенно сэкономить время, когда приходится иметь дело с большим объемом информации. Это делает функцию одной из самых полезных и незаменимых в Excel.

Like this post? Please share to your friends:
  • Определить уравнения тренда в excel
  • Определить уравнения регрессии с помощью excel
  • Определить уравнение линейной регрессии excel
  • Определить текст цвета excel
  • Определить сумму чисел расположенных выше главной диагонали excel