我尝试使用以下代码尝试检测应用于表中列的过滤器,然后清除过滤器:
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
根据Microsoft文档:
如果工作表包含已隐藏行的已过滤列表,则此属性为true。
这似乎并非如此,因为如果选择了应用过滤器的表格内的单元格,ActiveSheet.Filtermode
仅返回True
。
第一个问题:文档错了吗? Documentation
第二个问题:我唯一的选择是在表格中选择一个单元格以使表达式返回True吗?
PS我正在使用Excel 2010
编辑:回答问题2,基于非选择的方法来清除过滤器...
If ActiveSheet.ListObjects(1).Autofilter.FilterMode Then ActiveSheet.ListObjects(1).Autofilter.Showalldata
答案 0 :(得分:1)
我可以在Excel 2013上复制您的问题:False
上的错误FilterMode
和ShowAllData
上的错误。
在回答文档是否错误时,我会说缺少是否有资格说明ActiveCell
应该在ListObject
s {{1 }}。也许文档是正确的,但这是一个尚未解决的错误。也许您可以通过文档链接更新您的问题?
重新提出第二个问题 - 我同意使用此解决方法是最明显的解决方案。使用DataBodyRange
似乎有点不愉快,但有时我猜这是无法避免的。
这是我使用Select
函数检查Intersect
当前位于ActiveCell
的{{1}}区域的方式:
DataBodyRange
继@ orson的评论:
如果你跳过If Intersect(rng,lst.DataBodyRange)Nothing Then然后使用If lst.AutoFilter.FilterMode然后lst.AutoFilter.ShowAllData End If?
因此,您可以查看ListObject
本身的Option Explicit
Sub Test()
Dim rng As Range
Dim ws As Worksheet
Dim lst As ListObject
'get ActiveCell reference
Set rng = ActiveCell
'get reference to Worksheet based on ActiveCell
Set ws = rng.Parent
'is there a Listobject on the ActiveCells sheet?
If ws.ListObjects.Count > 0 Then
Set lst = ws.ListObjects(1)
Else
Debug.Print "No table found"
Exit Sub
End If
'is cell is in the DataBodyRange of ListObject?
If Intersect(rng, lst.DataBodyRange) Is Nothing Then
'set the ActiveCell to be in the DataBodyRange
lst.DataBodyRange.Cells(1, 1).Select
End If
'now you can safely call ShowAllData
If ws.FilterMode = True Then
ws.ShowAllData
End If
End Sub
,然后只要您引用FilterMode
就可以使用他的代码:
ListObject
答案 1 :(得分:1)
更简单的替代方案可以是ababab
所有行:
AutoFit
问题在于它将取消隐藏并自动适应活动工作表上的所有行。
从http://www.contextures.com/excelautofilterlist.html
更新Rows.AutoFit