Excel VBAでログイン管理をする
Excelを開いたときに「閲覧のみ」ユーザか「管理者」ユーザかを選び、「閲覧のみ」ユーザの場合にはExcelを閉じるときに保存できないようにして、「管理者」ユーザの場合には、Excelを閉じるときに変更があれば保存するか否かを確認するようにします。
フォームの生成
まず、起動時にユーザ選択フォームを表示します。
「開発」→「コードの表示」でVisual Basic for Applicationsを開きます。
「挿入」→「ユーザーフォーム」をクリックします。
ツールボックスから、フォームに「コマンドボタン」を2つと、「ラベル」と「テキストボックス」を1つずつドラッグします。
コマンドボタンのプロパティを表示し、一方のキャプションを「閲覧のみ」、オブジェクト名を「readonlyUser」にします。
もう一方のコマンドボタンは、キャプションを「管理者」、オブジェクト名を「adminUser」にします。
テキストボックスのプロパティで、オブジェクト名を「passwordBox」にします。
ラベルは、キャプションを「パスワード」にして、テキストボックスの隣に配置します。
最後に、フォーム全体を選択して、フォームのオブジェクト名を「menu」にします。
起動時にフォームを表示する
VBAProjectの「Microsoft Excel Object」以下の「ThisWorkbook」をダブルクリックして、以下のコードを入力します。
Private Sub Workbook_Open()
Mode=1
menu.Show
End Sub
Workbook_Open()は、Excelのブックを開くときに読み込まれるプロシージャです。
Mode=1は、後で説明します。
menu.Showは、フォーム「menu」を表示する、という意味です。
グローバル変数を設定する
VBAProjectの「標準モジュール」以下の「Module1」をダブルクリックして、以下のコードを入力します。
Public Const Pass = “aaa”
Public Mode As Integer
このコードはModule1の中の、他のプロシージャ内ではなく、一番先頭に書きます。
こうすることですべての場所から参照することができる変数(グローバル変数)になります。
Public Const Pass = “aaa”は、定数としてパスワードを設定しています。
Constを変数の前につけると定数になります。
aaaはこのExcelブックの管理者用のパスワードとします。
Public Mode As Integerは、Modeというグローバル変数を宣言しました。
グローバル変数に指定しておくことで、どのユーザでログインしているのかを保持することができるようになります。
ボタンをクリックしたときの動作を設定する
VBAProjectの「フォーム」以下の「menu」をダブルクリックして表示されたメニューのうち、「閲覧のみ」のボタンをダブルクリックしてコード画面を開き、以下のように入力します。
Private Sub readonlyUser_Click()
Unload menu
End Sub
「閲覧のみ」ユーザの場合は何もせずにフォームを閉じます。
Unload menuで、menuというフォームを閉じます。
続いて、以下のコードを入力します。
Private Sub adminUser_Click()
Dim adminPass As String
adminPass = Me.passwordBox
if adminPass = Pass Then
Mode = 2
Else
MsgBox (“パスワードが違うので閲覧ユーザでログインします”)
End If
Unload menu
End Sub
adminUserボタン(管理者ボタン)をクリックしたときの処理です。
adminUserボタンをクリックしたら、adminPassという変数に、フォーム上のpasswordBoxという名前のテキストボックスの値を格納します。
passwordBoxの値が、グローバル変数に設定したPassの値と同じであれば、管理者であると認め、Modeを2にします。
passwordBoxとPassの値が異なるときは、パスワードが違う旨のメッセージを表示し、Modeは変更しません。
いずれの場合でも最後にUnload menuでメニューを閉じます。
Excelを閉じるときの動作を設定する
ここで設定する内容は、Excelブックを閉じるときに、管理者の場合は保存するか否かを聞き、閲覧のみの場合は何も聞かない、という設定です。
閲覧のみの場合でも、保存するか否かのダイアログを開いても構わない場合には、設定する必要はありません。
VBAProjectの「標準モジュール」以下の「Module1」をダブルクリックします。
以下のコードを入力します。
Sub Auto_Close()
Dim tf
If Mode = 1 Then
tf = True
Else
tf = False
End If
ActiveWorkbook.Saved = tf
ActiveWorkbook.Close
End Sub
Auto_Close()は、Excelブックが閉じるときに呼ばれるプロシージャです。
変数Modeが1の場合、変数tfの値をTrueに、
Modeが1ではない場合、tfの値をFalseにします。
先に、Workbook_Open()でModeの値を1に設定しています。
つまり管理者でログインしない限りModeの値は1になります。
ActiveWorkbook.Saved = Trueは、Excelブックが上書き保存をする必要がない状態であることを意味します。
つまり、Excelブックを閉じるときに「保存しますか?」と確認されなくなります。
ActiveWorkbook.Saved = Falseだと、Excelブックを開いた後で編集されていた場合に、上書き保存する必要がある状態であることを認識できるようになります。
つまり、Excelブックを閉じるときに「保存しますか?」と確認されるようになります。
これにより、管理者でログイン(Mode=2)のときに、Excelの内容が編集された場合に保存するか否かを聞くようになります。
通常の保存はできないようにする
VBAProjectの「Microsoft Excel Objects」以下の「ThisWorkbook」を開き、以下のコードを入力します。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Mode = 1 Then
Cancel = True
Else
Cancel = False
End If
End Sub
保存する前に実行されるプロシージャになります。
Mode=1、すなわち「閲覧のみ」ユーザである場合には、Cancel=Trueにします。
この場合、保存しても保存動作がキャンセルされ、保存されません。
Mode=2、すなわち「管理者」ユーザである場合には、Cancel=Falseにします。
この場合、保存した際に保存動作を実行します。
関連記事