AutoFilter vs ShowAllData

问题描述 投票:2回答:1

[背景:]

[自最近以来,我就知道了一个通过使用AutoFilter创建的秘密命名范围。通常(如果不总是这样)将其称为“ _FilterDatabase”。

我曾考虑过玩这个,但后来卡在了它所指的Range对象上。让我用以下示例进行说明:


测试数据:]

| Header1 | Header2 |
|---------|---------|
| 50      |         |
| 10      |         |
| 30      |         |
| 40      |         |
| 20      |         |

测试代码:]

Sub Test()

With Sheet1
    .Range("A1:B1").AutoFilter 1, ">40"
    Dim rng As Range: Set rng = .Range("_FilterDatabase")
    If rng.SpecialCells(12).Count > 2 Then
        rng.Columns(2).Offset(1).Resize(rng.Rows.Count - 1, 1).Value = "Check"
    End If
    .Range("A1:B1").AutoFilter
End With

End Sub

enter image description here


问题:] >>

立即执行以下代码:

Sub Test()

With Sheet1
    .Range("A1:B1").AutoFilter 1, ">30"
    Dim rng As Range: Set rng = .Range("_FilterDatabase")
    If rng.SpecialCells(12).Count > 2 Then
        rng.Columns(2).Offset(1).Resize(rng.Rows.Count - 1, 1).Value = "Check"
    End If
    .Range("A1:B1").AutoFilter
End With

End Sub

但是这将跳过对SpecialCells的测试,因为命名范围现在将引用A1:B1而不是A1:B6


问题:

使用.ShowAllData而不是.AutoFilter解决了问题:

Sub Test()

With Sheet1
    .Range("A1:B1").AutoFilter 1, ">30"
    Dim rng As Range: Set rng = .Range("_FilterDatabase")
    If rng.SpecialCells(12).Count > 2 Then
        rng.Columns(2).Offset(1).Resize(rng.Rows.Count - 1, 1).Value = "Check"
    End If
    .ShowAllData
End With

End Sub

但是,.AutoFilter清除过滤器并将其从我们的范围内删除。在这两种情况下,秘密的命名范围都将保留在名称管理器下的Formulas选项卡中。

有人知道为什么ShowAllData确实会影响第二轮的返回范围吗?

背景:从最近开始,我就知道了一个通过使用自动筛选器创建的秘密命名范围。通常(如果不是始终)将其称为“ _FilterDatabase”。我考虑过玩...

excel vba autofilter named-ranges
1个回答
0
投票

我已经找到了自己的问题的答案(事后看来,这似乎与我的发现不符)。根据我的问题,AutoFilter将立即在水下创建一个加密的命名范围,通常(如果不是始终如此)称为"_FilterDatabase"。我注意到的是以下内容:

© www.soinside.com 2019 - 2024. All rights reserved.