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!
Learn More!
Despite the age of this post, I thought I’d throw in my two cents for anyone who might stumble upon it. I hope I understand your question correctly. Here’s what I’ve gathered:
Goal: For every row in the column of interest, group rows based on a criteria.
Criteria: The only rows in the group
are those that either have no value (blank, null, empty) OR have a value AND have a neighboring cell (directly to the left) that has a value of 0. The only rows not in the group
are those that are not blank and have a neighboring cell that is not 0.
Here is some sample data:
Note: the Range
B1:B12
makeup the named rangerngList
, like the OP says they have.
Data Before Running Macro:
Data After Running Macro — Grouping Uncollapsed:
Data After Running Macro — Grouping Collapsed:
The code that handles this:
To make this code work: In the VBE (Visual Basic Editor), open the worksheet that contains the data to group (also contains the named range rngList
) and paste this code, then run the macro.
Note: The comments are added to explain certain parts in further detail, though I believe the code itself is written in a way that can explain itself (e.g. variable names are meaningful and logic makes sense).
Public Sub GroupCells()
Dim myRange As Range
Dim rowCount As Integer, currentRow As Integer
Dim firstBlankRow As Integer, lastBlankRow As Integer
Dim currentRowValue As String
Dim neighborColumnValue As String
'select range based on given named range
Set myRange = Range("rngList")
rowCount = Cells(Rows.Count, myRange.Column).End(xlUp).Row
firstBlankRow = 0
lastBlankRow = 0
'for every row in the range
For currentRow = 1 To rowCount
currentRowValue = Cells(currentRow, myRange.Column).Value
neighborColumnValue = Cells(currentRow, myRange.Column - 1).Value
If (IsEmpty(currentRowValue) Or currentRowValue = "") Then
'if cell is blank and firstBlankRow hasn't been assigned yet
If firstBlankRow = 0 Then
firstBlankRow = currentRow
End If
ElseIf Not (IsEmpty(currentRowValue) Or currentRowValue = "") Then
'if the cell is not blank and its neighbor's (to the left) value is 0,
'and firstBlankRow hasn't been assigned, then this is the firstBlankRow
'to consider for grouping
If neighborColumnValue = 0 And firstBlankRow = 0 Then
firstBlankRow = currentRow
ElseIf neighborColumnValue <> 0 And firstBlankRow <> 0 Then
'if firstBlankRow is assigned and this row has a value with a neighbor
'who isn't 0, then the cell one row above this one is to be considered
'the lastBlankRow to include in the grouping
lastBlankRow = currentRow - 1
End If
End If
'if first AND last blank rows have been assigned, then create a group
'then reset the first/lastBlankRow values to 0 and begin searching for next
'grouping
If firstBlankRow <> 0 And lastBlankRow <> 0 Then
Range(Cells(firstBlankRow, myRange.Column), Cells(lastBlankRow, myRange.Column)).EntireRow.Select
Selection.Group
firstBlankRow = 0
lastBlankRow = 0
End If
Next
End Sub
Содержание
- VBA Group Rows & Columns
- Group Rows or Columns
- Ungroup Rows or Columns
- Expand All “Grouped” Outline Levels
- VBA Coding Made Easy
- VBA Code Examples Add-in
- VBA Code Generator
- AutoMacro: VBA Add-in with Hundreds of Ready-To-Use VBA Code Examples & much more!
- What is AutoMacro?
- Programmatically group and ungroup rows or columns
- 3 Answers 3
- VBA – Select (and work with) Entire Rows & Columns
- Select Entire Rows or Columns
- Select Single Row
- Select Single Column
- Select Multiple Rows or Columns
- Select ActiveCell Row or Column
- Select Rows and Columns on Other Worksheets
- VBA Coding Made Easy
- Is Selecting Rows and Columns Necessary?
- Methods and Properties of Rows & Columns
- Delete Entire Rows or Columns
- Insert Rows or Columns
- Copy & Paste Entire Rows or Columns
- Paste Into Existing Row or Column
- Insert & Paste
- Hide / Unhide Rows and Columns
- Group / UnGroup Rows and Columns
- Set Row Height or Column Width
- Autofit Row Height / Column Width
- Rows and Columns on Other Worksheets or Workbooks
- Get Active Row or Column
- VBA Code Examples Add-in
- Excel vba группировка строк
- Многоуровневая группировка строк
- Grouping Rows in VBA
- Сводные таблицы Excel
- Excel vba группировка строк
- Таблица «Функции работы со строками»
- Следующие три функции позволяют работать с массивом строк
- И последние две функции генерируют строки символов
- Пример
- Технология выполнения
- Excel vba группировка строк
VBA Group Rows & Columns
In this Article
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:
Ungroup Rows or Columns
To ungroup the rows or columns, simply use the Ungroup Method:
Expand All “Grouped” Outline Levels
To expand all grouped outline levels, use this line of code:
To collapse all outline levels, use this line of code:
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 Code Examples Add-in
Easily access all of the code examples found on our site.
Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.
(No installation required!)
VBA Code Generator
AutoMacro: VBA Add-in with Hundreds of Ready-To-Use VBA Code Examples & much more!
What is AutoMacro?
AutoMacro is an add-in for VBA that installs directly into the Visual Basic Editor. It comes loaded with code generators, an extensive code library, the ability to create your own code library, and many other time-saving tools and utilities that add much needed functionality to the outdated VBA Editor.
Источник
Programmatically group and ungroup rows or columns
Is there a way to programmatically group / ungroup columns or rows in Excel 2010?
- the «manual» command is in Data > Outline > Group / Ungroup
- in excel 2003, this used to work: someSheet.columns(i).ShowDetail = True / False but it does not work any longer in 2010 for groups (only for pivot tables and subtotals groupings)
- recording a macro does not produce any code that I could use
More precisely, calling myRange.ShowDetail = True in Excel 2010 does expand a collapsed group, but raises an error if the group is already expanded. And the ShowDetail property returns True, whether the group is expanded or not.
3 Answers 3
In Excel 2010, the ShowDetail property always return true for a group, whether it is collapsed or expanded. The Hidden property can be used instead:
Regarding rows not in pivot tables . It has NOT been my experience in Excel 2010 that ShowDetail ALWAYS evaluates to True. I thought it did but I didn’t realize that I needed to be on the summary row for this property to work as expected. Second of all, I didn’t realize the summary row by default is UNDER the grouped rows. Testing for collapsed/expanded became much clearer once I changed that setting to have the summary row above the grouped rows (in the Ribbon: Data > Outline, Show the Outline Dlg Box).
If my selected cell is on the summary row, the ShowDetail evalutes to True if the grouped records are showing, and to False if they are not. The key for me was being on the summary row to see that behavior work this way. Having the child/grouped rows above by default really threw me.
Here’s my macro, which dynamically expands and collapses the grouped records tied to the summary row when I select a cell on a summary row. And, it makes my cell in column A bold if the section is expanded. This macro does not run if I’ve selected more than one cell.
Note that worksheet protection prevents expanding and collapsing groups of cells. My worksheet is protected, so I unprotect the sheets to expand/collapse then reprotect them after. (A possible improvement would be for me to just unprotect/protect just the current sheet instead of all of them.)
Remember, I set my summary row to be above the grouped records. If your summary row is below the grouped records (the default) then the offset row reference must be changed to -1, like this:
Источник
VBA – Select (and work with) Entire Rows & Columns
In this Article
This tutorial will demonstrate how to select and work with entire rows or columns in VBA.
First we will cover how to select entire rows and columns, then we will demonstrate how to manipulate rows and columns.
Select Entire Rows or Columns
Select Single Row
You can select an entire row with the Rows Object like this:
Or you can use EntireRow along with the Range or Cells Objects:
You can also use the Range Object to refer specifically to a Row:
Select Single Column
Instead of the Rows Object, use the Columns Object to select columns. Here you can reference the column number 3:
or letter “C”, surrounded by quotations:
Instead of EntireRow, use EntireColumn along with the Range or Cells Objects to select entire columns:
You can also use the Range Object to refer specifically to a column:
Select Multiple Rows or Columns
Selecting multiple rows or columns works exactly the same when using EntireRow or EntireColumn:
However, when you use the Rows or Columns Objects, you must enter the row numbers or column letters in quotations:
Select ActiveCell Row or Column
To select the ActiveCell Row or Column, you can use one of these lines of code:
Select Rows and Columns on Other Worksheets
In order to select Rows or Columns on other worksheets, you must first select the worksheet.
The same goes for when selecting rows or columns in other workbooks.
Note: You must Activate the desired workbook. Unlike the Sheets Object, the Workbook Object does not have a Select Method.
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!
Is Selecting Rows and Columns Necessary?
However, it’s (almost?) never necessary to actually select Rows or Columns. You don’t need to select a Row or Column in order to interact with them. Instead, you can apply Methods or Properties directly to the Rows or Columns. The next several sections will demonstrate different Methods and Properties that can be applied.
You can use any method listed above to refer to Rows or Columns.
Methods and Properties of Rows & Columns
Delete Entire Rows or Columns
To delete rows or columns, use the Delete Method:
Insert Rows or Columns
Use the Insert Method to insert rows or columns:
Copy & Paste Entire Rows or Columns
Paste Into Existing Row or Column
When copying and pasting entire rows or columns you need to decide if you want to paste over an existing row / column or if you want to insert a new row / column to paste your data.
These first examples will copy and paste over an existing row or column:
Insert & Paste
These next examples will paste into a newly inserted row or column.
This will copy row 1 and insert it into row 5, shifting the existing rows down:
This will copy column C and insert it into column E, shifting the existing columns to the right:
Hide / Unhide Rows and Columns
To hide rows or columns set their Hidden Properties to True. Use False to hide the rows or columns:
Group / UnGroup Rows and Columns
If you want to Group rows (or columns) use code like this:
To remove the grouping use this code:
This will expand all “grouped” outline levels:
and this will collapse all outline levels:
Set Row Height or Column Width
To set the column width use this line of code:
To set the row height use this line of code:
Autofit Row Height / Column Width
To Autofit a row:
Rows and Columns on Other Worksheets or Workbooks
To interact with rows and columns on other worksheets, you must define the Sheets Object:
Similarly, to interact with rows and columns in other workbooks, you must also define the Workbook Object:
Get Active Row or Column
To get the active row or column, you can use the Row and Column Properties of the ActiveCell Object.
This also works with the Range Object:
VBA Code Examples Add-in
Easily access all of the code examples found on our site.
Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.
Источник
Excel vba группировка строк
Многоуровневая группировка строк
Если у вас имеется большая и сложная таблица на небольшом мониторе (например, ноутбука), то в процессе работы с ней часто возникает желание скрыть часть ненужных в текущий момент данных (строк или столбцов). Основные способы для решения этой проблемы — скрытие строк и группировка. Вот о последнем способе и пойдет речь далее.
Предположим, что мы работаем вот с такой сложной многоуровневой таблицей с данными:
Обратите внимание на то, что в таблице ясно и четко прослеживаются вложенные друг в друга уровни данных. Такую структуру часто можно увидеть в:
- бюджетировании — статьи доходов/расходов группируются в блоки (cost centers) или по географическому признаку (страна-край-город)
- управлении проектами — этапы проектов разбиты обычно на более мелкие подзадачи и действия
- строительных сметах — похожим образом обычно расписываются расчеты расхода материалов и их стоимости при строительстве
- и т.д. — дальше придумайте сами.
Делать такую группировку вручную весьма мучительно, вследствие неудобности и ограниченности средств группировки самого Excel. Поэтому, столкнувшись как-то с подобной задачей в одном из своих проектов, я написал макрос для автоматической группировки подобных списков, которым и хочу тут поделиться. Чтобы применить его к вашему списку, проделайте следующие действия:
Нажмите сочетание клавиш ALT+F11, чтобы открыть редактор Visual Basic. В нем выберите в меню команду Insert — Module, чтобы вставить новый модуль и скопируйте туда текст макроса:
При необходимости, текст можно слегка подкорректировать под ваши особенности, а именно изменить:
- FIRST_ROW — номер первой строки списка, начиная с которой пойдет группировка. Если у вас шапка не из одной строки или над таблицей есть данные — меняйте.
- FIRST_COLUMN — номер первого столбца списка, с которого начинается анализ и группировка. Если слева от вашей таблицы есть еще колонки, то эту константу также нужно изменить.
- NUMBER_OF_LEVELS — количество уровней (столбцов) для анализа. В приведенном выше примере мы хотим проанализировать три первых столбца, поэтому значение этой константы =3
Важно! Макрос предполагает, что:
- Уровни заполняются по порядку, т.е., например, уровень 3 не может быть написан, если ему не предшествовал уровень 2.
- В первом столбце списка в последней строке должно быть слово Конец, которое необходимо, чтобы макрос понял, где заканчивается список и пора остановиться:
Чтобы запустить добавленный макрос для списка на текущем листе, нажмите сочетание клавиш ALT+F8, выберите в списке наш макрос Multilevel_Group и нажмите кнопку Выполнить (Run) .
Grouping Rows in VBA
I have the code below that doesn’t seem to be working. Essentially, rngList refers to a defined name range in Excel that is about 500 rows long and every n number of rows there is text (there are approximately 32 rows out of the 500 that have text). I am trying to go to the non-blank cells (by mimicking the ctrl + down command in Excel).
I am checking to see if they are blank, and if they are I want to group that cell. If it is not blank, I want to check the cell to the left and if it is 0, I also want to group it. The code I have now is essentially trying to do this but I am receiving the error below:
Group Method of Range Class Failed
It then goes on to highlight the following line:
EDIT: Let’s say instead of grouping rows that are blank, I want to group rows that have 1 in them. That way the crtl + down will actually go to that cell rather than the last row.
Thank you very much for the help!
The code is below:
Создан 12 ноя. 12 2012-11-12 01:20:59 Max_1234
How can ‘Selection.Value = «»‘ when you’ve used ‘Selection.End(xlDown).Select’ to arrive at it? That should only happen for the very last row of the sheet. – Jamie Bull 12 ноя. 12 2012-11-12 01:46:37
Then how would I best approach this problem of grouping rows that have no entries in them? – Max_1234 12 ноя. 12 2012-11-12 01:53:58
ALso, right now the code is creating 8 different types of grouping. I just want it to all be grouped in one outline, not multiple seperate outlines. Thanks! – Max_1234 12 ноя. 12 2012-11-12 02:23:06
2 ответа
Despite the age of this post, I thought I’d throw in my two cents for anyone who might stumble upon it. I hope I understand your question correctly. Here’s what I’ve gathered:
Goal: For every row in the column of interest, group rows based on a criteria.
Criteria: The only rows in the group are those that either have no value (blank, null, empty) OR have a value AND have a neighboring cell (directly to the left) that has a value of 0. The only rows not in the group are those that are not blank and have a neighboring cell that is not 0.
Here is some sample data:
Note: the Range B1:B12 makeup the named range rngList , like the OP says they have.
Data Before Running Macro:
Data After Running Macro — Grouping Uncollapsed:
Data After Running Macro — Grouping Collapsed:
The code that handles this:
To make this code work: In the VBE (Visual Basic Editor), open the worksheet that contains the data to group (also contains the named range rngList ) and paste this code, then run the macro.
Note: The comments are added to explain certain parts in further detail, though I believe the code itself is written in a way that can explain itself (e.g. variable names are meaningful and logic makes sense).
Создан 19 фев. 13 2013-02-19 20:58:21 Sam
Сводные таблицы Excel
Зачастую данные транзакций накапливаются в таблице отчета по одной строке в день. Хотя ежедневные данные могут быть полезными для работников некоторых отраслей, большинству из них больше подходят данные, отсортированные по месяцам, кварталам либо годам.
Хорошая новость заключается в том, что в Excel 2010 группировка данных в сводных таблицах облегчена до предела. Теперь вместо загадочных формул типа =А2+1-ДЕНЬ(А2) , применяемых для преобразования ежедневных сведений в ежемесячные данные, можно обратиться к возможностям группирования Excel, выбрав произвольный уровень группировки (по месяцам, кварталам и т.д.), кпримером може служиь группировка данных по количеству смс уведомлений своих клиентов отправленных за отчетный период.
Группировка по дате в VBA выполняется довольно нестандартно. Метод .Group может применяться только к единственной ячейке сводной таблицы, а эта ячейка должна включать дату либо надпись поля Дата. Как показано на рис. 12.10, можно выбрать либо заголовок Дата, отображенный в ячейке Р2, либо одну из дат в диапазоне Р3:АРМ3 . Первый метод довольно ненадежный, особенно если сводная таблица будет создаваться в новом столбце. Два других метода более надежны.
Если вы не собираетесь использовать различное число полей строк, можете обозначить заголовок Дата, находящийся в ячейке на пересечении строки 1 и столбца 3, как TableRange2. Эта ячейка может быть выделена с помощью
следующей строки кода:
Если количество полей строк будет изменяться, добавьте комментарий, в котором упоминается, что для изменения числа полей строк следует изменить 3 на иное число. Еще один метод выделения ячейки основан на использовании свойства LabelRange для поля Дата. Следующий код всегда выбирает ячейку, содержащую заголовок поля Дата:
Для группировки ежедневных дат в даты по годам следует определить сводную таблицу, в качестве поля строки которой используется поле Дата. Для гарантированного создания сводной таблицы отключите свойство ManualCalculation.
Для поиска подписи даты воспользуйтесь свойством LabelRange. К ячейке, содержащей подпись даты, примените метод .Group. Для аргумента Periods этого метода следует определить массив, включающий семь нулевых значений. Эти семь значений соответствуют секундам, минутам, часам, дням, месяцам, кварталам и годам. Например, для группировки по годам применяется следующий код.
После выполнения группировки по годам поле по-прежнему называется Дата. В этом заключается отличие от группировки по нескольким полям. Для группировки по месяцам, кварталам и годам используется следующий код.
После выполнения группировки по месяцам, кварталам и годам в поле Дата отображаются месяцы. В сводной таблице появляется два новых виртуальных поля: Кварталы и Годы.
Для группировки по неделям выбирается период Day (День), а затем используется аргумент By для группировки по периодам, состоящим из семи дней.
Поскольку показанная на рис. 12.10 сводная таблица будет группироваться по годам, используется следующий код.
На рис. 12.11 показана сводная таблица с датами продаж, сгруппированными по годам.
Рис. 12.11. Группировка по годам выполнена с помощью метода .Group
Excel vba группировка строк
Для данных типа String существует только одна операция — конкатенация (объединение). Например, результатом операции конкатенации трех строковых значений «Петр» & » » & «Иванович» будет строка «Петр Иванович». Возможно также использование другого оператора для операции конкатенации, например: «десяти» + «тысячник». Разница между этими выражениями состоит в том, что в первом случае операндами могут быть значения любого типа (они просто будут преобразовываться в строковые), а во втором — оба операнда должны иметь тип String.
Для работы со строками существует большое количество функций (таблица. Функции работы со строками).
Таблица «Функции работы со строками»
Для сравнения строковых значений можно использовать обычные операторы сравнения числовых значений, так как при сравнении символов сравниваются их двоичные коды.
Для сравнения строковых значений также применяется оператор Like, который позволяет обнаруживать неточное совпадение, например выражение «Входной сигнал» Like «Вход*» будет иметь значение True, так как сравниваемая строка начинается со слова «Вход». Символ звездочка (*) в строке заменяет произвольное число символов. Другие символы, которые обрабатываются оператором Like в сравниваемой строке:
- ? — любой символ (один);
- #- одна цифра (0-9);
- [ ] — символ, совпадающий с одним из символов списка;
- [! ] — символ, не совпадающий ни с одним из символов списка.
Следующие три функции позволяют работать с массивом строк
- Split ( [, ]) — преобразует строку в массив подстрок. По умолчанию в качестве разделителя используется пробел. Данную функцию удобно использовать для разбиения предложения на слова. Однако можно указать в этой функции любой другой разделитель. Например, Split(3, «Это тестовое предложение») возвращает массив из трех строковых значений: «Это», «тестовое», «предложение».
- Join ( [, ]) — преобразует массив строк в одну строку с указанным разделителем.
- Filter ( , [, ] [, ]) — просматривает массив строковых значений и ищет в нем все подстроки, совпадающие с заданной строкой.
Эта функция имеет четыре аргумента:
- — искомая строка;
- — параметр (boolean значение), который указывает, будут ли возвращаемые строки включать искомую подстроку или, наоборот, возвращаться будут только те строки массива, которые не содержат искомой строки в качестве подстроки;
- — параметр, определяющий метод сравнения строк.
Еще три функции обеспечивают преобразование строк:
- LCase ( ) — преобразует все символы строки к нижнему регистру, например функция LCase(«ПОЧTA») возвращает строку «почта»;
- UCase ( ) — преобразует все символы строки к верхнему регистру;
- StrConv ( , ) — выполняет несколько типов преобразований строки в зависимости от второго параметра. Этот параметр описывается встроенными константами, например функция StrConv(«poccия», VbProperCase) возвращает значение «Россия».
И последние две функции генерируют строки символов
- Space ( ) — создает строку, состоящую из указанного числа пробелов;
- String ( , ) — создает строку, состоящую из указанного в первом аргументе числа символов. Сам символ указывается во втором аргументе.
Пример
Создать программу, работающую со строковыми переменными. Для этого создать форму, в метки которой выходят следующие сообщения:
1 метка: сообщается длина строки, введенной в первое текстовое поле (1 строка);
2 метка: преобразует все символы третьего текстового поля (3 строка) в заглавные буквы;
3 метка: выводит вместе содержание первого и второго текстовых полей (1 и 2 строки).
Хороший фреймворк (framework) лучшее решение для безпроблемной работы со строками.
Технология выполнения
- Откройте приложение Word, сохраните документ и перейдите в редактор VBA.
- Создайте форму аналогично приведенному рисунку.
- Пропишите обработчик события кнопки ОК.
- Откомпилируйте программу.
- Запустите форму на выполнение.
Форма примера в режиме конструктора и в рабочем состоянии
Excel vba группировка строк
Давно Вывожу отчеты в Excel. Захотел фичу — группировка строк.
В макросе на VBA все выглядит так:
Rows(«24:26»).Select
Range(«A26»).Activate
Selection.Rows.Group
Как из Delphi достучаться до интерфейса Selection?
Или как-то еще запустить Group?
← →
Романов Р.В. ( 2003-11-11 15:08 ) [1]
Selection это и есть Range по своей сути
← →
Малиновский Владимир ( 2003-11-11 15:16 ) [2]
Романов Р.В. © (11.11.03 15:08) [1]
Selection это и есть Range по своей сути
Ну и как, запустить Group для Range?
Подскажите чайнику, оч-чень хочется.
← →
Романов Р.В. ( 2003-11-11 15:26 ) [3]
В справке по VB написано
← →
Малиновский Владимир ( 2003-11-11 15:27 ) [4]
В VB я умею! В Delphi надо!
← →
Style ( 2003-11-11 15:31 ) [5]
uses
ActiveX, ComObj
.
var
ExcelApplication: variant;
begin
ExcelApplication := CreateOLEObject(«Excel.Application.8»);
ExcelApplication.WorkBooks.Add;
ExcelApplication.Visible := true;
ExcelApplication.Range[«A10:A20»].Select;
ExcelApplication.Range[«A10:A20»].Group;
А чего этот Group делает раз ты знаешь.
← →
Малиновский Владимир ( 2003-11-11 15:53 ) [6]
Ну, спасибо. Group — выполняет группировку данных по
строкам/столбцам.
Сделай вот так
ExcelApplication.Range[«A10:A20»].Rows.Select;
видишь, кнопка появилась, если нажать на нее — строки сворачиваются.
← →
Малиновский Владимир ( 2003-11-11 15:54 ) [7]
← →
Малиновский Владимир ( 2003-11-11 16:03 ) [8]
Да, вот еще подказали — при работе с TExcelApplication и т.п.:
Всем спасибо ! Отчеты — просто блеск!
Источник
I have a hierarchical list of items in an Excel worksheet and want to create a macro to group each row based on a cell value that gives the level of indention. The data looks like this:
Index Level Name
1 1 Assembly 1
2 2 Sub-assembly 1
3 2 Sub-assembly 2
3 3 Sub-sub-assembly 1
3 3 Sub-sub-assembly 2
4 2 Sub-assembly 3
After the macro runs, the level 2 rows would be grouped one level (i.e. the equivalent of selecting the row and pressing Alt+Shift+Right Arrow, and the level 3 rows would be grouped two levels.
asked Jan 21, 2015 at 21:51
1
Sub AutoGroupBOM()
'Define Variables
Dim StartCell As Range 'This defines the highest level of assembly, usually 1, and must be the top leftmost cell of concern for outlining, its our starting point for grouping'
Dim StartRow As Integer 'This defines the starting row to beging grouping, based on the row we define from StartCell'
Dim LevelCol As Integer 'This is the column that defines the assembly level we're basing our grouping on'
Dim LastRow As Integer 'This is the last row in the sheet that contains information we're grouping'
Dim CurrentLevel As Integer 'iterative counter'
Dim i As Integer
Dim j As Integer
Application.ScreenUpdating = False 'Turns off screen updating while running.
'Prompts user to select the starting row. It MUST be the highest level of assembly and also the top left cell of the range you want to group/outline"
Set StartCell = Application.InputBox("Select top left cell for highest assembly level", Type:=8)
StartRow = StartCell.Row
LevelCol = StartCell.Column
LastRow = ActiveSheet.UsedRange.Rows.Count
'Remove any pre-existing outlining on worksheet, or you're gonna have 99 problems and an outline ain't 1
Cells.ClearOutline
'Walk down the bom lines and group items until you reach the end of populated cells in the assembly level column
For i = StartRow To LastRow
CurrentLevel = Cells(i, LevelCol)
Rows(i).Select
For j = 1 To CurrentLevel - 1
Selection.Rows.Group
Next j
Next i
Application.ScreenUpdating = True 'Turns on screen updating when done.
End Sub
answered Jan 26, 2015 at 5:42
Adam WuerlAdam Wuerl
7951 gold badge14 silver badges27 bronze badges
I searched for a macro to group rows based on an index like that:
1
1
1
2
2
2
2
3
3
3
To do that, I used your macro and changed it a little:
Sub AutoGroupBOM(control As IRibbonControl)
'Define Variables
Dim StartCell As Range 'This defines the highest level of assembly, usually 1, and must be the top leftmost cell of concern for outlining, its our starting point for grouping'
Dim StartRow As Integer 'This defines the starting row to beging grouping, based on the row we define from StartCell'
Dim LevelCol As Integer 'This is the column that defines the assembly level we're basing our grouping on'
Dim LastRow As Integer 'This is the last row in the sheet that contains information we're grouping'
Dim CurrentLevel As Integer 'iterative counter'
Dim groupBegin, groupEnd As Integer
Dim i As Integer
Dim j As Integer
Application.ScreenUpdating = False 'Turns off screen updating while running.
'Prompts user to select the starting row. It MUST be the highest level of assembly and also the top left cell of the range you want to group/outline"
Set StartCell = Application.InputBox("Select levels' column top cell", Type:=8)
StartRow = StartCell.ROW
LevelCol = StartCell.Column
LastRow = ActiveSheet.UsedRange.End(xlDown).ROW 'empty rows above aren't included in UsedRange.rows.count => UsedRange.End
'Remove any pre-existing outlining on worksheet, or you're gonna have 99 problems and an outline ain't 1
Cells.ClearOutline
'Walk down the bom lines and group items until you reach the end of populated cells in the assembly level column
groupBegin = StartRow + 1 'For the first group
For i = StartRow + 1 To LastRow
CurrentLevel = Cells(i, LevelCol)
If Cells(i, LevelCol).Value <> Cells(i - 1, LevelCol).Value Then
groupEnd = i - 1
Rows(groupBegin & ":" & groupEnd).Select
'If is here to prevent grouping level that have only one row
If Cells(groupBegin - 1, LevelCol).Value = Cells(groupBegin, LevelCol).Value Then Selection.Rows.Group
groupBegin = i + 1 'adding one to keep the group's first row
End If
Next i
'For last group
Rows(groupBegin & ":" & LastRow).Select
Selection.Rows.Group
ActiveSheet.Outline.ShowLevels RowLevels:=1 'Minimize all the groups
ActiveSheet.Outline.SummaryRow = xlAbove 'Put "+" next to first line of each group instead of the bottom
Application.ScreenUpdating = True 'Turns on screen updating when done.
End Sub
answered May 29, 2015 at 9:04
VBA Blogs: Group Specific Rows
2 August 2019
Welcome back to the VBA blog! This week we are going to learn how to group specific rows by using VBA.
This week, we are going to create VBA script to group rows based on specific interval. It is very useful when end users want to keep specific rows visible and hide the other rows at certain interval.
Essentially, we want to group every 2 rows from row 1 to row 21 and the result would look like this:
And if we expand the collapsed rows, the result would look like this:
The first step involves declaring a variable i as integer.
Then, we use for loop to look through the number from 1 to number 21 with step 3. Step 3 would tell the code to increment the variable i value by 3 every time the loop runs. So the value of i would start from 1 and then becomes 4, 7 and 11 as the looping occurs. In the loop, we group row i and the next row by using the “Group” statement.
For i = 1 to 21 step 3
Rows(i & “:” & i+1).Group
Next i
After grouping the rows, we want to see the first level of grouping. So we use the Outline.ShowLevels method to specify the rows level to be displayed in a worksheet. This method has two optional parameters, RowLevels and ColumnLevels. In our case, only the RowLevels parameter is used and it specifies the number of row levels of an outline to display and we want the first row levels to be shown in this case.
ActiveSheet.Outline.ShowLevels RowLevels :=1
Combing all the lines of code together, we get this:
Sub RowsGroup()
Dim i as integer
For i = 1 to 21 step 3
Rows(i & “:” & i+1).Group
Next i
ActiveSheet.Outline.ShowLevels RowLevels :=1
End Sub
By using this method, we can group multiple rows as required without repetitive manual operation.
See you next week for more VBA tips!
Многоуровневая группировка строк
Если у вас имеется большая и сложная таблица на небольшом мониторе (например, ноутбука), то в процессе работы с ней часто возникает желание скрыть часть ненужных в текущий момент данных (строк или столбцов). Основные способы для решения этой проблемы — скрытие строк и группировка. Вот о последнем способе и пойдет речь далее.
Предположим, что мы работаем вот с такой сложной многоуровневой таблицей с данными:
Обратите внимание на то, что в таблице ясно и четко прослеживаются вложенные друг в друга уровни данных. Такую структуру часто можно увидеть в:
- бюджетировании — статьи доходов/расходов группируются в блоки (cost centers) или по географическому признаку (страна-край-город)
- управлении проектами — этапы проектов разбиты обычно на более мелкие подзадачи и действия
- строительных сметах — похожим образом обычно расписываются расчеты расхода материалов и их стоимости при строительстве
- и т.д. — дальше придумайте сами.
Делать такую группировку вручную весьма мучительно, вследствие неудобности и ограниченности средств группировки самого Excel. Поэтому, столкнувшись как-то с подобной задачей в одном из своих проектов, я написал макрос для автоматической группировки подобных списков, которым и хочу тут поделиться. Чтобы применить его к вашему списку, проделайте следующие действия:
Нажмите сочетание клавиш ALT+F11, чтобы открыть редактор Visual Basic. В нем выберите в меню команду Insert — Module, чтобы вставить новый модуль и скопируйте туда текст макроса:
При необходимости, текст можно слегка подкорректировать под ваши особенности, а именно изменить:
- FIRST_ROW — номер первой строки списка, начиная с которой пойдет группировка. Если у вас шапка не из одной строки или над таблицей есть данные — меняйте.
- FIRST_COLUMN — номер первого столбца списка, с которого начинается анализ и группировка. Если слева от вашей таблицы есть еще колонки, то эту константу также нужно изменить.
- NUMBER_OF_LEVELS — количество уровней (столбцов) для анализа. В приведенном выше примере мы хотим проанализировать три первых столбца, поэтому значение этой константы =3
Важно! Макрос предполагает, что:
- Уровни заполняются по порядку, т.е., например, уровень 3 не может быть написан, если ему не предшествовал уровень 2.
- В первом столбце списка в последней строке должно быть слово Конец, которое необходимо, чтобы макрос понял, где заканчивается список и пора остановиться:
Чтобы запустить добавленный макрос для списка на текущем листе, нажмите сочетание клавиш ALT+F8, выберите в списке наш макрос Multilevel_Group и нажмите кнопку Выполнить (Run) .
Grouping Rows in VBA
I have the code below that doesn’t seem to be working. Essentially, rngList refers to a defined name range in Excel that is about 500 rows long and every n number of rows there is text (there are approximately 32 rows out of the 500 that have text). I am trying to go to the non-blank cells (by mimicking the ctrl + down command in Excel).
I am checking to see if they are blank, and if they are I want to group that cell. If it is not blank, I want to check the cell to the left and if it is 0, I also want to group it. The code I have now is essentially trying to do this but I am receiving the error below:
Group Method of Range Class Failed
It then goes on to highlight the following line:
EDIT: Let’s say instead of grouping rows that are blank, I want to group rows that have 1 in them. That way the crtl + down will actually go to that cell rather than the last row.
Thank you very much for the help!
The code is below:
Создан 12 ноя. 12 2012-11-12 01:20:59 Max_1234
How can ‘Selection.Value = «»‘ when you’ve used ‘Selection.End(xlDown).Select’ to arrive at it? That should only happen for the very last row of the sheet. – Jamie Bull 12 ноя. 12 2012-11-12 01:46:37
Then how would I best approach this problem of grouping rows that have no entries in them? – Max_1234 12 ноя. 12 2012-11-12 01:53:58
ALso, right now the code is creating 8 different types of grouping. I just want it to all be grouped in one outline, not multiple seperate outlines. Thanks! – Max_1234 12 ноя. 12 2012-11-12 02:23:06
2 ответа
Despite the age of this post, I thought I’d throw in my two cents for anyone who might stumble upon it. I hope I understand your question correctly. Here’s what I’ve gathered:
Goal: For every row in the column of interest, group rows based on a criteria.
Criteria: The only rows in the group are those that either have no value (blank, null, empty) OR have a value AND have a neighboring cell (directly to the left) that has a value of 0. The only rows not in the group are those that are not blank and have a neighboring cell that is not 0.
Here is some sample data:
Note: the Range B1:B12 makeup the named range rngList , like the OP says they have.
Data Before Running Macro:
Data After Running Macro — Grouping Uncollapsed:
Data After Running Macro — Grouping Collapsed:
The code that handles this:
To make this code work: In the VBE (Visual Basic Editor), open the worksheet that contains the data to group (also contains the named range rngList ) and paste this code, then run the macro.
Note: The comments are added to explain certain parts in further detail, though I believe the code itself is written in a way that can explain itself (e.g. variable names are meaningful and logic makes sense).
Создан 19 фев. 13 2013-02-19 20:58:21 Sam
Сводные таблицы Excel
Зачастую данные транзакций накапливаются в таблице отчета по одной строке в день. Хотя ежедневные данные могут быть полезными для работников некоторых отраслей, большинству из них больше подходят данные, отсортированные по месяцам, кварталам либо годам.
Хорошая новость заключается в том, что в Excel 2010 группировка данных в сводных таблицах облегчена до предела. Теперь вместо загадочных формул типа =А2+1-ДЕНЬ(А2) , применяемых для преобразования ежедневных сведений в ежемесячные данные, можно обратиться к возможностям группирования Excel, выбрав произвольный уровень группировки (по месяцам, кварталам и т.д.), кпримером може служиь группировка данных по количеству смс уведомлений своих клиентов отправленных за отчетный период.
Группировка по дате в VBA выполняется довольно нестандартно. Метод .Group может применяться только к единственной ячейке сводной таблицы, а эта ячейка должна включать дату либо надпись поля Дата. Как показано на рис. 12.10, можно выбрать либо заголовок Дата, отображенный в ячейке Р2, либо одну из дат в диапазоне Р3:АРМ3 . Первый метод довольно ненадежный, особенно если сводная таблица будет создаваться в новом столбце. Два других метода более надежны.
Если вы не собираетесь использовать различное число полей строк, можете обозначить заголовок Дата, находящийся в ячейке на пересечении строки 1 и столбца 3, как TableRange2. Эта ячейка может быть выделена с помощью
следующей строки кода:
Если количество полей строк будет изменяться, добавьте комментарий, в котором упоминается, что для изменения числа полей строк следует изменить 3 на иное число. Еще один метод выделения ячейки основан на использовании свойства LabelRange для поля Дата. Следующий код всегда выбирает ячейку, содержащую заголовок поля Дата:
Для группировки ежедневных дат в даты по годам следует определить сводную таблицу, в качестве поля строки которой используется поле Дата. Для гарантированного создания сводной таблицы отключите свойство ManualCalculation.
Для поиска подписи даты воспользуйтесь свойством LabelRange. К ячейке, содержащей подпись даты, примените метод .Group. Для аргумента Periods этого метода следует определить массив, включающий семь нулевых значений. Эти семь значений соответствуют секундам, минутам, часам, дням, месяцам, кварталам и годам. Например, для группировки по годам применяется следующий код.
После выполнения группировки по годам поле по-прежнему называется Дата. В этом заключается отличие от группировки по нескольким полям. Для группировки по месяцам, кварталам и годам используется следующий код.
После выполнения группировки по месяцам, кварталам и годам в поле Дата отображаются месяцы. В сводной таблице появляется два новых виртуальных поля: Кварталы и Годы.
Для группировки по неделям выбирается период Day (День), а затем используется аргумент By для группировки по периодам, состоящим из семи дней.
Поскольку показанная на рис. 12.10 сводная таблица будет группироваться по годам, используется следующий код.
На рис. 12.11 показана сводная таблица с датами продаж, сгруппированными по годам.
Рис. 12.11. Группировка по годам выполнена с помощью метода .Group
Excel vba группировка строк
Для данных типа String существует только одна операция — конкатенация (объединение). Например, результатом операции конкатенации трех строковых значений «Петр» & » » & «Иванович» будет строка «Петр Иванович». Возможно также использование другого оператора для операции конкатенации, например: «десяти» + «тысячник». Разница между этими выражениями состоит в том, что в первом случае операндами могут быть значения любого типа (они просто будут преобразовываться в строковые), а во втором — оба операнда должны иметь тип String.
Для работы со строками существует большое количество функций (таблица. Функции работы со строками).
Таблица «Функции работы со строками»
Для сравнения строковых значений можно использовать обычные операторы сравнения числовых значений, так как при сравнении символов сравниваются их двоичные коды.
Для сравнения строковых значений также применяется оператор Like, который позволяет обнаруживать неточное совпадение, например выражение «Входной сигнал» Like «Вход*» будет иметь значение True, так как сравниваемая строка начинается со слова «Вход». Символ звездочка (*) в строке заменяет произвольное число символов. Другие символы, которые обрабатываются оператором Like в сравниваемой строке:
- ? — любой символ (один);
- #- одна цифра (0-9);
- [ ] — символ, совпадающий с одним из символов списка;
- [! ] — символ, не совпадающий ни с одним из символов списка.
Следующие три функции позволяют работать с массивом строк
- Split ( [, ]) — преобразует строку в массив подстрок. По умолчанию в качестве разделителя используется пробел. Данную функцию удобно использовать для разбиения предложения на слова. Однако можно указать в этой функции любой другой разделитель. Например, Split(3, «Это тестовое предложение») возвращает массив из трех строковых значений: «Это», «тестовое», «предложение».
- Join ( [, ]) — преобразует массив строк в одну строку с указанным разделителем.
- Filter ( , [, ] [, ]) — просматривает массив строковых значений и ищет в нем все подстроки, совпадающие с заданной строкой.
Эта функция имеет четыре аргумента:
- — искомая строка;
- — параметр (boolean значение), который указывает, будут ли возвращаемые строки включать искомую подстроку или, наоборот, возвращаться будут только те строки массива, которые не содержат искомой строки в качестве подстроки;
- — параметр, определяющий метод сравнения строк.
Еще три функции обеспечивают преобразование строк:
- LCase ( ) — преобразует все символы строки к нижнему регистру, например функция LCase(«ПОЧTA») возвращает строку «почта»;
- UCase ( ) — преобразует все символы строки к верхнему регистру;
- StrConv ( , ) — выполняет несколько типов преобразований строки в зависимости от второго параметра. Этот параметр описывается встроенными константами, например функция StrConv(«poccия», VbProperCase) возвращает значение «Россия».
И последние две функции генерируют строки символов
- Space ( ) — создает строку, состоящую из указанного числа пробелов;
- String ( , ) — создает строку, состоящую из указанного в первом аргументе числа символов. Сам символ указывается во втором аргументе.
Пример
Создать программу, работающую со строковыми переменными. Для этого создать форму, в метки которой выходят следующие сообщения:
1 метка: сообщается длина строки, введенной в первое текстовое поле (1 строка);
2 метка: преобразует все символы третьего текстового поля (3 строка) в заглавные буквы;
3 метка: выводит вместе содержание первого и второго текстовых полей (1 и 2 строки).
Хороший фреймворк (framework) лучшее решение для безпроблемной работы со строками.
Технология выполнения
- Откройте приложение Word, сохраните документ и перейдите в редактор VBA.
- Создайте форму аналогично приведенному рисунку.
- Пропишите обработчик события кнопки ОК.
- Откомпилируйте программу.
- Запустите форму на выполнение.
Форма примера в режиме конструктора и в рабочем состоянии
Excel vba группировка строк
Давно Вывожу отчеты в Excel. Захотел фичу — группировка строк.
В макросе на VBA все выглядит так:
Rows(«24:26»).Select
Range(«A26»).Activate
Selection.Rows.Group
Как из Delphi достучаться до интерфейса Selection?
Или как-то еще запустить Group?
← →
Романов Р.В. ( 2003-11-11 15:08 ) [1]
Selection это и есть Range по своей сути
← →
Малиновский Владимир ( 2003-11-11 15:16 ) [2]
Романов Р.В. © (11.11.03 15:08) [1]
Selection это и есть Range по своей сути
Ну и как, запустить Group для Range?
Подскажите чайнику, оч-чень хочется.
← →
Романов Р.В. ( 2003-11-11 15:26 ) [3]
В справке по VB написано
← →
Малиновский Владимир ( 2003-11-11 15:27 ) [4]
В VB я умею! В Delphi надо!
← →
Style ( 2003-11-11 15:31 ) [5]
uses
ActiveX, ComObj
.
var
ExcelApplication: variant;
begin
ExcelApplication := CreateOLEObject(«Excel.Application.8»);
ExcelApplication.WorkBooks.Add;
ExcelApplication.Visible := true;
ExcelApplication.Range[«A10:A20»].Select;
ExcelApplication.Range[«A10:A20»].Group;
А чего этот Group делает раз ты знаешь.
← →
Малиновский Владимир ( 2003-11-11 15:53 ) [6]
Ну, спасибо. Group — выполняет группировку данных по
строкам/столбцам.
Сделай вот так
ExcelApplication.Range[«A10:A20»].Rows.Select;
видишь, кнопка появилась, если нажать на нее — строки сворачиваются.
← →
Малиновский Владимир ( 2003-11-11 15:54 ) [7]
← →
Малиновский Владимир ( 2003-11-11 16:03 ) [8]
Да, вот еще подказали — при работе с TExcelApplication и т.п.:
Всем спасибо ! Отчеты — просто блеск!
Доброго времени суток дорогие посетители.
Тема сегодня будет не совсем самобытная и не большая. Я тут как то публиковал пост о том как группировать строки в Microsoft Excel вот здесь: http://profi-user.ru/gruppirivka-v-excel. Но там я забыл об одном очень важном моменте, не упомянул, о том что группировку можно выполнять автоматически. Я думаю нужно исправить этот пробел, в данной теме. Приступим.
Автоматизация с помощью кодов
Пора учиться использовать Excel по назначению в полной мере. Табличный редактор дает возможность автоматизировать повторяющиеся задачи, чтобы вы не делали одно и то же каждый раз.
Для этого используется программный язык Visual Basic. В нашем случае он позволит группировать и сразу сворачивать строки.
Это функция в Excel называется VBA группировка строк. Выполняется с помощью такого кода:
Чтобы его записать, необходимо во вкладке «Вид» нажать на кнопку «Макрос» и выбрать «Записать макроса».
Сделать это также можно через вкладку «Разработчик». Но, как правило, она не предусмотрена в меню по умолчанию, поэтому при желании добавьте ее вручную:
- Откройте Файл — Параметры — Настройка ленты;
- В группе «Основные вкладки» поставьте галочку возле той, что нам нужна, и нажмите «Ок».
В принципе всё, теперь нужно просто нажать на макрос два раза и мы видим как в нашем документе появились нужные нам группы, которые можно сворачивать и разворачивать:
Цифры значений
With Rows («2:5»)
.Rows (3)
Естественно выберите такие какие вам нужно.
На этом всё.
До встречи дорогие друзья, сохраняйте ссылку на этот сайт в закладки.
INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS
Contact US
Thanks. We have received your request and will respond promptly.
Log In
Come Join Us!
Are you a
Computer / IT professional?
Join Tek-Tips Forums!
- Talk With Other Members
- Be Notified Of Responses
To Your Posts - Keyword Search
- One-Click Access To Your
Favorite Forums - Automated Signatures
On Your Posts - Best Of All, It’s Free!
*Tek-Tips’s functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.
Posting Guidelines
Promoting, selling, recruiting, coursework and thesis posting is forbidden.
Students Click Here
use VBA to group rows in Exceluse VBA to group rows in Excel(OP) 19 Aug 19 15:10 I have a fairly large spreadsheet to list customer details which is sorted by sales reps (about 40 reps). I want to be able to double click on a rep’s name and have VBA automatically group the rows with his name; then double click on the next rep and group, etc. The reps’ names are always in column C. Any advise/guidance would be appreciated. Red Flag SubmittedThank you for helping keep Tek-Tips Forums free from inappropriate posts. |
Join Tek-Tips® Today!
Join your peers on the Internet’s largest technical computer professional community.
It’s easy to join and it’s free.
Here’s Why Members Love Tek-Tips Forums:
- Talk To Other Members
- Notification Of Responses To Questions
- Favorite Forums One Click Access
- Keyword Search Of All Posts, And More…
Register now while it’s still free!
Already a member? Close this window and log in.
Join Us Close