排序键范围查询

时间:2015-11-25 22:44:52

标签: excel vba

为什么这样做:

Range(Cells(1, 1), Cells(5, 5)).Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal

但这不是吗?:

Range(Cells(1, 1), Cells(5, 5)).Select
Selection.Sort Key1:=Range(Cells(1,1)), Order1:=xlAscending, Header:=xlNo, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal

  

方法范围失败

编辑

询问的原因是我希望排序键是动态的,例如:

Selection.Sort Key1:=Range(Cells(intRow, intCol))

我看不出这是怎么做的。

3 个答案:

答案 0 :(得分:3)

Cells调用已经返回Range对象,因此您应该使用

Selection.Sort Key1:=Cells(1,1), Order1:=xlAscending, Header:=xlNo, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal

我认为你的困惑源于将两个Cell参数传递给Range是有效的,即Range(Cells(1, 1), Cells(5, 5)),但仅传递一个Cells参数无效,即Range(Cells(1, 1))

您可以使用以下代码段

自行查看
Public Sub test()

Dim rng As Range

Set rng = Range(Cells(1, 1), Cells(3, 1))
MsgBox rng.Cells.Count

Set rng = Range(Cells(1, 1))
MsgBox rng.Cells.Count

End Sub

第一次msgbox调用会收到一条消息说3,但是在第二次尝试设置rng时会出现异常。

至于为什么第二种格式无效,我不知道。如果您发现开发人员为什么以这种方式构建它,请告诉我们。

答案 1 :(得分:2)

最好准确确定您正在使用哪些对象并直接使用对象,而不是使用SelectionRange,因为它有时会导致意外后果或减慢您的速度代码下来。

试试这个:

Dim ws as Worksheet
Set ws = Sheets("Sheet1") ' replace with your sheet name

'assume you wrap this around a loop to move through intRow and intCol _
 or set them in some other fasion
With ws.Range(Cells(1,1), Cells(5,5)

  .Sort Key1:=.Cells(intRow, intCol), Order1:=xlAscending, Header:=xlNo, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal

End With

答案 2 :(得分:2)

  

询问的原因是我希望排序键是动态的......

至少部分问题是依靠.Select和随后的Selection作为工作区域。如果您打算使用Range.CurrentRegion property(A1中的数据源“岛”),请使用With ... End With statement来定义.CurrentRegion并使用它。

with worksheets("Sheet1")     `<~~ set the parent worksheet!
    with .Cells(1, 1).CURRRENTREGION         `<~~ set the 'island' of data
        .cells.Sort Key1:=.cells(1), Order1:=xlAscending, Header:=xlNo, _
                    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                    DataOption1:=xlSortNormal
    end with
end with

我对“动态”的含义有点不清楚。以上将使用.CurrentRegion定义的区域左上角的单元格。如果您使用With .Range("D5:H99"),则.Cells(1)会引用D5。

有关远离依赖选择和激活以实现目标的更多方法,请参阅How to avoid using Select in Excel VBA macros