在工作簿中,我有一个简单的工作表(“主”),其中包含一个表(“ Table1”)和一个命名范围为两个单元格(“ filter_input”)。该表包括条件格式,突出显示包含“ filter_input”范围中任一单元格值的任何行。然后对表格进行排序,以将突出显示的行放在表格的顶部。手动刷新表排序(Ctrl-Alt-L)绝对可以。
要使其自动化,我设置了Worksheet_change以标识“ filter_input”范围内的更改,如果是这样,则表的过滤和排序应自动刷新。我有以下内容:
Private Sub Worksheet_Change(ByVal target As Range)
Set isect_filter = Application.Intersect(target, Range("filter_input"))
If isect_filter Is Nothing Then
Else
ActiveWorkbook.Worksheets("Master").ListObjects("Table1").AutoFilter.ApplyFilter
With ActiveWorkbook.Worksheets("Master").ListObjects("Table1").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End If
End Sub
该代码在过去的12个月中一直没有出现问题,但是今天打开工作簿后,触发代码导致运行时错误:
对象“ ListObject”的方法“ AutoFilter”失败。
突出显示的行:
ActiveWorkbook.Worksheets("Master").ListObjects("Table1").AutoFilter.ApplyFilter
我没有更改代码或文档中的任何内容,唯一能想到的更改是我最近收到了一台新笔记本电脑并正在运行Office365。我很难相信这是问题所在,但是我看不到其他改变了。在不同的工作簿中,我也有几乎相同的代码,这也给了我与今天相同的错误。
如果我注释掉该行,则会收到类似的错误,涉及以下行和方法“ sort”。我已经检查了其他方法来刷新排序,但似乎都没有用。
我什至尝试使用宏记录器记录重新应用过滤器(或Ctrl-Alt-L)的操作,但是它记录的代码似乎是错误的:
Sub Macro1()
'
' Macro1 Macro
'
'
Range("C6:C7").DataFields
Range("C7").
ColorIndex.("Table1")..SubAddress
With ThemeColor.("Master").("Table1").
.Count = xlYes
.ActiveSheet = False
. = xlTopToBottom
. = xlPinYin
.
End With
End Sub
这是Record Macro生成的代码的另一种粘贴-这次没有单元格选择,只有按Ctrl-Alt-L即可刷新表。我还通过功能区菜单(“主页”选项卡>“编辑”>“排序和筛选”>“重新应用”)运行相同的功能,并且生成的代码相同。
Sub Macro3()
'
' Macro3 Macro
'
'
ColorIndex.("Table1")..SubAddress
With ThemeColor.("Master").("Table1").
.Count = xlYes
.ActiveSheet = False
. = xlTopToBottom
. = xlPinYin
.
End With
End Sub
答案 0 :(得分:1)
好吧,我找到了一个解决方案-尽管我不确定为什么我的原始代码不起作用,尤其是在以前运行良好的情况下。
我没有对直接定义的表执行操作,而是先将表定义为ListObject变量,然后执行相同的操作。
原来的代码是
ActiveWorkbook.Worksheets("Master").ListObjects("Table1").AutoFilter.ApplyFilter
With ActiveWorkbook.Worksheets("Master").ListObjects("Table1").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
成为:
Dim ActiveTable As ListObject
Set ActiveTable = ActiveWorkbook.Worksheets("Master").ListObjects("Table1")
ActiveTable.AutoFilter.ApplyFilter
With ActiveTable.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
以下是完整的完整代码:
Private Sub Worksheet_Change(ByVal target As Range)
Set isect_filter = Application.Intersect(target, Range("filter_input"))
If isect_filter Is Nothing Then
Else
Dim ActiveTable As ListObject
Set ActiveTable = ActiveWorkbook.Worksheets("Master").ListObjects("Table1")
ActiveTable.AutoFilter.ApplyFilter
With ActiveTable.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End If
End Sub
如果有人能向我解释其背后的逻辑,我将不胜感激。
谢谢