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:保存先の場所を常にデスクトップにする

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

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

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

Excel:改行を含むテキストを置換する

Microsoft Excelで、セルの中で改行しているテキストを置換する方法です。 以下のように、 あああ いいい という改行を含むテキストを「おおお」というテキストに置換します。 改行を含めたテキ…続きを読む

Excel VBA:フォルダを開く

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

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

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

Excelで開発タブを表示する

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

Excel:起動時に「MICROSOFT365を試す」と表示される

MicrosoftExcel2016を使っていて、あるときから起動時に「MICROSOFT365を試す 1TBのクラウドストレージで、ファイルを安全に保護し、ファイルにいつでもアクセスできるようになり…続きを読む

Excel VBA:メールを送信する

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

Excelのフォームのタブオーダーを指定する

Excelでフォームを設定し、部品を複数配置していると、タブキーやEnterキーを押すと次の部品にフォーカスを飛ばすことができます。 この順序が意図したとおりでない場合に、自分で設定する方法を調べまし…続きを読む

Excel:別のExcelファイルの値を参照したファイル

Excelでは、別のExcelファイルの値を参照させることができます。 その際、2つのExcelを開いておき、一方から他方のセルをクリックすることで参照させることができます。 このとき、参照先のExc…続きを読む