Программисты 1С любят создавать отчеты Excel, которые содержат группировку строк. С одной стороны это достаточно удобно, однако появляется ряд проблем:
- Сложно скопировать строки определенного уровня, так как при этом отображаются уровни выше.
- При копировании строк определенного уровня копируются также и скрытые уровни.
- При протягивании формул они распространяются и на скрытые уровни.
С помощью самодельной функции на VBS можно заполнить отдельный столбец, который содержит нумерацию группировки строк. А далее установить фильтр по данному столбцу или заполнить ряд дополнительных колонок.
Функция =УРОВЕНЬСТРОКИ(ЯЧЕЙКА) вернет уровень группировки строки (от 1 до в указанной ячейке.
Для того чтобы функция заработала, ее надо сначала создать! Как создать функцию в эксель:
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
03.01.06 — 23:36
Задрался… Подскажите, как определить уровень группировки строки Excel и количество уровней строк в объекте «Excel.Application»… Ничего толкового в Инете не нашел…
1 — 03.01.06 — 23:40
А таперь внятно, по русски Синим по голубому — что такое группировки строк в Экселе…
2 — 03.01.06 — 23:45
В листе Excel есть строки, которые содержат некоторое количество других строк, которые разворачиваются при нажатии на «плюсик» в начале строки-«группы». Вот я и пытаюсь узнать, как мне определить, содержит строка «внутренние строки» или нет, их количество, «уровень», количество «уровней»
3 — 03.01.06 — 23:53
поможет кусок кода…?
ушло на почту
4 — 03.01.06 — 23:59
Сенкс… Приятно пообщаться с умным челом…
5 — 04.01.06 — 00:22
Льстите, это не мое ;-(
6 — 04.01.06 — 11:07
Черт… нет нужных команд… Народ! Как все-таки узнать количество уровней, и т.д.!!!
7 — 04.01.06 — 11:19
Все есть в самом Экселе
/
Закинь пример файла Экселя с этой байдой, покопаю — скину ответ
мыло karkarde(sabaka)pisem.net
8 — 04.01.06 — 13:05
Про метод ShowLevels — параметр RowLevels (ColumnLevels) может быть от 0 до 8 — в help-ах написано, что если это параметр больше количества группировок, то будут показаны все. Для определения максимального уровня группировок — можно последовательно передавать ShowLevels параметры от 1 до 8, пока все строки (или столбцы соотв) не будут не hidden. Аналогично — можно определить уровень группировки для каждой конкретной строки или рассчитать, какие именно строки/столбцы входят в нужную группировку. Плохо только, что после такого исследования файла вид у него будет уже не первоначальный
9 — 04.01.06 — 13:20
А можно какой-нить пример?… !!!
10 — 04.01.06 — 13:23
(0) А зачем? Это же визуальное представление. С данными в ячейках же это не связано …
11 — 04.01.06 — 13:27
Я ваяю обработку по загрузке прайса поставщиков из Excel… Наименования групп товаров (группировки) у них разворачивается на подгруппы (группировки), а в подгруппах — конкретные элементы. И задача стоит — создать справочник в 1С с идентичной иерархией групп, подгрупп и элементов, как в Excel…
12 — 04.01.06 — 14:03
Универсально вряд ли что получится, разве что если расставить для каждой строки руками признак, что это такое (группа или элемент), потому что схему группировок в Excel можно придумать достаточно замысловатую, да и в 1С тоже можно группы и элементы на одном уровне располагать. Для простых случаев – можно последовательно раскрывать уровни от 1 до 8, вычислять номера появляющихся при этом строк и обрабатывать нужным образом
13 — 04.01.06 — 14:09
(11) Как это «Наименования групп товаров (группировки) у них разворачивается»? Разве имя группировки можно задать?
По-моему, ты не тем заморачиваешься … Определить, перебирая строки таблицы, группа это или элемент наверняка можно анализируя содержимое ячеек. Или у группы тоже есть цена?
14 — 04.01.06 — 14:28
Все бы хорошо (я на основе анализа содержимого ячеек и построил месяц назад первый вариант загрузки), да только хреново то, что сейчас у нас не один а четыре поставщика и анализ прайсов можно проводить только по группировке… Вот такая вот хрень……
15 — 04.01.06 — 15:17
Письмо дошло… Файла при нем нет…
.
P.S. прицепи его заархивированным в zip.
16 — 04.01.06 — 15:20
(15) http://www.1c.ru/ftp/pub/pricelst/price_1c.zip
17 — 04.01.06 — 15:31
Узнать уровень вот как (из хелпа):
Worksheets(«Sheet1»).Rows(2).OutlineLevel
А вот содержит ли он другие…
И не факт, что ежели не содержит — то это элемент, а не пустая группа.
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 предусмотрены различные функции, одной из которых является группировка. С ее помощью, как следует из названия, можно сгруппировать данные, а также, скрыть неактуальную информацию. Давайте разберемся, как это работает.
- Настраиваем параметры функции
- Группируем данные по строкам
- Группируем столбцы
- Создаем многоуровневую группировку
- Разгруппировываем данные
- Заключение
Настраиваем параметры функции
Чтобы в конечном счете получить желаемый результат, для начала следует выполнить настройки самой функции. Для этого выполняем следующие шаги:
- Переключившись во вкладку “Данные” щелкаем по кнопке “Структура” и в открывшемся перечне команд – по небольшому значку в виде стрелки, направленной по диагонали вниз.
- На экране отобразится небольшое окошко с параметрами функции. Здесь мы можем настроить отображение итогов. Ставим галочки напротив нужных опций (в т.ч. автоматические стили) и жмем кнопку OK.Примечание: расположение итоговых данных в строках под данными многим кажется неудобным, поэтому данный параметр можно выключить.
- Все готово, теперь можем перейти, непосредственно, к самой группировке данных.
Группируем данные по строкам
Для начала давайте рассмотрим, как можно сгруппировать строки:
- Вставляем новую строку над или под строками, которые хотим сгруппировать (зависит от того, какой вид расположения итогов по строкам мы выбрали). Как это сделать, читайте в нашей статье – “Как добавить новую строку в Excel“.
- В самой левой ячейке добавленной строки пишем название, которое хотим присвоить группе.
- Любым удобным способом, например, с помощью зажатой левой кнопки мыши производим выделение ячеек строк (кроме итоговой), которые требуется сгруппировать. Во вкладке “Данные” щелкаем по кнопке “Структура” и в открывшемся списке выбираем функцию “Группировать”. Щелкнуть нужно именно по значку команды, а не по ее названию. Если же нажать на последнее (со стрелкой вниз), откроется еще одно подменю, в котором следует нажать на одноименную кнопку.
- В появившемся окошке отмечаем пункт “строки” (должен быть выбран по умолчанию) и подтверждаем действие нажатием OK.Примечание: Если вместо ячеек выделить все строки целиком на вертикальной панели координат, а затем применить группировку, то промежуточного окна с выбором строки или столбца не будет, так как программа сразу понимает, что именно ей необходимо сделать.
- Группа создана, о чем свидетельствуют появившаяся на панели координат полоска со знаком “минус”. Это означает, что сгруппированные данные раскрыты. Чтобы их скрыть, нажимам по минусу или кнопке с цифрой “1” (самый верхний уровень группировки).
- Теперь строки скрыты. Чтобы их обратно раскрыть, нажимаем по значку “плюса”, который появился вместо “минуса” (или по кнопке “2”).
Группируем столбцы
Чтобы сгруппировать столбцы, придерживаемся примерно такого же алгоритма действий, описанного выше:
- Вставляем столбец справа или слева от группируемых – зависит от выбранного параметра в настройках функции. Подробнее о том, как это сделать, читайте в нашей статье – “Как вставить столбец в таблицу Эксель“.
- Пишем название в самой верхней ячейке нового столбца.
- Выделяем ячейки группируемых столбцов (за исключением добавленного) и применяем функцию группировки.
- Ставим отметку напротив варианта “столбцы” и кликам OK.Примечание: как и в случае с группировкой строк, при выделении столбцов целиком на горизонтальной панели координат, группировка данных будет выполнена сразу, минуя промежуточное окно с выбором элементов.
- Задача успешно выполнена.
Создаем многоуровневую группировку
Возможности программы позволяют выполнять как одноуровневые, так и многоуровневые группировки. Вот как это делается:
- В раскрытом состоянии главной группы, внутри которой планируется создать еще одну, выполняем действия, рассмотренные в разделах выше в зависимости от того, с чем мы работаем – со строками или столбцами.
- Таким образом, мы получили многоуровневую группировку.
Разгруппировываем данные
Когда ранее выполненная группировка столбцов или строк больше не нужна или требуется выполнить ее иначе, можно воспользоваться обратной функцией – “Разгруппировать”:
- Производим выделение сгруппированных элементов, после чего все в той же вкладке “Данные” в группе инструментов “Структура” выбираем команду “Разгруппировать”. Жмем именно по значку, а не по названию.
- В открывшемся окне ставим отметку напротив требуемого пункта (в нашем случае – “строки”) и нажимаем OK.Примечание: в случае многоуровневой группировки или наличия нескольких групп данных, каждую из них необходимо расформировать отдельно.
- Вот и все, что требовалось сделать.
Заключение
Группировка данных выполняется в несколько кликов и не требует особых навыков в работе с программой, однако, данный прием позволяет существенно сэкономить время, когда приходится иметь дело с большим объемом информации. Это делает функцию одной из самых полезных и незаменимых в Excel.