ログイン

ログインのダイアログを表示して、ユーザーID、パスワードを入力する処理をまとめてみました。ここでのポイントは開始時にログインのダイアログのみを表示してExcelのウィンドウを表示しないようにすることです。Excelのウィンドウを表示しないようにするためにはちょっとした工夫が必要です。

  1. ) ログインのダイアログの作成
    次のようなダイアログをUserFormで作成します。UserForm名をここではfrmLoginとしています。
    excel/Login.jpg
     
    パスワード入力を*で表示するために、パスワードを入力するテキストボックスのPasswordCharのプロパティーに*を設定します。
    excel/PasswordChar.jpg
  2. ) ログインのダイアログのプロシージャ
    ログインのダイアログに以下のようなプロシージャを作成します。
    キャンセルボタンが押された場合は自分自身の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
    
  3. ) 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
    
  4. ) Workbookの保存方法
    Workbookを保存する場合、一度はExcel Workbookを非表示にしてから保存します。表示したまま保存すると次回表示した時に、一瞬Excelのシートが表示されてしまいます。そのためWorkbook_BeforeCloseイベントの時に非表示にしていますが、終了時に表示される「'xxxxxxxxxx.xls'への変更を保存しますか?」のダイアログで「保存しない」を選択すると次回の起動時に表示されてしまいます。しかし、一度非表示で保存すると、「'xxxxxxxxxx.xls'への変更を保存しますか?」のダイアログで「保存しない」を選択されても元々が非表示なので、次回起動時も非表示のままとなります。但し、途中で表示状態で保存して、終了時に「保存しない」を選択されてしまうと次回起動時に一瞬表示されてしまいます。
  5. ) 標準モジュールのプロシージャ
    標準モジュールには次のような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
    

最終更新のRSS
Last-modified: 2014-03-11 (火) 01:58:42 (3692d)