ログイン †
ログインのダイアログを表示して、ユーザーID、パスワードを入力する処理をまとめてみました。ここでのポイントは開始時にログインのダイアログのみを表示してExcelのウィンドウを表示しないようにすることです。Excelのウィンドウを表示しないようにするためにはちょっとした工夫が必要です。
- ) ログインのダイアログの作成
次のようなダイアログをUserFormで作成します。UserForm名をここではfrmLoginとしています。
パスワード入力を*で表示するために、パスワードを入力するテキストボックスのPasswordCharのプロパティーに*を設定します。
- ) ログインのダイアログのプロシージャ
ログインのダイアログに以下のようなプロシージャを作成します。
キャンセルボタンが押された場合は自分自身のWorkbookのみを終了します。
Private Sub btnCancel_Click()
ThisWorkbook.Close
End Sub
Private Sub btnOK_Click()
Dim LogInResult As Boolean
Dim sht As Worksheet
LogInResult = Login(Me) '←ログインの検証プロシージャをCall
If LogInResult = True Then '←ログインの検証結果がOKの場合
Set sht = ThisWorkbook.Sheets("Menu")
sht.Cells(2, 7) = Me.txtUserID
Me.Hide '←ログインダイアログを閉じる
'***** Excelを開く前にする処理があればここにそのプロシージャを記述します。*****
'ここでは自分自身のシートを表示していますが表示せずに、
Windows(ThisWorkbook.Name).Visible = True '←自分自身のWorkbookを表示する。
ThisWorkbook.Application.Visible = True '←Excelのウィンドウを表示する。
'既に開かれていてもエラーにはならない。
End If
End Sub
- ) Workbookのプロシージャ
Workbookには以下のようなプロシージャを作成します。
先ずOpenの時に自分自身を非表示にする処理です。非表示はExcelのウィンドウの非表示と自分自身のWorkbookの非表示をします。但し、他のExcelが既に開いていた場合、Excelのウィンドウを非表示にすると、他のExcelまで非表示になるので、以下の処理中Me.Application.ActiveWorkbook.Nameでエラーが無かった場合は他のExcelが開いていると判断し、エラーが発生した場合にExcelのウィンドウを非表示(Me.Application.Visible = False)にしています。最後にログインのダイアログを表示します。
Private Sub Workbook_Open()
Dim temp As String
On Error Resume Next
'他のExcelが開いているかをチェックするためのダミー処理
temp = Me.Application.ActiveWorkbook.Name
If Err.Number = 91 Then '←他のExcelが開いていない場合
Me.Application.Visible = False '←Excelウィンドウの非表示処理
End If
Windows(Me.Name).Visible = False '←自分自身のWorkbookの非表示処理
frmLogin.Show '←ログインダイアログの表示
End Sub
自分自身を閉じる時に、次回起動される時に初めから非表示で起動されるように、非表示にしてから終了します。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Windows(Me.Name).Visible = False
End Sub
開発中に何らかの原因で、Visual Basic Editorが開いているけれど、Excelウィンドウが非表示のままになってしまった時の対策として、次のプロシージャを作成しておきます。Excelウィンドウが非表示になってしまった場合実行します。Excel Workbookが非表示の場合はExcelのメニューバーから再表示にします。
Sub Application_Visible()
Me.Application.Visible = True
End Sub
- ) Workbookの保存方法
Workbookを保存する場合、一度はExcel Workbookを非表示にしてから保存します。表示したまま保存すると次回表示した時に、一瞬Excelのシートが表示されてしまいます。そのためWorkbook_BeforeCloseイベントの時に非表示にしていますが、終了時に表示される「'xxxxxxxxxx.xls'への変更を保存しますか?」のダイアログで「保存しない」を選択すると次回の起動時に表示されてしまいます。しかし、一度非表示で保存すると、「'xxxxxxxxxx.xls'への変更を保存しますか?」のダイアログで「保存しない」を選択されても元々が非表示なので、次回起動時も非表示のままとなります。但し、途中で表示状態で保存して、終了時に「保存しない」を選択されてしまうと次回起動時に一瞬表示されてしまいます。
- ) 標準モジュールのプロシージャ
標準モジュールには次のようなLogin関数と起動時に必要な処理のプロシージャ(アプリケーション毎に異なるのでここには記述していません。)を作成します。
Login関数のパラメータには、図形のところで述べたようにUserForm自身を与えています。
ここでは例として管理者用のパスワードを"administrator"、ユーザーIDとパスワードを"compass"としています。実際にはユーザー検証処理は複雑になります。
Function Login(frmOBJ As UserForm) As Boolean
Dim UserID As String
Dim PassWd As String
Login = False
UserID = frmOBJ.txtUserID
PassWd = frmOBJ.txtPasswd
'***** ユーザー検証処理をここに記述 *****
If frmOBJ.txtPasswd = "administrator" Then
frmOBJ.txtUserID = "administrator"
Login = True
ElseIf UserID = "compass" And PassWd = "compass" Then
Login = True 'OKの場合 Login = True を設定する。
Else
MsgBox "ユーザーIDまたはパスワードが違います。"
End If
End Function