コード
この二段構えでオートフィルタの絞り込みと表示を消し去ります。
'オートフィルタ絞り込みの解除
If ActiveSheet.Filtermode = True Then
ActiveSheet.ShowAllData
End If
'オートフィルタ表示の解除(A1がオートフィルタ行の左上)
If Not (ActiveSheet.AutoFilter Is Nothing) Then
ActiveSheet.Range("A1").AutoFilter
End If
オートフィルタが表示されているかの判定
そんなの、ActiveSheet.FilterModeで判定でしょ!と思っていたのですが
Sub autofilter()
MsgBox ActiveSheet.FilterMode
End Sub
あれ?Trueにならない?
オートフィルタが表示されているか否かの判定は、ActiveSheet.filtermode = Trueでは不正確です。
ActiveSheet.filtermodeはオートフィルタで絞り込まれているときはTrueを返しますが、フィルタが表示されていないときはもちろん、フィルタが表示されているが絞り込まれていないときもFalseになります。
結論から述べると、オートフィルタ表示の有無はActiveSheet.AutoFilterがNothingか否かで判定できます。
- ActiveSheet.Autofilter Is Nothing = True オートフィルタ表示なし
- ActiveSheet.Autofilter Is Nothing = False オートフィルタ表示あり
Sub autofilter()
MsgBox (ActiveSheet.autofilter Is Nothing)
End Sub
そして、ActiveSheet.Range("A1").AutoFilterのような形でフィルタ表示の有無を切り替えます(A1がオートフィルタが表示される行の一番左上のとき)
オートフィルタの解除には、絞りこみを解除するShowAllDataとオートフィルタ表示を解除(解除時は設定)するAutoFilterがあります。
なんとなくActiveSheet.Filtermodeでオートフィルタの有無を判定して
'解除できません!
If ActiveSheet.Filtermode = True Then
ActiveSheet.ShowAllData
ActiveSheet.Range("A1").AutoFilter
End If
で全解除できそうな気がしますが、フィルタの絞り込みがかかっていないときは解除されません。
- 絞りこみを解除するActiveSheet.ShowAllData
→絞り込み判定をするActiveSheet.Filtermodeで判定 - オートフィルタ表示を解除(解除時は設定)するActiveSheet.Range("A1").AutoFilter
→ActiveSheet.autofilter Is Nothing
で判定をするのが相性がいいです。
なので
'オートフィルタ絞り込みの解除
If ActiveSheet.Filtermode = True Then
ActiveSheet.ShowAllData
End If
'オートフィルタ表示の解除(A1がオートフィルタ行の左上)
If Not (ActiveSheet.AutoFilter Is Nothing) Then
ActiveSheet.Range("A1").AutoFilter
End If
とするとオートフィルタの絞り込みも表示もきれいに消せるということになります。