HOME技術ExcelExcel VBAでログイン管理をする

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にします。
この場合、保存した際に保存動作を実行します。

関連記事

Excel VBA:特定のシートをコピーして別ブックを生成する

Excel VBAで、特定のシートの値をすべてコピーして、新しい別のExcelブックを生成してそのシートに貼りつけます。 なお、ブックを生成した後は、各自で保存します。 コード Worksheets(…続きを読む

Excel:保存先の場所を常にデスクトップにする

Microsoft Excel2019で新規に保存をしようとするとOne Driveなどが最初に候補にあがってきてしまい、コンピュータ上に保存したいときに、いちいちデスクトップを指定するのに手間取りま…続きを読む

Excelでワークシートを追加しようとすると「名前が変更されたか、移動や削除が行われた可能性があります」というエラーが表示される

Excelでワークシートを追加しようとしたら、「****\ワークシート.xlsxが見つかりません。名前が変更されたか、移動や削除が行われた可能性があります。」と表示されて、ワークシートを追加することが…続きを読む

Excel VBA:最終行番号を取得する

Excelでデータ管理をしていて、VBAでその全データに対して何らかの処理を行う場合、1行目から最終行までループさせて処理を1行ずつ行う場合には、最終行を取得する必要があります。 今回は、最終行を取得…続きを読む

Excelで起動時にフォームのみ表示する

Excelで起動時にフォームを表示し、Excelそのものの表画面は非表示にする方法です。 起動時にフォームを表示する 「開発」→「コードの表示」から「Microsoft Visual Basic fo…続きを読む

Excel VBAで他のプログラムを実行し処理が終わってから次の処理をする

CreateObject(“WScript.Shell”).Runを使って他のプログラムを実行する場合、デフォルトだと起動したプログラムの処理が終わる前に次の処理に移ってしまい…続きを読む

Excel VBAで他のプログラムを実行する際にウィンドウを最小化する

Excel VBAで他のプログラムを実行した際に、実行しているプログラムのウィンドウを最小化表示にする方法です。 CreateObject(“WScript.Shell”).R…続きを読む

Excel VBA:メールを送信する

Excel VBAからメールを送信するボタンをつくります。 パスワードロックをかけたブックを利用していて、パスワードがわからなくなったらメールを送信してパスワードを教える機能を付けようと思い、調べまし…続きを読む

Excelで数式のみをコピーする

Excelで数式だけをコピーして貼り付ける方法です。 以下のように、セルC6に入力されている数式を、セルD6にコピーしたい場合、セルの右下をドラッグしてD6に持っていくと枠線やセルの背景色などの余計な…続きを読む

Excelで数字をコピーしたときに連番にならない

Excelで数字が入力されているセルの右下にマウスカーソルを合わせて、下にコピーしていくと、通常は数字が1つずつ足された連番の値でコピーされていきます。 それが何度やっても、何をやっても連番にならなか…続きを読む