VBAで作ったパスワード制御の落とし穴
Excelで特定のシートや情報を「見せたくない」「勝手に操作されたくない」という場面、業務でよくありますよね。
そんなとき、「パスワードをVBAで管理して、合っていたらシートを表示する」といった処理をしたファイルを見かけることがあります。
たとえば、こんなコードです。
Sub sh_password()
Dim pass As String
pass = InputBox("パスワードを入力してください")
If pass = "abc123" Then
Sheets("データ").Visible = True
Else
MsgBox "パスワードが違います"
End If
End Sub
InputBoxで入力するフォームを立ち上げて、パスワードを入れて、OKを押し、パスワードが合っていれば、「データ」シートが見えるようになる、という仕組みです。
上記だけを見ると、パスワードが分からなければ、データが開かないのか!と思いますが、実は落とし穴があります。
VBAでパスワード制御することの問題点
1. パスワードがコード内にそのまま書かれている
上の例では、"abc123"
というパスワードがコード内に直接書かれています。
これが何を意味するかというと、Visual Basic Editorを開けば誰でも簡単に見えてしまうということです。
仮にVBAプロジェクトにパスワードをかけていたとしても、それを解除する方法はネット上に多数出回っており、完全に守ることは困難です。
つまり、パスワードがあってないような状態になってしまいます。
2. マクロが無効なら、パスワードチェックすら機能しない
多くの人が見落としがちなのが、「マクロを有効にしないと、VBAの処理は一切動かない」という点です。
ファイルを開いたとき、次のようなメッセージが表示されることがあります。
セキュリティの警告:マクロが無効にされました
この状態であれば、InputBox
も、パスワードチェックも、シートの表示切替も、すべて無効になります。
つまり、マクロを有効化しないと制御自体が始まらないという、大きな問題があります。
3. シートの表示/非表示は簡単に切り替えられる
さらに問題なのが、非表示にしたシートを簡単に再表示できてしまうという点です。
たとえば次のようなコードを、マクロ画面や「イミディエイトウィンドウ」に入力するだけで、表示できてしまいます。
Sheets("データ").Visible = True
つまり、VBAの中でVisible = False
などで隠していても、少し詳しい操作ができる人であれば簡単に解除できてしまうのです。
本当に情報を守るには?Excel本来の保護機能を使う
情報を安全に管理したい場合、VBAで自作の制御をするのではなく、Excelが最初から備えている保護機能を活用することが最も確実です。
次の3つは、実務でも非常に有効な機能です。それぞれパスワードは表に見えない構造です。
1. シートの保護(パスワード付き)
- 「校閲」タブ →「シートの保護」
- 編集できる範囲を制御したり、数式を隠したりできます。
- パスワードも設定可能で、ユーザーによる意図しない変更を防止できます。
2. ブックの保護(構造の保護)
- 「校閲」→「ブックの保護」
- シートの追加・削除・名前の変更などの操作をパスワードで制御できます。
- データの構造そのものを壊されないようにできます。
3. ファイルのパスワード保護
- 「名前を付けて保存」→「ツール」→「全般オプション」
- 「ファイルを開くときのパスワード」や「書き込みパスワード」を設定可能です。
- この設定はマクロの有無に関係なく強力に保護されるため、より安全です。
「動くように見える」より「破られにくい」仕組みを
マクロで作られたパスワード制御は、一見すると「うまく動いている」ように見えるかもしれません
しかし、本当に大切なのは“破られにくい仕組み”であることです。
Excelの保護機能は、完璧ではないにせよ、VBAによる自作パスワード制御よりも圧倒的に安全性が高く、マクロ無効化の影響も受けません。
まとめ
- VBAでパスワードチェックを自作しても、コード内にパスワードが残り、すぐ見破られてしまう。
- マクロが無効な場合、そもそも制御が働かない。
- シートの表示状態は手動で簡単に変えられてしまう。
だからこそ、Excel本来の保護機能(シート保護・ブック保護・ファイルパスワード)を活用することが、実用的で効果的です。
「ちゃんと守りたい」なら、見た目ではなく本物の仕組みを選びましょう。
コメント