已回答此問題,但我需要一點幫助。我正在使用回答中提供的代碼,但是我無法獲得整個文檔的子分組。這樣的事情可能嗎?自動分組Excel 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
注:Plusses顯示組。
我有這樣的表,如上所述,我已經索引的章節與sublevels。我試圖用excel組功能對這些部分進行分組,但是,我有超過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)並對它們進行分組。這不是代碼實現的。而且,如果相鄰行具有相同的索引,代碼將跳過分組。
這是一個可行的方法,或者我應該重新考慮我的循環,以及如何?
我理解代碼的邏輯,它似乎完美和對點,然而,我得到錯誤「對象未設置變量或塊變量」爲線「如果currRng.Value <> sRng.Value然後eRng = currRng「。另外,「如果沒有(sRng)然後」我將此行更改爲「IsEmpty(sRng)」,因爲它不接受IsNothing的原因。 –
糟糕!回覆:沒什麼 - 這是錯誤的關鍵字。我已將其更正爲「如果sRng是Nothing」。和重新:對象變量錯誤,我忘記了'Set'關鍵字。在編輯之後,代碼應該是正確的。這就是我提交未經測試的代碼所獲得的結果,對我感到羞恥。 – Vegard
這次我沒有收到任何錯誤,但是,代碼沒有做任何事情。 –