【问题标题】:Excel VBA sort method, run time error 1004, "The sort reference is not valid. Make sure that it is whithin..."Excel VBA 排序方法,运行时错误 1004,“排序引用无效。确保它在...”
【发布时间】:2017-08-18 00:11:42
【问题描述】:

我正在尝试根据两个不同的条件对范围进行排序。 为了做到这一点,我录制了一个完美运行的宏。

当我尝试将部分宏代码行替换为 我自己的变量等,代码不起作用并向我抛出了几个不同的错误消息。

  1. 我得到的第一个是:“运行时错误 438。对象不支持此属性或方法”

  2. 收到的另一条错误消息是“运行时错误 1004。排序引用无效。确保它在您要排序的数据内,并且第一个排序依据框不相同或空白的。”

这是来自宏记录器的代码(它有效):

Sub CustomSort()
' CustomSort Macro
    Range("A1:H958").Select
    ActiveWorkbook.Worksheets("Run Data from Notes").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Run Data from Notes").Sort.SortFields.Add Key:=Range("A2:A958"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Run Data from Notes").Sort.SortFields.Add Key:=Range("H2:H958"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Run Data from Notes").Sort
        .SetRange Range("A1:H958")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

我将代码更改为(不起作用并给我“运行时错误 438”):

 Dim StatusRange As Range
    Dim PartNumber As Range
    Dim WholeRange As Range
    Dim wbkToRun As Workbook
    Dim NewData As Worksheet
    Dim LastRow As Long

    Set wbkToRun = ThisWorkbook
    Set NewData = Worksheets("Run Data from Notes")
    LastRow = NewData.Cells.Find("*", searchorder:=xlByRows, SearchDirection:=xlPrevious).Row
    Set WholeRange = NewData.Range("A2:H" & LastRow)
    WholeRange.Select
    ActiveWorkbook.NewData.Sort.SortFields.Clear
    wbkToRun.NewData.Sort.SortFields.Add Key:=WholeRange, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    wbkToRun.NewData.Sort.SortFields.Add Key:=WholeRange, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

    With wbkToRun.NewData.Sort
        .SetRange WholeRange
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

当使用宏记录器代码时,但将范围更改为我的动态设置范围“WholeRange”时,它会给我错误消息:“运行时错误 1004。排序引用无效。确保它在数据内您想要排序,而第一个排序依据框不一样或空白。”

WholeRange.Select
    ActiveWorkbook.Worksheets("Run Data from Notes").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Run Data from Notes").Sort.SortFields.Add Key:=WholeRange, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Run Data from Notes").Sort.SortFields.Add Key:=WholeRange, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Run Data from Notes").Sort
        .SetRange WholeRange
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

它在“.Apply”上中断

有人可以解释为什么我上面的两个代码不起作用吗? 我的代码和宏录制的代码有什么区别。 谢谢。

【问题讨论】:

  • NewData 不是ActiveWorkbook 的成员。只需使用引用本身,而不是尝试从ActiveWorkbook 调用它。
  • 您能详细说明一下并举个例子吗?没完全明白。谢谢。

标签: vba excel sorting


【解决方案1】:

代码中有很多错误。 首先正如@Comintern 所说,您的范围对象NewData 本身就是一个对象变量,它不是其父工作表的property。因此wbkToRun.NewDataActiveWorkbook.NewData 不是有效的VBA。

其次,排序时key参数不能为多列范围。每个键应该是一列,或者是只有一列的范围。

With NewData.Sort
    .SortFields.Clear
    .SortFields.Add key:=.Columns("A"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    .SortFields.Add key:=.Columns("H"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SetRange WholeRange
    .header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

【讨论】:

  • 此代码有效。非常感谢!只是一个“.Columns()”应该是“Columns()”,前面没有点。
猜你喜欢
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
相关资源
最近更新 更多