【发布时间】: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 属性来获取被过滤的范围,选择该范围的第一行来获取过滤器标题,然后检查每个单元格中的过滤任何标准的标题。如果用户在表格中选择了一个单元格,他们将不会取回任何工作表过滤器。
【问题讨论】:
-
您在同一个工作表中是否有 AutoFilter 和 Table??
-
是的,可能。有时用户可能会使用自动过滤器,但有单独的表用于查找目的。
标签: vba excel autofilter