社内SEの徒然なる日記

Excelでシート保護した状態でオートフィルタを使用する

オートフィルタ

同僚に、Excelでシート保護をした状態でオートフィルタを使用する方法を聞かれました。

使っているExcelのバージョンは2010なので、「シート保護する時のオプションに、オートフィルタを許可する設定があったと思いますけど」て返したのですが、「Excel2000でも使えるようにしたい」ということ。

たしかExcel2000だと、シート保護した状態でExcelを終了すると、再度立ち上げた時にオートフィルタが使用できなくなったはず。これは、マクロで何とか出来たはずだが...。

とりあえず、試して見ました。

テストデータの作成

とりあえず、テスト用にこんな表を準備します。
Excelフィルタ(表)

表の中を選択して...
Excelフィルタ(フィルタ設定1)

オートフィルタを設定します。
Excelフィルタ(フィルタ設定2)

さて...

Excel2010の場合

まずは、Excel2010の機能で対応してみます。
このVerなら、小細工はいらなかったはず。

まず、校閲タグからシート保護を選択します。
Excelフィルタ(シート保護1)

リストの下の方にある、オートフィルターの使用にチェックを付けて、OKボタンをクリックします。
Excelフィルタ(シート保護2)

これで、シート保護された状態で、オートフィルターを使用できるようになりました。
もちろん、ブックを再立ち上げしてもオートフィルターは使用できるままです。
Excelフィルタ(使用)

Excel2000の場合

さて、今度はExcel2000での対応方法です。
こちらは、マクロで小細工する必要があったはず。

テストデータは、同じ表を使用します。
私の端末、Excel2000がインストールされていないので、操作画面はExcel2010になっています。

まず、開発タグからVisual Basicを起動します。
Excelフィルタ(コード表示)

左側のリスト(プロジェクトエクスプローラ)から、ThisWorkbookを右クリックして、コードの表示をクリックします。
※ ThisWorkbookをダブルクリックしてもOKです。
Excelフィルタ(ThisWorkbook)

コード編集画面が表示されるので、左上のリストからWorkbookを選択します。
Excelフィルタ(WorkbookOpen1)

すると、こんなメソッドが作られるはずです。
この、Workbook_Openってのは、Excel起動時に自動実行されるマクロです。
ここに、小細工に必要な処理を突っ込みます。
Excelフィルタ(WorkbookOpen2)

突っ込みました。

'Excel起動時の処理
Private Sub Workbook_Open()

'シート保護時のオートフィルタを使用可
Sheet1.EnableAutoFilter = True

'シート保護
Sheet1.Protect UserInterfaceOnly:=True

End Sub


ソース解説

まず、フィルタをかけたいシートの、EnableAutoFilterプロパティにTrueを設定します。
これによって「画面上からの変更のみの保護を設定している時に、ワークシートのオートフィルター矢印を使用可能にする」ことが出来ます。

画面上からの変更云々というのは、「ユーザーからの操作は保護するが、マクロからの操作は許可する」という、シート保護(Protectメソッド)の設定のことです。
これは、Protectメソッドのパラメータ「UserInterfaceOnly」にTrueを設定することで可能になります。

この処理を、Workbook_Openメソッドに書くのは、EnableAutoFilterプロパティの設定が、Excelを終了すると消えてしまうので、Excel起動時に自動実行させることで、常にこのプロパティがTrueになるようにしています。

余談

Excel起動時の自動実行といえば、Workbook_Openメソッドの他にAuto_Openメソッドでも可能です。
...ですが、私は最近はAuto_Openメソッド使用していません。

Workbook_Openメソッドを使った方がスマートだと(個人的には)思っているのが最大の理由ですが、Excel2000以降のバージョンでAuto_Openメソッドが安定動作しないことが頻発したからです。

個人的な拘りといわれそうですが、妙な個所で止まったり、コンパイルエラーが発生したりする事象が頻発する現実を考えると、怖くて使えません。

スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する