VBA表格筛选排序报错:Range对象方法调用失败(错误1004)
VBA筛选排序代码修复:解决Method range of object '_Global' failed错误
你遇到的1004错误,核心原因是错误地将变量Tbl作为字符串传入Range()函数。Range("Tbl[[#All],[DANFE]]")里的Tbl会被VBA当成表格的字面名称,而不是你定义的ListObject变量,自然找不到对应的范围。
正确的表格列引用方式
要通过已定义的Tbl变量引用指定列,直接使用ListObject的ListColumns属性即可,不需要用Range()函数拼接字符串:
- 按列名引用:
Tbl.ListColumns("DANFE").Range - 按列序号引用:
Tbl.ListColumns(列号).Range(比如第一列就是Tbl.ListColumns(1).Range)
修复并优化后的代码
下面是修正后的通用代码,同时优化了排序逻辑(一次添加多个排序字段再统一应用,避免重复操作):
Sub MAKE_FILTER() Dim ws As Worksheet Dim Tbl As ListObject ' 建议用具体类型ListObject而非Object,获得更好的语法提示 Set ws = ActiveSheet ' 检查当前工作表是否存在表格 If ws.ListObjects.Count = 0 Then MsgBox "当前工作表没有表格!" Exit Sub End If Set Tbl = ws.ListObjects(1) ' 取第一个表格 ' 按单元格颜色筛选第一列 Tbl.Range.AutoFilter Field:=1, Criteria1:=RGB(255, 255, 0), Operator:=xlFilterCellColor ' 排序:先按DANFE升序,再按Nº NF-e升序 With Tbl.Sort .SortFields.Clear ' 添加第一个排序字段 .SortFields.Add2 Key:=Tbl.ListColumns("DANFE").Range, _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal ' 添加第二个排序字段 .SortFields.Add2 Key:=Tbl.ListColumns("Nº NF-e").Range, _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal ' 应用排序设置 .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
扩展:让代码遍历工作簿所有工作表
如果需要代码对工作簿所有包含表格的工作表生效,而不只是活动表,只需添加遍历逻辑:
Sub MAKE_FILTER_ALL_SHEETS() Dim ws As Worksheet Dim Tbl As ListObject For Each ws In ThisWorkbook.Worksheets If ws.ListObjects.Count > 0 Then Set Tbl = ws.ListObjects(1) ' 筛选逻辑 Tbl.Range.AutoFilter Field:=1, Criteria1:=RGB(255, 255, 0), Operator:=xlFilterCellColor ' 排序逻辑 With Tbl.Sort .SortFields.Clear .SortFields.Add2 Key:=Tbl.ListColumns("DANFE").Range, _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal .SortFields.Add2 Key:=Tbl.ListColumns("Nº NF-e").Range, _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End If Next ws End Sub
关键知识点总结
- 不要将变量名嵌入字符串中传递给
Range(),直接通过对象属性引用更可靠 - 定义变量时尽量用具体类型(比如
ListObject而非Object),能获得VBA编辑器的语法提示,减少错误 - 多个排序字段可以一次性添加后再
Apply,提升代码效率
内容的提问来源于stack exchange,提问作者Cooper
相关产品推荐
相关产品推荐

