【问题标题】:ActiveSheet.AutoFilter.Range sometimes returns table's AutoFilter based on selected cellActiveSheet.AutoFilter.Range 有时会根据选定的单元格返回表格的自动筛选
【发布时间】:2018-02-02 16:51:13
【问题描述】:

编辑:我能做的最好的就是找到最后使用的单元格,然后将其偏移一行和一列。如果用户使用整个工作表,这将失败,但我愿意抓住这个机会。我可以暂时选择这个单元格,然后切换回用户之前的单元格。

Public Function getCellOutsideUsedRange(ws As Worksheet) As Range
    Dim rng As Range
    Set rng = getLastCellOnSheet(ws)
    If rng.Row = ws.Rows.CountLarge Then
        If rng.Column = ws.Columns.CountLarge Then
            Set getCellOutsideUsedRange = Nothing
        Else
            Set getCellOutsideUsedRange = rng.offset(0, 1)
        End If
    ElseIf rng.Column = ws.Columns.CountLarge Then
        If rng.Row = ws.Rows.CountLarge Then
            Set getCellOutsideUsedRange = Nothing
        Else
            Set getCellOutsideUsedRange = rng.offset(1, 0)
        End If
    Else
        Set getCellOutsideUsedRange = rng.offset(1, 1)
    End If
End Function

Public Function getLastCellOnSheet(ByRef ws As Worksheet) As Range
    Set getLastCellOnSheet = ws.Cells.Find(What:="*", After:=Cells(1, 1), LookIn:=xlFormulas, LookAt:= xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
End Function

如果您在表格中选择了一个单元格,ActiveSheet.AutoFilter.Range 将返回应用于表格的自动过滤器,而不是工作表。示例:

Sub test()
    Dim af As AutoFilter

    Range("C1").Select
    Set af = ActiveSheet.AutoFilter
    MsgBox af.Range(1).Value2
    MsgBox af.Parent.Name

    Range("C12").Select
    Set af = ActiveSheet.AutoFilter
    MsgBox af.Range(1).Value2
    MsgBox af.Parent.Name

End Sub

The documentation 并没有真正帮助我。即使用户碰巧在表格中选择了一个单元格,我如何确保我可以访问工作表自动过滤器,而不必循环遍历单元格,直到我在表格外找到一个单元格?

上下文:我有一个简短的宏,它返回已应用于工作表的所有过滤器的列表。总之,它会查看工作表和任何表格,并使用 AutoFilter.Range 属性来获取被过滤的范围,选择该范围的第一行来获取过滤器标题,然后检查每个单元格中的过滤任何标准的标题。如果用户在表格中选择了一个单元格,他们将不会取回任何工作表过滤器。

【问题讨论】:

  • 您在同一个工作表中是否有 AutoFilterTable??
  • 是的,可能。有时用户可能会使用自动过滤器,但有单独的表用于查找目的。

标签: vba excel autofilter


【解决方案1】:

一般来说,在 VBA 中使用 Select 并依赖它是一种不好的做法。 How to avoid using Select in Excel VBA

关于自动过滤器 - 每个工作表只能有一个自动过滤器,它位于表格之外。因此,它可以通过ActiveSheet.AutoFilter.Range 访问,可以是NothingNot Nothing

关于表格中的自动过滤器,您可以简单地遍历表格并一一检查自动过滤器是否存在:

Sub TestMe()

    Dim cntAutoFilters      As Long
    Dim cnt                 As Long
    Dim wks                 As Worksheet
    Dim tbl                 As ListObject

    Set wks = Worksheets(1)

    If Not wks.AutoFilter.Range Is Nothing Then
        Debug.Print wks.AutoFilter.Range.Address
    End If

    For Each tbl In wks.ListObjects
        If Not tbl.AutoFilter Is Nothing Then
            Debug.Print tbl.Range.Address
        End If
    Next tbl

End Sub

关于 MSDN 文档:

编辑: 确实,如果您在工作表的表格中选择了一个单元格,则似乎无法引用该表格之外的自动筛选。

【讨论】:

  • 嗨 - 如果您选择的单元格在表格内,则使用 ActiveSheet.AutoFilter.Range 不会访问工作表的自动过滤器。这就是我在示例中使用 Select 语句的原因。您的 TestMe() 遇到了同样的问题。
  • @Jonathan - 是的,这似乎是真的。
猜你喜欢
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多