На этот вопрос был дан ответ, однако мне нужна помощь с одной точкой. Я использую код, указанный в ответе , однако я не могу получить подгруппу для всего документа. Возможно ли это?Автоматическая группировка Excel VBA
Section Index
1 1
+ 1.1 2
++ 1.1.1 3
+++1.1.1.1 4
+++1.1.1.2 4
+++1.1.1.3 4
++ 1.1.2 3
++ 1.1.3 3
+ 1.2 2
+ 1.3 2
2 1
ПРИМЕЧАНИЕ. Плюсы показывают группы.
У меня такой стол, как указано выше, где я проиндексировал разделы с подуровнями. Я пытаюсь сгруппировать эти разделы с помощью функции excel group, однако у меня более 3000 строк данных, поэтому я пытаюсь автоматизировать процесс. Я изменил макрос Excel VBA, который нашел здесь, и получил этот код ниже.
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 groupBegin, groupEnd As Integer
Dim i As Integer
Dim j As Integer
Dim n 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 To LastRow
CurrentLevel = Cells(i, LevelCol)
groupBegin = i + 1
'Goes down until the entire subrange is selected according to the index
For n = i + 1 To LastRow
If Cells(i, LevelCol).Value = Cells(n, LevelCol).Value Then
If n - i = 1 Then
Exit For
Else
groupEnd = n - 1
Rows(groupBegin & ":" & groupEnd).Select
'If is here to prevent grouping level that have only one row
End If
Exit For
Else
End If
Next n
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
В основном то, что я пытаюсь сделать в коде выше, чтобы выбрать верхний индекс и потекла клетку, пока этот показатель не одно и то же значение снова. В основном для примера диаграммы я хотел бы выбрать строки (2: 4) и сгруппировать их. Код не достигается. Кроме того, код пропускает группировку, если соседние строки имеют один и тот же индекс.
Является ли это жизнеспособным методом или я должен переосмыслить свои петли и как?
Я понимаю логику кода, и, похоже, он идеален и, кстати, я получаю сообщение об ошибке «Переменная объекта или переменная блока не установлена» для строки «If currRng.Value <> sRng.Value Тогда eRng = currRng ". Кроме того, «If IsNothing (sRng) Затем« Я изменил эту строку на «IsEmpty (sRng)», потому что он не принимает IsNothing по какой-то причине. –
Упс! Re: IsNothing - это было неправильное ключевое слово.Я скорректировал это на 'If sRng Is Nothing'. И re: ошибка переменной объекта, я забыл ключевое слово 'Set'. После этого редактирования код должен быть правильным. Это то, что я получаю за отправку непроверенного кода, стыдно за меня. – Vegard
На этот раз я не получаю никаких ошибок, однако код ничего не делает. –