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でコマンドプロンプトを起動し、かつコマンドを実行する方法です。 コマンドプロンプトの実行 コマンドプロンプトを実行するには以下のように書きます。 CreateObject (&#82…続きを読む

Excel VBA:指定した列を非表示にする

Excel VBAで、予め指定した列を非表示にします。 コード hiddenColumn = Array(3, 4, 5, 6) For i = 0 To UBound(hiddenColumn) W…続きを読む

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

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

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

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

Excelで開発タブを表示する

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

Excel VBA:フォルダを開く

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

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

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

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

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

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

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

Excel VBAで「はい」「いいえ」の条件分岐をする

Excel VBAでメッセージ(質問)を表示して、ユーザに「はい」「いいえ」の選択をさせて、その結果で処理を分岐させる方法です。 if文による条件分岐 条件分岐には以下のようなif文を使います。 If…続きを読む