今回はExcelの機能を使ったパスワード設定ではなく、VBAのInputBox関数を使用した自作パスワードを設定する方法をご説明します。
ファイルを開いた時にInputBoxを開いてパスワードを求めて、パスワードと一致した場合はファイルを開き、間違えたらファイルを閉じるというVBAです。
この方法はExcelでパスワード設定するほど強固なセキュリティにはなりません。
ですが、仮に開発者がパスワードを忘れてしまってもマクロを無効にしてファイルを開いてVBEを見る事でパスワードが確認できます。
また、今回の方法を応用すると使用できる機能を制限する「権限管理」等もできます。
InputBoxの使い方やシートの保護/解除、ブックの保護/解除の方法については次の記事をご覧ください。
1.InputBoxの使い方
簡単にですが、InputBoxの使い方をご説明します。
InputBoxはInputBox関数とInputBoxメソッドの2種類あります。
今回はInputBox関数を使ってパスワードを設定しますが、InputBoxメソッドでも同じ事は可能です。
それぞれの違いを簡単にご説明します。
InputBox関数とInputBoxメソッドの違い
InputBox関数はVBAの関数の一つです。
InputBoxメソッドはExcelのAppicationです。
InputBox関数はWord、Access、PowerPointなど他のOfficeでも使用できますが、InputBoxメソッドはExcel専用のAppicationで、他のOfficeには使えません。
記述方法はそれぞれ次の様に記述します。
InputBoxメソッド = Application.InputBox("文字列")
InputBox関数 = InputBox("文字列")
また、記述方法が違う以外にも、入力出来る文字のタイプを指定する引数のTypeを指定できるかどうか、ボタンの位置等の違いがあります。
2.InputBox関数の使い方
記述方法は次の通りです。
InputBox(Prompt,[Title],[Default],[XPos],[YPos],[HelpFile],[Context])
InputBox関数の引数一覧
引数名 | 省略/必須 | 説明 |
Prompt | 必須 | 入力ダイアログボックス内に表示するメッセージの文字列を指定します。 「vbCr、vbLf、vbCrLf」を使用する事で改行できます。 |
Title | 省略可能 | 入力ダイアログボックスのタイトルバーに表示する文字列を指定します。 省略するとApplication名が表示されます。 |
Default | 省略可能 | 入力用のテキストボックスに既定値で表示する文字列を指定します。 |
XPos | 省略可能 | 入力ダイアログボックスを表示する位置のX座標を指定します。 |
YPos | 省略可能 | 入力ダイアログボックスを表示する位置のY座標を指定します。 |
HelpFile | 省略可能 | ダイアログボックスに状況依存のヘルプを設定するために使用する、 ヘルプファイルの名前を指定します。 |
Context | 省略可能 | ヘルプトピックに指定したコンテキスト番号を表す数式を指定します。 |
引数の説明を見ただけでは、使い方がわかりにくいので、サンプルコードです。
基本的なサンプルコード
Sub Sample1()
Dim GetStr As String
GetStr = InputBox("Prompt", "Title", "Default")
End Sub
図のようにそれぞれの引数名が、各引数の場所に表示されました。
2.InputBox関数でパスワードの設定方法
次はInputBox関数を使用して、パスワード設定をする方法です。
パスワード設定する方法
パスワード設定する方法をご説明します。
- パスワード設定したいExcelファイルを準備する
- InputBoxを表示するプロシージャを準備する
- InputBoxを表示するプロシージャにパスワードの仕組みを組み込む
- Workbook_Openイベントプロシージャを用意する
- Workbook_OpenイベントプロシージャからInputBoxプロシージャを呼び出す
ざっくり書くとこんな感じです。
たくさん準備するものがあるようにも感じますが、実際にやってみるととても簡単です。
サンプルコードを使いながら説明したいと思います。
3.パスワードを設定するサンプルコード
パスワードを判定するコード
パスワードの判定をするメインのコードです。
上記の「パスワード設定する方法」の2,3つ目に該当します。
Sub Sample2()
Const PassWord As String = "0000"
Dim GetPass As String
GetPass = InputBox("パスワードを入力してください。", "パスワード入力")
'■キャンセル判定
If StrPtr(GetPass) = 0 Then
MsgBox "キャンセルされました。" & vbCrLf & _
"ファイルを閉じます。"
'■未入力判定
ElseIf GetPass = "" Then
MsgBox "未入力です。" & vbCrLf & _
"ファイルを閉じます。"
'正常に入力
Else
If GetPass = PassWord Then
MsgBox "パスワードは正しいです。"
Else
MsgBox "パスワードが違います。" & vbCrLf & _
"ファイルを閉じます。"
ThisWorkbook.Close
End If
End If
End Sub
コードの説明
コードの説明です。
「Const PassWord As String = “0000”」でパスワードの決めます。
「Dim GetPass As String」はInputBoxに入力された値を格納する変数です。
「GetPass = InputBox(“パスワードを入力してください。”, “パスワード入力”)」でInputBoxを開き、入力された値をGetPassに格納します。
「If StrPtr(GetPass) = 0 Then」でキャンセルや×ボタンが押されたか判定しています。
同時に未入力でOKを押されたかも判定して、どちらでもない場合に初めてパスワードの判定を行います。
Workbook_Openイベントのサンプルコード
Workbook_Openイベントの使い方については「ファイルを開く時にマクロを実行する方法」をご覧ください。
上記の「パスワード設定する方法」の4,5つ目に該当します。
簡単に説明します。
下の図の青い線に囲まれた「ThisWorkbook」モジュールに記載します。
開くと次のような「General」と「Declarations」となっています。
この「General」をクリックすると「Workbook」を選択できますので、「Workbook」にします。
「Private Sub Workbook_Open()」
が自動で生成されますので、ここに先ほどのパスワードを設定するメインのプロシージャを呼び出します。
Private Sub Workbook_Open()
Call Sample2
End Sub
これでファイルを開いた時に「Sample2」が実行され、正しいパスワードが入力されなければファイルが閉じてしまいます。
4.パスワードを判定する部分を分割したコード
先ほどは「Sample2」にまとめて記載しましたが、次のようにInputBox部分とパスワード判定部分を分ける事と次のようになります。
InputBox部分
Sub Sample3()
Const PassWord As String = "0000"
Dim GetPass As String
GetPass = InputBox("パスワードを入力してください。", "パスワード入力")
Call Sample4(GetPass, PassWord)
End Sub
パスワード判定部分
Sub Sample4(ByVal GetPass As String, ByVal PassWord As String)
'■キャンセル判定
If StrPtr(GetPass) = 0 Then
MsgBox "キャンセルされました。" & vbCrLf & _
"ファイルを閉じます。"
'■未入力判定
ElseIf GetPass = "" Then
MsgBox "未入力です。" & vbCrLf & _
"ファイルを閉じます。"
'正常に入力
Else
If GetPass = PassWord Then
MsgBox "パスワードは正しいです。"
Else
MsgBox "パスワードが違います。" & vbCrLf & _
"ファイルを閉じます。"
ThisWorkbook.Close
End If
End If
End Sub
5.まとめ
今回の方法は、1つひな形を用意してしまえば簡単に実装できるパスワード設定方法です。
また、Shiftを押しながらファイルを開く事でVBE内に書かれたコードを見る事も可能(保護していなければ)です。
そのため、パスワードを忘れてしまっても対応できる反面、VBAをよく理解している人には通用しないので、セキュリティ面では強固とは言えません。
また、文頭でも記載していますが、判定部分を変更する事で権限管理設定などに応用できます。