Excel VBA-对多列排序后取消选择范围

Excel VBA-对多列排序后取消选择范围,excel,vba,sorting,Excel,Vba,Sorting,我应用的代码如下所示,目的是按照A、B、C、D作为排序字段的顺序对目标工作表范围A:H进行排序。代码不起作用,但在代码执行后,屏幕将在选择的范围A:H处结束。我想清除选择 正如你所看到的,我试过使用 wsName.Range("A1").Select Application.CutCopyMode = False 最后,但没有像我预期的那样工作 Public Sub sSortColumn(wsName As Worksheet) With wsName.Sort Wi

我应用的代码如下所示,目的是按照A、B、C、D作为排序字段的顺序对目标工作表范围A:H进行排序。代码不起作用,但在代码执行后,屏幕将在选择的范围A:H处结束。我想清除选择

正如你所看到的,我试过使用

wsName.Range("A1").Select
Application.CutCopyMode = False
最后,但没有像我预期的那样工作

Public Sub sSortColumn(wsName As Worksheet)
    With wsName.Sort
        With .SortFields
            .Clear
            .Add Key:=Range("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .Add Key:=Range("B:B"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .Add Key:=Range("C:C"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .Add Key:=Range("D:D"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        End With
        .SetRange Range("A:H")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    wsName.Sort.SortFields.Clear
    wsName.Range("A1").Select
    Application.CutCopyMode = False
End Sub`

有一个更简洁的编码语法。但是,一次只能使用三个键。解决方案是先按第四个键排序,然后按您喜欢的顺序对其余三个键排序

SortFields项的父工作表默认为。与传递到子过程中的没有显式关系

Sub main()
    'wsName worried me so I'm making sure to
    'pass in a correct worksheet object reference
    sSortColumn Worksheets("Sheet1")
End Sub

Public Sub sSortColumn(wsName As Worksheet)
    With wsName
        .Sort.SortFields.Clear    '<~~reset the worksheet's .SortFields
        With .Cells(1, 1).CurrentRegion
            With .Resize(.Rows.Count, 8) '<~~ columns A:H originating at A1
                .Cells.Sort Key1:=.Columns(4), Order1:=xlAscending, _
                            Orientation:=xlTopToBottom, Header:=xlYes   '<~~sort the fourth column first
                .Cells.Sort Key1:=.Columns(1), Order1:=xlAscending, _
                            Key2:=.Columns(2), Order2:=xlAscending, _
                            Key3:=.Columns(3), Order3:=xlAscending, _
                            Orientation:=xlTopToBottom, Header:=xlYes   '<~~sort the remaining three columns
            End With
        End With
        'if you want to leave this worksheet's selection on A1 then
        'first make sure that the worksheet is active and then
        'select the cell
        .Activate
        .Range("A1").Select
        'the above is really not necessary. The original selection on the worksheet was
        'not changed
    End With
End Sub
Sub-main()
“wsName让我很担心,所以我要确保
'传入正确的工作表对象引用
SSORT柱状工作表(“表1”)
端接头
公共子列(wsName作为工作表)
使用wsName

.Sort.SortFields.Clear“一个更好的问题是“我如何避免首先选择”。为了回答这个问题,谢谢,我没有意识到范围(“A:H”)实际上是进行选择的,我原以为是.apply。我现在不在城里,但明天晚些时候会试试这个。干杯。谢谢-它就像一个符咒。有趣的是,range.sort有三个键的限制,(我觉得)比sheet.sort工作得更快