在VBA中使用Sort来更改范围

时间:2014-03-04 14:37:37

标签: excel function vba sorting range

我在VBA中有一系列单元格,每次运行代码时都会更改。我正在尝试编写代码,以便此范围按列F排序。

我遇到的问题是它只能是这个特定范围的细胞。此范围下还有其他单元格,我不想对其进行排序,此范围会发生变化。部分代码如下。这是我到目前为止没有运气的尝试。

Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select

vtools = Selection

ActiveWorkbook.Worksheets("Exceptions Weekly Summary").Sort.SortFields.Add Key _
    :=Range(vtools), SortOn:=xlSortOnValues, Order:=xlAscending, _
    DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Exceptions Weekly Summary").Sort
    .SetRange Range("B11:H14")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

这不起作用。

我无法直接引用单元格(例如我不能使用Range(“F2:F5”)),因为每次运行代码时这些单元格都位于不同的位置。我知道如何找到我需要排序的内容,甚至选择它,但是我无法告诉sort函数哪个列要排序。

有人可以帮我吗?非常感谢你!

1 个答案:

答案 0 :(得分:4)

如果我理解正确,这将有所帮助。它找出所选区域的行号,然后使用这些数字在F列中创建一个范围,并将其用作排序的键。

Sub sortOnlySelectedArea()

Dim actSheet As Worksheet
Dim upper, lower As Integer
Dim tempString As String
Dim selectedArea As Range

Set actSheet = Application.Worksheets("Sheet1")

' here you have to put in your part to make the right selection
actSheet.Range("E5:G6").Select
Set selectedArea = Selection

upper = selectedArea.Row
lower = upper + selectedArea.Rows.Count - 1

tempString = "F" & CStr(upper) & ":F" & CStr(lower)
actSheet.Sort.SortFields.Clear
actSheet.Sort.SortFields.Add Key:=Range(tempString), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With actSheet.Sort
    .SetRange selectedArea
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

End Sub