刷新Excel表过滤器并使用VBA排序时出错

时间:2018-07-23 15:53:16

标签: excel vba sorting autofilter listobject

在工作簿中,我有一个简单的工作表(“主”),其中包含一个表(“ 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

编辑26/07/2018-记录宏生成的代码的第二次粘贴

这是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

1 个答案:

答案 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

如果有人能向我解释其背后的逻辑,我将不胜感激。

谢谢