宏对多列数据进行排序,直到下一个空白行,然后重复
Macro to sort data from multiple columns until next blank row, then repeat
我有一个 sheet,在同一个作品上有多个 tablesheet 'Sheet1',由一个空行分隔。
我要VBA一个一个排序。
注意事项
- 每个 table 有不同的行数
- 以后栏目数量也会发生变化
永远不变的是:
- B 列 table 之间的空白行,这是 excel 识别新 table 的起点。
- 每个 table 将始终按 C
列排序
为了给你一个更好的画面,我正在查看消费者数据交叉表,其中:
COLUMN A is QUESTION TYPE
COLUMN B is ANSWER CHOICES
COLUMN C is Header is "TOTAL", and it contains % per answer choices
COLUMS 的其余部分像 C 一样跟在 % 之后,但 headers 不同,例如“男性”“女性”“用户”“非用户”“18-25 岁”“26-34 岁”... .等
我想创建一个循环宏,它将按 C 列升序对每个 table(以及 table 中的所有列)进行排序,以确定它必须搜索下一个空白space 并且 table 将在其下方。
我试过查看循环、排序和查找下一个空单元格。但是由于某些原因我无法将它们拼凑起来。
任何帮助将不胜感激!
ORIGINAL FILE
AFTER MACRO DESIRED OUTPUT
之前尝试过的代码:
Dim oneArea as Range
For Each oneArea in Range("C:C").SpecialCells(xlCellTypeConstants).Area
oneArea.EntireRow.Sort key1:=oneArea.Cells(1,1), order1:=xlAscending
Next oneArea
供参考:这是我发现的最接近我想要的示例和宏,但它不适用于我的场景/无法使其工作:
Macro to sort data until blank row(s), then repeat
以下代码遍历 sheet 中的每一行,检查每个 table 的开始和结束,并对它们进行排序。享受。
Sub Mak1()
Dim LastRow As Long, LastCol As Long
Dim TabBeg As Long, TabEnd As Long
With Sheets("Sheet1")
LastRow = .Cells(.Rows.Count, 2).End(xlUp).row
LastCol = .Cells(3, .Columns.Count).End(xlToLeft).Column
TabBeg = 4
TabEnd = 4
For i = 4 To LastRow + 1
If .Cells(i, 2).Value = "" Then
With .Sort
.SortFields.Clear
.SortFields.Add Key:=Range(Cells(TabBeg, 3), Cells(TabEnd, 3)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range(Cells(TabBeg, 2), Cells(TabEnd, LastCol))
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
TabBeg = i + 1
TabEnd = i
Else
TabEnd = TabEnd + 1
End If
Next i
End With
End Sub
我有一个 sheet,在同一个作品上有多个 tablesheet 'Sheet1',由一个空行分隔。
我要VBA一个一个排序。
注意事项
- 每个 table 有不同的行数
- 以后栏目数量也会发生变化
永远不变的是:
- B 列 table 之间的空白行,这是 excel 识别新 table 的起点。
- 每个 table 将始终按 C 列排序
为了给你一个更好的画面,我正在查看消费者数据交叉表,其中:
COLUMN A is QUESTION TYPE
COLUMN B is ANSWER CHOICES
COLUMN C is Header is "TOTAL", and it contains % per answer choices
COLUMS 的其余部分像 C 一样跟在 % 之后,但 headers 不同,例如“男性”“女性”“用户”“非用户”“18-25 岁”“26-34 岁”... .等
我想创建一个循环宏,它将按 C 列升序对每个 table(以及 table 中的所有列)进行排序,以确定它必须搜索下一个空白space 并且 table 将在其下方。
我试过查看循环、排序和查找下一个空单元格。但是由于某些原因我无法将它们拼凑起来。
任何帮助将不胜感激!
ORIGINAL FILE
AFTER MACRO DESIRED OUTPUT
之前尝试过的代码:
Dim oneArea as Range
For Each oneArea in Range("C:C").SpecialCells(xlCellTypeConstants).Area
oneArea.EntireRow.Sort key1:=oneArea.Cells(1,1), order1:=xlAscending
Next oneArea
供参考:这是我发现的最接近我想要的示例和宏,但它不适用于我的场景/无法使其工作:
Macro to sort data until blank row(s), then repeat
以下代码遍历 sheet 中的每一行,检查每个 table 的开始和结束,并对它们进行排序。享受。
Sub Mak1()
Dim LastRow As Long, LastCol As Long
Dim TabBeg As Long, TabEnd As Long
With Sheets("Sheet1")
LastRow = .Cells(.Rows.Count, 2).End(xlUp).row
LastCol = .Cells(3, .Columns.Count).End(xlToLeft).Column
TabBeg = 4
TabEnd = 4
For i = 4 To LastRow + 1
If .Cells(i, 2).Value = "" Then
With .Sort
.SortFields.Clear
.SortFields.Add Key:=Range(Cells(TabBeg, 3), Cells(TabEnd, 3)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range(Cells(TabBeg, 2), Cells(TabEnd, LastCol))
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
TabBeg = i + 1
TabEnd = i
Else
TabEnd = TabEnd + 1
End If
Next i
End With
End Sub