高级筛选后的 .ShowAllData,Table 不完全 "clearing"

.ShowAllData after Advanced Filter, Table not fully "clearing"

我正在构建的搜索功能出现问题。

实际过滤器似乎工作得很好,returns符合预期。用户从几个下拉列表中选择条件,然后将这些条件写入高级过滤器中使用的条件字段。

当我清除高级过滤器(下面的代码)时出现问题。 table 确实被“清除”了,但是真的很奇怪..格式化?之后。

几乎 table 上的所有行都具有相同的背景(而不是交替亮 - 暗 - 亮等),除了那些是上一个过滤器的结果的行。

当新过滤器应用于 table 时,这会导致问题,其中前一个过滤器的最后一行之后的所有行都不会被隐藏,并且如果 table 被“清除” " 同样,只有最后一行 UP UNTIL 的行会显示,需要我手动取消隐藏数据末尾的那些行table。

双击单元格进行编辑然后单击退出后,怪异现象会自行纠正。然而,这不是一个可行的修复方法,我什至不确定如何编写类似的代码...

我知道在一个过滤器上应用一个过滤器会产生怪异,但即使我 运行 逐行手动操作时也会发生这种情况。

老实说,我不确定我在这里做错了什么或代码发生了什么,所以如果有人有任何见解,我将不胜感激!

Public Sub Apply_Filters(Optional button_name As String)

Const ProcName As String = "Apply_Filters"
On Error GoTo Whoa

Dim WsCP As Worksheet: Set WsCP = ActiveWorkbook.Sheets("Core Pack BDDS")
Dim WsDND As Worksheet: Set WsDND = ActiveWorkbook.Sheets("DO NOT DELETE")
Dim WsSizes As Worksheet: Set WsSizes = ActiveWorkbook.Sheets("Sizes DO NOT DELETE")

'Stuff to be able to find specific categories in the BDDS data table
Dim TableHeaders As Variant: TableHeaders = "Table1[#Headers]"                  'Header row for the main data table
Dim MainDataTable As String: MainDataTable = "Table1"                           'Should be the main table on the BDDS
Dim MainTable As ListObject: Set MainTable = WsCP.ListObjects(MainDataTable)    'Mimics synax to call on the main data table as a variable (to make things cleaner)
Dim WholeMainTable As Range: Set WholeMainTable = WsCP.Range(WsCP.Range(TableHeaders), WsCP.Range(TableHeaders).End(xlDown))

Dim Grp1Criteria As Range

Dim StartTime As Double
Dim ElapsedTime As Double

'Dim button_name As String: button_name = "Test"

'StartTime = MicroTimer

    WsSizes.Range("AD10:AP10").Calculate 'ensuring cells are updated before use
    WsSizes.Range("AD14:AJ14").Calculate 'ensuring cells are updated before use
    WsSizes.Range("AD16:AH16").Calculate 'ensuring cells are updated before use

    If WsSizes.Range("AD10").Value = 0 And WsSizes.Range("AD14").Value = 0 And WsSizes.Range("AD16").Value = 0 Then
        Debug.Print button_name & " - " & ProcName & " - " & " Filters NOT applied"
        GoTo SafeExit
            Else
            
            Call Clear_BDDS_Table
            
            WsDND.Range("BZ4:CS4").Calculate 'ensuring cells are updated before use
            
            Set Grp1Criteria = WsDND.Range("BZ3").CurrentRegion
            
            WholeMainTable.AdvancedFilter xlFilterInPlace, Grp1Criteria
            
            Debug.Print button_name & " - " & ProcName & " - " & " Filters applied"
    End If
    
    ElapsedTime = MicroTimer - StartTime
    
SafeExit:
    
    Debug.Print button_name & " - " & ProcName & " - " & ElapsedTime & " seconds"
    
    Exit Sub

Whoa:
    Debug.Print "'" & ProcName & "' Run-time error '" _
        & Err.Number & "':" & vbLf & "    " & Err.Description
    MsgBox "'" & ProcName & "' Run-time error '" _
        & Err.Number & "':" & vbLf & "    " & Err.Description
    Resume SafeExit

End Sub

问题似乎出在我尝试清除过滤器时。我使用下面的代码

Public Sub Clear_BDDS_Table(Optional button_name As String)

Const ProcName As String = "Clear_BDDS_Table"
On Error GoTo Whoa

Dim WsCP As Worksheet: Set WsCP = Sheets("Core Pack BDDS")
Dim TableHeaders As Variant: TableHeaders = "Table1[#Headers]"                  'Header row for the main data table
Dim MainDataTable As String: MainDataTable = "Table1"                           'Should be the main table on the BDDS
Dim MainTable As ListObject: Set MainTable = WsCP.ListObjects(MainDataTable)    'Mimics synax to call on the main data table as a variable (to make things cleaner)
Dim WholeMainTable As Range: Set WholeMainTable = WsCP.Range(WsCP.Range(TableHeaders), WsCP.Range(TableHeaders).End(xlDown))

If WsCP.FilterMode = True Then
    WsCP.ShowAllData
End If

    Debug.Print button_name & " - " & ProcName & " ran successfully"

SafeExit:

    Exit Sub

Whoa:
    Debug.Print button_name & " - " & "'" & ProcName & "' Run-time error '" _
        & Err.Number & "':" & vbLf & "    " & Err.Description
    MsgBox "'" & ProcName & "' Run-time error '" _
        & Err.Number & "':" & vbLf & "    " & Err.Description
    Resume SafeExit

End Sub

我好像找到问题了

这里的 post 对解决这个问题很有帮助...

似乎源于我在 Apply_Filters 子的开头声明 table 范围。

VBA 将该范围内的最后一行存储为 table 的末尾,并且在 table 被清除后保留为最后一行。

Dim TableHeaders As Variant: TableHeaders = "Table1[#Headers]"                  'Header row for the main data table
Dim MainDataTable As String: MainDataTable = "Table1"                           'Should be the main table on the BDDS
Dim MainTable As ListObject: Set MainTable = WsCP.ListObjects(MainDataTable)    'Mimics synax to call on the main data table as a variable (to make things cleaner)
Dim WholeMainTable As Range

Dim Grp1Criteria As Range

Dim StartTime As Double
Dim ElapsedTime As Double
'
'Dim button_name As String: button_name = "Test"

'StartTime = MicroTimer

    WsSizes.Range("AD10:AP10").Calculate 'ensuring cells are updated before use
    WsSizes.Range("AD14:AJ14").Calculate 'ensuring cells are updated before use
    WsSizes.Range("AD16:AH16").Calculate 'ensuring cells are updated before use

    If WsSizes.Range("AD10").Value = 0 And WsSizes.Range("AD14").Value = 0 And WsSizes.Range("AD16").Value = 0 Then
        Debug.Print button_name & " - " & ProcName & " - " & " Filters NOT applied"
        GoTo SafeExit
            Else
            
            Call Clear_BDDS_Table
            
            WsDND.Range("BZ4:CS4").Calculate 'ensuring cells are updated before use
            
            Set WholeMainTable = WsCP.Range(WsCP.Range(TableHeaders), WsCP.Range(TableHeaders).End(xlDown))

            Set Grp1Criteria = WsDND.Range("BZ3").CurrentRegion
            
            WholeMainTable.AdvancedFilter xlFilterInPlace, Grp1Criteria
            
            Debug.Print button_name & " - " & ProcName & " - " & " Filters applied"
    End If

清除 table 后移动范围声明解决了我的问题。

边学边学,希望这对以后的其他人有所帮助。