Excelの保護機能というものがあるが、行挿入やスタイルなど色々と制限されてしまって個人的にはあまり好きではない。
ただ、業務上お金に絡む部分とか一部のメンバーにしか見せたくない情報があったりもする。
それが全く別の情報ならブックを分ければよいが、予実管理とかみたいなのになれば、それはなかなか難しい。
いちいち同期させるのは手間で、形骸化の要因でもあるので、同じフック内にほしいところ。
ということで、マクロでできるだけのことをやってみた。
結論
先に結論まとめておく。
サンプルはGitにあるので好きに持って行ってください。
https://github.com/kometsubu/Excel/tree/main/01_SecretSheet
こんな感じでパッと見、シートが一つしか見えないようになっているが
でパスワードが正しければ、シートが切り替わる。
ちなみに、この原価管理シートから別のシートに移動すると、最初ようにシートが見えない状態になる。
実現方法
ということで実現方法を紹介
手順1.ブックを開いたときのイベントを定義
標準モジュールに下記の関数を定義
説明にもある通り、ブックを開いたときにメインになるシートに強制的に飛ばして
隠しておきたいシートを非表示設定にする。
ちなみに Visibleプロパティ だが下記のようになっているので間違えてfalseにしないように。
- true:表示
- false:非表示(非表示リストに出てくる)
- xlSheetVeryHidden(非表示リストにでてこない)
' ------------------------------------------
' フックを開いたときのイベント
' メインシートを強制的に表示する
' ------------------------------------------
Sub Auto_Open()
Sheets("原価管理").Visible = xlSheetVeryHidden
Sheets("予実管理").Activate
End Sub
手順2.非表示シートから離れた際のイベントを定義
非表示にしたいシートから離れるとそのシートをを非表示にする関数を非表示にしたいシートに追加します。
' -----------------------------------------------------
' 原価管理シートがアクティブでなくなったときのイベント
' 原価管理シートを非表示設定にする
' -----------------------------------------------------
Private Sub Worksheet_Deactivate()
Sheets("原価管理").Visible = xlSheetVeryHidden
End Sub
手順3.ボタン押下時の遷移イベントを定義
ここまでで、非表示シートを非表示にする処理を入れたので、最後に表示する処理を追加する。
これはどこでも良いのですが、標準モジュールに入れておきます。
' ------------------------------------------
' 原価管理ボタンが押されたときのイベント
' 原価管理シートを表示できるように設定して
' アクティブ状態にする
' ------------------------------------------
Sub onClick_ToCost()
If InputBox("パスワードを入力してください") <> PASSWORD Then
MsgBox "パスワードが違います"
Exit Sub
End If
Sheets("原価管理").Visible = xlSheetVisible
Sheets("原価管理").Activate
End Sub