Excel 用于对多个动态范围进行排序的宏
Excel macro to sort multiple dynamic ranges
我正在寻找一个宏来对同一 sheet 中的多个动态范围进行排序。每个范围都由 B 列中的一个空单元格与下一个范围分隔。理想情况下,我希望代码通过 B 列,找到第一个动态范围,select/activate 该范围内的所有行 (.EntireRow),排序基于 C 列升序,然后下降到下一个动态范围,依此类推。这可能吗?
如果可以假设 B 列中的空白单元格表示要排序的新部分,并且总是至少有一行数据要排序,那么以下应该可以实现您的目标。
Sub sort_sections()
Dim fr As Long, rws As Long, lc As Long
With ActiveSheet
lc = .Cells(1, Columns.Count).End(xlToLeft).Column
For fr = 1 To .Cells(Rows.Count, 3).End(xlUp).Row
If IsEmpty(.Cells(fr, 2)) Then
rws = .Evaluate("SMALL(INDEX(ROW(B:B)+SIGN(LEN(B:B))*1E+99, , )" & _
", COUNTBLANK(B:B" & fr & ")+1)-1") - (fr - 1)
With .Cells(fr, 1).Resize(rws, lc)
Debug.Print .Address(0, 0) 'output the section address to the Immediate window
.Cells.Sort Key1:=.Columns(3), Order1:=xlAscending, _
Orientation:=xlTopToBottom, Header:=xlYes
End With
End If
Next fr
End With
End Sub
这会变成这样:
...进入这个,
有多种方法可以通过查找 B 列中的下一个空白单元格来收集该部分的范围。由于没有提供样本数据,我选择了一种相当复杂的方法 应该 考虑了数据的变化,但计算量很大。四百个部分需要几分钟。
我正在寻找一个宏来对同一 sheet 中的多个动态范围进行排序。每个范围都由 B 列中的一个空单元格与下一个范围分隔。理想情况下,我希望代码通过 B 列,找到第一个动态范围,select/activate 该范围内的所有行 (.EntireRow),排序基于 C 列升序,然后下降到下一个动态范围,依此类推。这可能吗?
如果可以假设 B 列中的空白单元格表示要排序的新部分,并且总是至少有一行数据要排序,那么以下应该可以实现您的目标。
Sub sort_sections()
Dim fr As Long, rws As Long, lc As Long
With ActiveSheet
lc = .Cells(1, Columns.Count).End(xlToLeft).Column
For fr = 1 To .Cells(Rows.Count, 3).End(xlUp).Row
If IsEmpty(.Cells(fr, 2)) Then
rws = .Evaluate("SMALL(INDEX(ROW(B:B)+SIGN(LEN(B:B))*1E+99, , )" & _
", COUNTBLANK(B:B" & fr & ")+1)-1") - (fr - 1)
With .Cells(fr, 1).Resize(rws, lc)
Debug.Print .Address(0, 0) 'output the section address to the Immediate window
.Cells.Sort Key1:=.Columns(3), Order1:=xlAscending, _
Orientation:=xlTopToBottom, Header:=xlYes
End With
End If
Next fr
End With
End Sub
这会变成这样:
...进入这个,
有多种方法可以通过查找 B 列中的下一个空白单元格来收集该部分的范围。由于没有提供样本数据,我选择了一种相当复杂的方法 应该 考虑了数据的变化,但计算量很大。四百个部分需要几分钟。