2021年8月8日日曜日

Excel VBAでオートフィルターの絞り込みを解除する

 仕事中にExcel VBAでのオートフィルターの解除について色々調べたので共有しておきます。

調べて行った流れで書いているので、手っ取り早くソースが知りたい方は記事の下の方に回答があるのでそちらをどうぞ

まずネットで検索してよく出てくるソースは以下 

---------------------------------------------------------------------------------
With ActiveSheet
    If .AutoFilterMode And .AutoFilter.FilterMode Then
        .ShowAllData 
    End If 
End With
---------------------------------------------------------------------------------

上記のソースを、ボタンなどに仕込んでおいて、ボタンが押されたときに解除する等の処理を行います。

解説をすると、1行目ではオートフィルターが設定され、かつ絞り込まれているかを確認しています。この確認を入れない場合、フィルターモードが解除されていたり、絞り込みがされていない場合に実行時エラー1004が返されます。

AutoFilterMode・・・オートフィルターが設定されているか判定。設定されていればTrueを返す。
AutoFilter.FilterMode・・・オートフィルターによる絞り込みがされているか判定。絞り込まれていればTrueを返す。
 

1行目の結果が両方Trueであれば、続く2行目でオートフィルターによる絞り込みを全て解除しています。 

通常はこれで絞り込みは解除されるのですが、状況によってはエラーが返されて使えないことがあります。

1.シートの保護をしている場合

シートの保護をしている場合は、ActiveSheet.ShowAllDataは実行時エラー1004を返します。

ネットでよく見かける解決法としては、ActiveSheet.ShowAllDataを実行する時だけシートの保護を解除し、実行後再び保護をするという物でした。ソースは以下。

--------------------------------------------------------------------------------- 
With ActiveSheet
    If .AutoFilterMode And .AutoFilter.FilterMode Then
        .Unprotect
        .ShowAllData
        .Protect AllowFiltering:=True
    End If 
End With 
---------------------------------------------------------------------------------

お分かりと思いますが、3行目でシートの保護を解除し、5行目でオートフィルターの使用を許可しつつ再びシートの保護をしています。

シートの保護時の各許可のパラメータについてはMicrosoftのこちらのドキュメントにまとめられています。

これで確かにシートの保護をしていても絞り込みを解除できるのですが、これでも困る事態になる場合があります。

2.ブックの共有をする場合

ブックの共有を行うと以下の作業が出来なくなります。

・Excelテーブルの挿入
・セル範囲の挿入または削除(行全体や列全体はOK)
・ワークシートの削除
・グラフやピボットグラフの作成や変更
・図などオブジェクトの挿入または変更
・ハイパーリンクの挿入や変更
・ワークシートやブックの保護やその解除
・自動集計の挿入
・マクロの記録や変更(使用できない機能を使わないマクロの実行はOK)
・配列数式の変更または削除 

つまりブックの共有時はワークシート保護の解除/再保護が出来ません。

ブックの共有を解除/再共有をするという処理も出来るようですが、その場合共有が解除されるので、他に共有ブックを開いているユーザがいる場合、全員に閉じてもらう必要があります。

回答

VBAでオートフィルターの絞り込み解除をする処理のソースはこちら

---------------------------------------------------------------------------------
With ActiveSheet
    If .AutoFilterMode And .AutoFilter.FilterMode Then 
        .AutoFilter.ShowAllData
    End If 
End With
---------------------------------------------------------------------------------

どこが違うかと言うと絞り込み解除の処理が

ActiveSheet.ShowAllData から ActiveSheet.AutoFilter.ShowAllData になっています。

ActiveSheet.AutoFilterはフィルター処理がオンの場合、AutoFilterオブジェクトを返します。 (リファレンス

ShowAllDataメソッドはWorkSheetオブジェクトだけではなく、AutoFilterオブジェクトも持っているんですね。リファレンス

おそらくシートの保護を行うと、保護を行ったシートのWorkSheetオブジェクトに対する操作をブロックするのに対して、AutoFilterオブジェクトに対しては保護の影響は及ばないのではないでしょうか。

なのでシートの保護をした状態でも.AutoFilter.ShowAllDataはエラーが返されずに無事実行されるという事ですね。

結果、一時的にシートの保護の解除をするという手間も省けて、ソースもスッキリした形で絞り込み解除が実装できたかと思います。

 

仕事上で、複数人で一つのExcelファイルを共有して作業を進める事があるんですが、作業をしている人の中に絞り込みをしたまま解除せず保存する人が居たので、いちいち直すのが面倒だったんですね。

しかもウィンドウ枠の固定もしていたので、絞り込んだまま保存されると固定の位置がおかしい事になってしまうのです。 

それを解決すべく、保存時に強制的に絞り込みを解除する処理を組み込んだわけです。

調べるのに中々時間を要しました。どなたかの助けになれば幸いです。

0 件のコメント:

コメントを投稿