我正在寻找一个宏来对同一张表中的多个动态范围进行排序。每个范围都与B列中的空单元格分开。理想情况下,我希望代码通过B列,找到第一个动态范围,选择/激活该范围内的所有行(.EntireRow),基于升序排序在C列上,然后转到下一个动态范围,依此类推。这可能吗?
答案 0 :(得分:0)
如果可以假设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$1: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列中的下一个空白单元来收集该部分的范围。由于没有提供样本数据,我选择了一个非常复杂的方法 应该数据的变化但计算量很大。四百个部分需要几分钟。