为什么这样做:
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))
我看不出这是怎么做的。
答案 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)
最好准确确定您正在使用哪些对象并直接使用对象,而不是使用Selection
或Range
,因为它有时会导致意外后果或减慢您的速度代码下来。
试试这个:
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。