テーブルのフィルターボタン(失敗談)

テーブルとして書式設定を行うと、自動でフィルターボタンが付される。
これがラベルの文字と重なって、同文字を見え難くすることがよくある。
f:id:Infoment:20190223163453p:plain

これは、フィルターボタンのチェックを外すことで、非表示化が可能だ。
f:id:Infoment:20190223163652p:plain

CSVから取り込んだデータをテーブルとして書式設定する業務があって
毎回手動でチェックを外すのが煩雑だったため、テーブル化と併せこれを
自動化してみた。
f:id:Infoment:20190223164726p:plain
といっても、操作自体はあまり難しくない。ListObjectのメンバーである、
ShowAutoFilterDropDownプロパティをFalseにするだけでよい。
(マクロの記録で確認)。

Sub Sample()
    Dim Tb As ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        Tb.ShowAutoFilterDropDown = False
End Sub

動作確認の結果も良好。早速、一部の方に紹介した。するとしばらくして、
エラーの報告が寄せられてきた。しかも、エラーになる人とならない人が
いる。確認したところ、次の違いが分かった。

  1. エラーあり ⇒ Excel 2010
  2. エラーなし ⇒ Excel 2013以降

どうやら、Excel 2010以前は対応していないらしい。画面で見ても、Excel2010に
フィルターボタンのチェックボックスは存在しなかった。

その後の調べで、ShowAutoFilterプロパティというものもあることが分かったが、Excel2013でこれを使用するとフィルターボタンが無効になって都合が悪かった。
結局この時は、エラーを無視させることでお茶を濁してしまった。

Sub Sample()
    Dim Tb As ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        On Error Resume Next
        Tb.ShowAutoFilterDropDown = False
        On Error Goto 0
End Sub

今回の事例は、まさに「マクロの記録の弊害」の一つと思う。マクロの記録で得た結果について、プロパティへの理解不充分なまま、他のバージョンにおける検証不充分なまま展開してしまうと、Excel からこのようなお叱りを受けることになる。と、大いに反省した次第。

ところで、フィルターのON ⇔ OFFの切り替えには、こんな面白い方法がある。

Tb.ShowAutoFilterDropDown = Not Tb.ShowAutoFilterDropDown

このフィルターに限った話ではなく、Boolean型は True と False しかないため、現状を否定(Not)することで切り替えが可能だ。

「今の自分を否定することで、目標を実現する」

などと格好良く述べてみたところで、今回はおしまいとします。

参考まで。