以下の内容はhttps://www.limecode.jp/entry/fungo/075-login-formより取得しました。


75本目:ログインフォームの作成

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:ログインフォームの作成

#VBA100本ノック 75本目
ブックを開いたら「ログイン」フォームを表示しIDとパスワードを入力してもらうVBAを作成します。
IDとパスワードは「ID」シートに登録されています。
IDまたはパスワードを3回間違ったらブックを閉じてください。
正しく入力されたら「ログイン」フォームを閉じてください。

ログインフォーム
◇ 出題ページはこちら

ソースコード

Formモジュール

Option Explicit

' 100本ノック075:ログインフォームの作成

Private パスワード誤入力回数 As Long

Private Sub btnログイン_Click()

    If IsIDとPWの入力が正しい(txtBoxID入力欄.Value, txtBoxPW入力欄.Value) Then
        Me.Hide
        Exit Sub
    End If

    パスワード誤入力回数 = パスワード誤入力回数 + 1
    
    If パスワード誤入力回数 < 3 Then
        MsgBox "IDまたはパスワードが違います。"
    Else
        MsgBox "3回入力に失敗したため強制終了します。"
        ThisWorkbook.Close False
    End If

End Sub

Private Function IsIDとPWの入力が正しい(入力ID As String, 入力PW As String) As Boolean

    If 入力PW = "" Then Exit Function

    On Error Resume Next
    Dim 登録PW As String
    登録PW = Fx.VLookup(入力ID, WSID.Columns("A:B"), 2, False)
    On Error GoTo 0
    
    IsIDとPWの入力が正しい = (入力PW = 登録PW)

End Function

ThisWorkbookモジュール

Private Sub Workbook_Open()

    Formログインフォーム.Show vbModal

End Sub

汎用関数モジュール

Option Explicit

' WorksheetFunctionの短縮取得
' 参考:https://www.limecode.jp/entry/utility/shortcall-worksheetfunction
Function Fx() As WorksheetFunction
    Set Fx = WorksheetFunction
End Function

解説

ユーザーフォームを扱う問題です。

シンプルなテキストボックスとボタンのみのフォームで、

  • 「txtBoxID入力欄.Value」でテキストボックスの値を取得
  • 「Private Sub btnログイン_Click」でボタンからマクロを実行

という教科書的なコードで実装しています。


IDとPWのペアのチェックにはVLOOKUP関数を使用しました。

このあたりの処理がWorksheetFunctionで簡単に書けるのが、
ExcelVBAの良いところですね。


ひとつ注意すべき点として、

If 入力PW = "" Then Exit Function

この分岐をしっかり書いておかないと、
IDとPWを共に省略した際に常にログインできるようになってしまいます。

「入力PW = 登録PW」の判定を行う際に、
登録がエラーで""となり、入力の""と一致してしまいますからね。


こういった「初期値の一致」による判定エラーはよく起きますので、
テストの際にしっかり確認しておきましょう。




以上の内容はhttps://www.limecode.jp/entry/fungo/075-login-formより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14