我正在尝试根据两种不同的条件对范围进行排序。 为了做到这一点,我录制了一个完美的宏。
当我尝试将宏代码的som替换为 我自己的变量等,代码不起作用,并给我几个不同的错误消息。
我得到的第一个是:"运行时错误438.对象不支持此属性或方法"
获得的其他错误消息是"运行时错误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"
有人可以解释为什么我上面的两个代码不起作用吗? 我的代码和宏记录代码之间有什么区别。 谢谢。
答案 0 :(得分:0)
代码中有很多错误。
首先,如所述@Comintern,您的范围对象NewData
是每个自身的对象变量,它不是其父工作表的property
。因此wbkToRun.NewData
和ActiveWorkbook.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