在A栏中我有一个球员名单,在B栏我有他们的分数。有不同数量的玩家接着是未设置的空白行数,其次是另一个玩家列表。
我需要一个vba中的宏,它将根据玩家的得分(B列)按降序对A列和B列进行排序,但只能直到它击中空白行。然后一旦它击中空白行,它将跳转到下一组玩家并以相同的方式对它们进行排序,继续循环直到所有数据都被排序。
评论代码:
Dim N As Long
N = Cells(1, 1).End(xlDown).Row
Range("A1:B" & N).Sort Key1:=Range("B1:B" & N), Order1:=xlDescending, Header:=xlGuess
评论更新:
应对每个组执行两个连续排序。 F:G与G:G是主键然后H:我和我:我是主键。
答案 0 :(得分:0)
在引用工作表上的单元格时,尽量避免使用Range .Select¹方法。通过变量跟踪位置并使用它们进行直接参考是首选方法。
Sub playersort()
Dim i As Long, rw As Long
rw = 1
With Worksheets("Players_Scores")
Do While rw < .Cells(Rows.Count, "A").End(xlUp).Row
With .Cells(rw, 6).CurrentRegion
With .Resize(.Rows.Count, 2)
.Cells.Sort Key1:=.Columns(2), Order1:=xlDescending, _
Key2:=.Columns(1), Order2:=xlAscending, _
Orientation:=xlTopToBottom, Header:=xlYes '<~~ you should know if you have a header or not!
End With
With .Resize(.Rows.Count, 2).Offset(0, 2)
.Cells.Sort Key1:=.Columns(2), Order1:=xlDescending, _
Key2:=.Columns(1), Order2:=xlAscending, _
Orientation:=xlTopToBottom, Header:=xlYes '<~~ you should know if you have a header or not!
End With
End With
For i = 1 To 2
rw = .Cells(rw, 1).End(xlDown).Row
Next i
Loop
End With
End Sub
通过更新 rw var,向下移动两次以跳过空白行是一件简单的事情。
您真的应该知道您的数据是否有列标题标签行。 xlGuess 可能在大多数情况下适用于录制的代码,但它根本不可靠。
¹有关远离依赖选择和激活以实现目标的更多方法,请参阅How to avoid using Select in Excel VBA macros。