この二段構えでオートフィルタの絞り込みと表示を消し去ります。
そんなの、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
とするとオートフィルタの絞り込みも表示もきれいに消せるということになります。