当工作表有过滤器时,为什么ActiveSheet.FilterMode返回False?

时间:2016-08-27 18:25:46

标签: excel vba excel-vba excel-2010 listobject

我尝试使用以下代码尝试检测应用于表中列的过滤器,然后清除过滤器:

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

2 个答案:

答案 0 :(得分:1)

我可以在Excel 2013上复制您的问题:False上的错误FilterModeShowAllData上的错误。

在回答文档是否错误时,我会说缺少是否有资格说明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