空Excel表格排序时Sort对象Apply方法调用失败的解决方法
解决VBA排序空表格时的
Method 'Apply' of Object 'Sort' failed错误 这个问题的核心原因很直白:当你的表格没有数据行(也就是DataBodyRange为Nothing)时,你试图给SortFields.Add指定DataBodyRange作为排序关键字,这会触发对象引用错误,后续的.Apply自然也会跟着失败。
解决方案:先判断表格是否有数据行
我们只需要在执行排序和筛选操作前,先检查表格的DataBodyRange是否存在。如果是空表格(没有数据行),就跳过排序和筛选步骤,避免触发错误。
修改后的完整代码
Dim sht As Worksheet Dim Tbl As ListObject For Each Sht In Worksheets If Sht.Name <> "Original" Then Set Tbl = Sht.ListObjects(1) With Tbl .ListColumns("Pass/fail").Range.Cut Tbl.Range(1, 1).End(xlToRight).Offset(0, 1).Insert shift:=xlToRight End With With Tbl .ListColumns("Persons for corrective actions").Range.Cut Tbl.Range(1, 1).End(xlToRight).Offset(0, -1).Insert shift:=xlToRight End With With Tbl .ListColumns("Created By").Range.Cut Tbl.Range(1, 1).End(xlToRight).Offset(0, -11).Insert shift:=xlToRight End With With Tbl .ListColumns("Description of findings").Range.Cut Tbl.Range(1, 1).End(xlToRight).Offset(0, -10).Insert shift:=xlToRight End With With Sht .Range("C:F").EntireColumn.Delete .Range("G:H").EntireColumn.Delete .Range("K:K").EntireColumn.Delete End With ' 新增:判断表格是否有数据行 If Not Tbl.DataBodyRange Is Nothing Then With Tbl.Sort.SortFields .Clear .Add Key:=Tbl.ListColumns("Planned closing date for action").DataBodyRange, _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal End With With Tbl.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Tbl.DataBodyRange.AutoFilter field:=Tbl.ListColumns("Pass/fail").Index, Criteria1:="FAIL" End If Sheets.Add After:=Sht End If Next Sht
关键修改说明
- 用
If Not Tbl.DataBodyRange Is Nothing Then包裹了排序和筛选的代码块,只有当表格存在数据行时才执行这些操作 - 空表格情况下,代码会直接跳过排序、筛选步骤,继续执行后续的
Sheets.Add操作,不会触发任何错误
这样修改后,不管目标表格有没有数据,你的代码都能稳定运行了。
内容的提问来源于stack exchange,提问作者Konsta
相关产品推荐
相关产品推荐

