【问题标题】:"Runtime error 1004: Sort reference not valid"“运行时错误 1004:排序引用无效”
【发布时间】:2015-02-25 02:13:41
【问题描述】:

我从这个站点复制了一些我认为可以解决我试图解决的问题的代码。我从Using Sort in VBA for a Range that Changes复制了原始代码 我只是将数据的左上角定义为单元格 A3 中的更改方式。最终代码运行如下:

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 
   'actSheet.Range("E5:G6").Select
   ActiveSheet.Range("a3").CurrentRegion.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

我的问题是代码几乎在最后失败了。我已经逐步完成了代码,它正确地拾取了数据区域。当它到达最后一行(.Apply)时它会失败,然后突出显示。调试消息指示运行时错误 1004:排序引用无效。 我无法很好地遵循代码以查看如何选择排序范围。理想情况下,我希望能够对 C 列进行排序,但如有必要,我会选择 A 列。我要排序的范围是 A3:F105。

【问题讨论】:

标签: excel vba sorting


【解决方案1】:

也许这就是你需要的更多...

Sub someSortRoutine()
   Dim sortsheet As Worksheet
   Dim sortArea As Range
   Dim keyColumn As Range

   Set sortsheet = Application.Worksheets("Sheet1")       
   Set sortArea = sortsheet.Range("a3").CurrentRegion
   Set keyColumn = Application.Intersect(sortsheet.Range("F:F"), sortArea)

   sortsheet.Sort.SortFields.Clear
   sortsheet.Sort.SortFields.Add Key:=keyColumn, _
       SortOn:=xlSortOnValues, Order:=xlAscending, _
   DataOption:=xlSortNormal
   With sortsheet.Sort
       .SetRange sortArea
       .Header = xlGuess
       .MatchCase = False
       .Orientation = xlTopToBottom
       .SortMethod = xlPinYin
       .Apply
   End With
End Sub

【讨论】:

  • 谢谢。在所有三个响应者的帮助下,我在排序和范围定义方面的经验都向前迈进了一大步,而且我可以将其改编为一个我之前因缺乏经验而放弃了几次的小项目
【解决方案2】:

当我的区域在 F 列中不包含任何数据时,我能够重新创建运行时错误 1004。

线

tempString = "F" & CStr(upper) & ":F" & CStr(lower)

正在确定排序列。如果您将 F 更改为 A,我认为会在 A 列上对其进行排序。

【讨论】:

  • 你是正确的。我已经意识到我的错误是多么简单(和愚蠢)。我想当我复制原始代码时,我已经对其进行了足够的纠正以解决我的问题。我感谢您和其他 2 位响应者提供了非常有用的学习经验,这将帮助我在未来处理排序和范围选择
【解决方案3】:

我会理所当然地认为您知道CurrentRegion Property 如何代表一个或多个指定单元格周围的数据岛。排序操作的成功将取决于此。

在我看来,最明显的潜在冲突是告诉 actSheet 代表 Sheet1,但随后告诉 actSheet 对选定的当前区域进行排序 on on ActiveSheet。这些不一定是同一个工作表。

以下尝试合并对工作表的引用,同时为实际的排序例程使用另一种编码方法。

Sub sortOnlySelectedArea()
    With Worksheets("Sheet1").Range("a3").CurrentRegion
        .Cells.Sort Key1:=.Columns(6), Order1:=xlAscending, _
                    Orientation:=xlTopToBottom, Header:=xlYes
    End With
End Sub

该子的名称具有欺骗性,因为您的原件在活动工作表的 A3 单元格周围选择了.CurrentRegion,但它的作用相同。如前所述,ActiveSheetWorksheets("Sheet1") 存在一些混淆。您需要选择一种引用方法并坚持下去。来回弹跳只会导致可能不会一直重现的冲突(例如,仅当 Sheet1 不是活动工作表时)。

最后,让 Excel 猜测 是否有标题行绝不是一个好主意。你应该知道你是否这样做。

【讨论】:

  • 谢谢。我想我了解所有的cmets。作为一个业余爱好者,它通过整理我的误解对我有很大帮助。在你自己和其他 2 篇文章的帮助下,我对过去曾愚弄过我的数据排序和范围选择有了很多了解。很高兴我的问题得到了解决,并且可以自己解决未来的任何此类问题
猜你喜欢
  • 2020-12-16
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
相关资源
最近更新 更多