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 VBA:フォルダを開く

Excelでボタンをクリックしたらフォルダを開くようにするVBAです。 Shell EXPLORERPATH & OPENFOLDER , vbNormalFocus EXPLORERPATH…続きを読む

Excelで計算式を入れたセルに計算結果が反映されない

Excelで計算式を予め設定していたにもかかわらず、数値を入力してもそのセルに計算結果が反映されない時があります。 通常、自動計算する設定になっていますが、これが手動計算に変わっていることが原因です。…続きを読む

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

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

Excelで開発タブを表示する

ExcelでVBAをつくるときに「開発」メニューを使いますが、最初は表示されていません。 「開発」を表示するには、Excelを起動して、「ファイル」→「オプション」→「リボンのユーザー設定」から、「リ…続きを読む

Excelでセルに入力できる文字数制限を設定する

Excelで、セルに入力できる字数の制限を設定する方法です。 全角・半角問わず字数制限する メニューから「データ」を選択し「データの入力規則」をクリックします。 データの入力規則設定画面で、「設定」タ…続きを読む

Exdel VBA:グローバル変数の指定

Excel VBAでグローバル変数を設定する方法です。 プロシージャ内で宣言した変数は、そのプロシージャ内でしか通用しません。 すべてのプロシージャから参照するような定数を設定する場合には、以下のよう…続きを読む

Excel VBA:フィルタを操作して絞り込む

Excel VBAでフィルタ操作をして、行を絞り込みむ方法です。 コード Sub autoFilter(Retsu, Atai) Worksheets(“シート名”).Rang…続きを読む

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

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

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

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