【问题标题】:Macro to sort data until blank row(s), then repeat宏对数据进行排序,直到空白行,然后重复
【发布时间】:2016-03-04 12:07:59
【问题描述】:

在 A 列中,我有一个球员姓名列表,在 B 列中,我有他们的分数。有不同数量的玩家,后跟未设置数量的空白行,然后是另一个玩家列表。

我需要 vba 中的一个宏,它会根据玩家的得分(B 列)按降序对 A 列和 B 列进行排序,但直到它到达空白行为止。然后,一旦它碰到空白行,它将跳转到下一组玩家并以相同的方式对他们进行排序,继续循环,直到所有数据都被排序。

来自 cmets 的代码:

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

来自 cmets 的更新:

应该对每个组执行两次顺序排序。 F:G 以 G:G 为主键,然后 H:I 以 I:I 为主键。

【问题讨论】:

  • 我已经让这段代码适用于第一组数据,但不知道如何循环处理下一组数据,即跳过空白单元格并重新开始... Dim N As Long N = Cells(1, 1).End(xlDown).Row Range("A1:B" & N).Sort key1:=Range("B1:B" & N), order1:=xlDescending, Header:= xl猜测

标签: excel vba sorting macros


【解决方案1】:

在引用工作表上的单元格时尽量避免使用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 变量更新,向下移动两次以跳过空白行是一件简单的事情。

您真的应该知道您的数据是否有列标题标签行。 xlGuess 可能大部分时间都适用于录制的代码,但它根本不可靠。


¹ 请参阅How to avoid using Select in Excel VBA macros,了解更多摆脱依赖选择和激活来实现目标的方法。

【讨论】:

  • 那是巨大的,非常感谢。还有一个问题——如果我在 D 列和 E 列中也有球员姓名和球员得分怎么办。是否可以修改上面的代码,使其可以相对于 B 对 A:B 进行排序(它已经这样做了)以及相对于 E 对 D:E 进行排序?
  • C:C 中有什么(如果有的话)?
  • 没什么,我已经把它们转移了,所以不是 D:E 它是 C:D 相对于 D
  • 好吧,我很困惑。您想先对 A:B 进行排序。然后是 C:D 还是 D:E?
  • 对不起!根据 B 中的条目对 A:B 进行排序(它已经这样做了),然后以相同的方式相对于 D 对 C:D 进行排序
猜你喜欢
  • 2017-06-07
  • 1970-01-01
  • 2020-04-29
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多