【发布时间】: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 而不是命名工作簿的原因