首页 > 解决方案 > Excel VBA - 选择 2 个命名单元格或行之间的整行进行排序

问题描述

Excel 中的宏的新功能。

我的名为“OVERALL”的工作表在行中列出了项目,在列中列出了各种数据。我正在尝试创建基于各种数据单元格对项目进行排序的宏按钮。

由于我将经常将项目添加到组中并且不想使用正确的单元格更新宏以进行排序,因此我一直在尝试使用命名单元格或命名行但已经陷入困境。

我添加的项目有时必须位于最开始、最结束或中间的某个位置,因此我定义了上下边框行以帮助宏识别数据选择的开始和停止位置。在宏中,我希望能够选择边界行之间的整行,以防将来添加其他数据列。

如果我录制一个宏,这就是我得到的代码;

`Sub SortProjectNameA2Z()

Rows("14:149").Select
ActiveWorkbook.Worksheets("OVERALL").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("OVERALL").Sort.SortFields.Add Key:=Range( _
    "A14:A149"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
With ActiveWorkbook.Worksheets("OVERALL").Sort
    .SetRange Range("A14:W149")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
Range("A11").Select
Application.CutCopyMode = False`

第 14 行是 Upper Border Row = "BorderFirstRow" 下面的整行。

第 149 行是下边界行上方的整行 = "BorderLastRow"

如果有帮助,我还将上边界行的第一个单元格命名为“BorderCellFirst”,将下边界行的第一个单元格命名为“BorderCellLast”?

我找到了一种方法来选择边界行之间的行;Range("BorderCellFirst:BorderCellLast").EntireRow.Select 但我还没有找到一种方法来选择边框行或不包括边框行的边框单元格之间的整行。

谢谢!!

标签: excelvbaselect

解决方案


尝试,

With Worksheets("OVERALL")
    With .Range(.Cells(.Range("BorderFirstRow").Row + 1, "A"), _
                .Cells(.Range("BorderLastRow").Row - 1, "W"))
        .Sort Key1:=.Cells(1), Order1:=xlAscending, _
              Orientation:=xlTopToBottom, Header:=xlNo
    End With
End With

要使用辅助键排序,

With Worksheets("OVERALL")
    With .Range(.Cells(.Range("BorderFirstRow").Row + 1, "A"), _
                .Cells(.Range("BorderLastRow").Row - 1, "W"))
        .Sort Key1:=.Cells(1, "A"), Order1:=xlAscending, _
              Key2:=.Cells(1, "C"), Order2:=xlDescending, _
              Key3:=.Cells(1, "B"), Order3:=xlAscending, _
              Orientation:=xlTopToBottom, Header:=xlNo
    End With
End With

将 A 列作为主要排序,然后将 C 列排序,然后将 B 列排序。

这种排序方法最多只允许三个键,但您可以先对其他辅助键进行预排序。


推荐阅读