【问题标题】:Excel Sorting not working due to Range object由于 Range 对象,Excel 排序不起作用
【发布时间】:2017-12-08 16:28:32
【问题描述】:

此宏基于我记录的一个宏,但经过调整以应对可能缺少 4 个排序标准中的 3 个的情况。我无法弄清楚为什么我的宏在特定范围条件下有效,但在我引用单个单元格并进行外推时却不行。

有了这条线,排序工作 .SetRange Range("A1:W162")

这行不排序。 .SetRange Range("A1").End(xlDown).End(xlToRight) 我已经完成并可以确认它选择了正确的范围

我不想使用带有特定单元格的行,因为将来的导出大小会不同。

这是完整的子程序(相关位在底部附近)。

谢谢!

Sub SortByScoreAndCost()

Dim Score As Range
Dim Cost As Range
Dim YN As Range
Dim OriginalScore As Range

Set Score = Cells.Find("Score")
Set Cost = Cells.Find("Cost")
Set YN = Cells.Find("Y/N")
Set OriginalScore = Cells.Find("Original Score")

Range("A1").CurrentRegion.Select

ActiveSheet.Sort.SortFields.Clear

ActiveSheet.Sort.SortFields.Add Key:=Range( _
    Score.Offset(1, 0), Score.End(xlDown)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
    xlSortNormal

        If Cells.Find("Cost") Is Nothing _
            Then
            Else: ActiveSheet.Sort.SortFields.Add Key:=Range _
                (Cost.Offset(1, 0), Cost.End(xlDown)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption _
                :=xlSortNormal
        End If

        If Cells.Find("Y/N") Is Nothing _
            Then
            Else: ActiveSheet.Sort.SortFields.Add Key:=Range _
                (YN.Offset(1, 0), YN.End(xlDown)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption _
                :=xlSortNormal
        End If

        If Cells.Find("Original Score") Is Nothing _
            Then
            Else: ActiveSheet.Sort.SortFields.Add Key:=Range _
                (OriginalScore.Offset(1, 0), Original.End(xlDown)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption _
                :=xlSortNormal
        End If

With ActiveSheet.Sort
    .SetRange Range("A1:W162") 'works with this line
    .SetRange Range("A1").End(xlDown).End(xlToRight) 'doesn't work if replaced with this line
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

End Sub

【问题讨论】:

  • 作为一般建议,这就是为什么我没有在我的答案中包含这个,我会尽量避免使用active,所以我建议使用ActiveSheet 而不是ActiveSheet 这可能更长,可能需要使用With,但这样一来,Excel 不太可能尝试引用错误的工作表并引发错误。
  • 嗨@SilentRevolution,感谢您的建议。然而,这是由主子例程调用的一系列子例程的一部分。它们位于我的personal.xlb 中,因为我计划在我还没有打开excel 时可能会打开的各种工作簿中使用它们。这些是来自 Salesforce Web 数据库的导出/下载。所以它将在不同的工作表上运行,这些工作表会有不同的名称。这就是我使用 ActiveSheet 而不是命名工作簿的原因

标签: excel vba sorting


【解决方案1】:

Range("A1").End(xlDown).End(xlToRight) 指的是单个单元格区域,与A1:W162 不同。假设A1:W162 是工作表上所有数据所在的范围。该行仅指W162Range.End属性解释here,显示不保留起点。

尝试使用Range("A1:"& Range("A1").End(xlDown).End(xlToRight).Address),因为这应该会创建一个类似于A1:W162 的范围。第一部分是字符串"A1:"Range("A1).End(xlDown).end(xlToRight).Address 返回字符串"$W$162" 他们一起形成"A1:$W$162"

考虑到我对您的问题所做的评论,我建议使用以下代码。

Dim wsData as Worksheet 'Add worksheet variable

Set wsData = ThisworkBook.Worksheets("Name of your data sheet")

With wsData.Sort 'Instead of using ActiveSheet
    .SetRange wsData.Range(wsData.Cells(1, 1), wsData.Cells(1, 1).End(xlDown).End(xlToRight))

【讨论】:

  • 再次感谢@SilentRevolution。恐怕您建议的解决方案由于某种原因(我无法确定)不起作用。但是,您的建议确实让我意识到我做错了什么,我现在已经设法用以下代码部分纠正它:` With ActiveSheet.Sort .SetRange Range("A1").CurrentRegion .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With`
  • 完全没问题@JamesH,如果没有实际文档,很难说它为什么不能工作。我很高兴我的建议对您有所帮助。
猜你喜欢
  • 2011-10-12
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 2012-10-28
相关资源
最近更新 更多