天使と悪魔選手権

エクセルでログイン画面を作成しています。
①Userform1
②Textbox1(ユーザーID)
③Textbox2(パスワード)
④Commandobutton1(ログイン)
⑤Commandobutton2(終了)
を配置し、エクセルシートには、ユーザーID、パスワードの登録シートを作成してます。

【標準モジュール】
Sub Sample()
Dim i As Byte
For i = 1 To Sheets.Count
If Sheets(i).Name = "登録" Then
Application.DisplayAlerts = False
Sheets(i).Delete
Application.DisplayAlerts = True
Exit For
End If
Next i
Sheets.Add(before:=Sheets(Sheets.Count)).Name = "登録"
For i = 1 To 3
Cells(i + 1, 1) = "名前" & i
Cells(i + 1, 2) = Chr(64 + i) & 0 & i
Cells(i + 1, 2).NumberFormatLocal = """(パス)""@"
Next i
Range("A1:B1") = Split("氏名, パスワード")
Range("A:B").EntireColumn.AutoFit
Range("A:B").HorizontalAlignment = -4108
End Sub

【This Workbook】
Private Sub Workbook_Open()
Sheets.Add before:=Sheets(1)
Sheets(1).Select
UserForm1.Show
End Sub

【User Form 1】
Private Sub CommandButton1_Click()
With Sheets("登録")
If WorksheetFunction.CountIf(.Range("A:A"), TextBox1.Text) > 0 Then
If WorksheetFunction.Index(.Range("B:B"), _
WorksheetFunction.Match(TextBox1.Text, .Range("A:A"), 0)) = _
TextBox2.Text Then
Application.DisplayAlerts = False
Sheets(1).Delete
Application.DisplayAlerts = True
MsgBox "ログイン", 64
End
Else: MsgBox "パスワード相違", 48
End If
Else: MsgBox "氏名相違", 48
End If
End With
End Sub


Private Sub CommandButton2_Click()

Application.DisplayAlerts = False
Application.Quit

End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
MsgBox "ユーザーIDとパスワードを入力して下さい"
Cancel = True
End If
End Sub

上記のようにコードを入力してますが、ユーザーIDとパスワードに何も入力せず、ログインボタンをクリックすると”WorksheetFunction クラスの Match プロパティを取得できません”というフォームが表示されその表示の終了をクリックするとログイン画面が消え、そのままログインできるようになります。

ユーザーIDとパスワードに何も入力せず、ログインをクリックした場合、”ユーザーIDとパスワードを入力して下さい”というフォームを表示させ、ユーザーIDとパスワードを入力しないと先へ進めないようにしたいと考えています。(その他に動作については、意図することができるようになってます。)
コードの追加なのかコードの修正なのかどなたかご存知の方がいましたら詳しく教えてください。
よろしくお願い致します。

A 回答 (1件)

こんにちは。



少し、癖のあるコードです。もしも、ご質問者と、このコードを書いた本人と同じでしたら、今の段階で直したほうがよいと思います。
(何を偉そうにと思うなら無視なさって結構です。)

1. MsgBox "ログイン", 64 ←数字で書く
Range("A:B").HorizontalAlignment = -4108 ←数字で書く

私も、数字で書く時はありますが、意図して使うだけです。組み込み定数の割り振りは、製作者側のものだから、それを、こちらの了解の元で決めてしまうと、ミスを起こすことがあります。MSが主要な場所で組み込み定数を変更することはないはずですが、名称を替えていることがあります。もう一つは、可読性が落ちるということです。

2.Else: MsgBox "パスワード相違", 48 
省スペースの書き方が、全体をスッキリさせることがありますが、この場合は、特に変化ありません。ベテランさんで、こういう書き方をする人もいますが。

If WorksheetFunction.Index(.Range("B:B"), _
WorksheetFunction.Match(TextBox1.Text, .Range("A:A"), 0)) = _
これは、うまくないです。なぜなら、Match関数が、Applicationエラーではなく、VBAエラーを吐き出すことを想定しているのですから、これでは全体が死んでしまいます。


Private Sub CommandButton1_Click()
 Dim i As Variant
 With Sheets("登録")
  If TextBox1.Text = "" Or TextBox2.Text = "" Then
    MsgBox "ユーザーIDとパスワードを入力して下さい", vbExclamation
    Exit Sub
  End If
  If WorksheetFunction.CountIf(.Range("A:A"), TextBox1.Text) > 0 Then
   i = Application.Match(TextBox1.Text, .Range("A:A"), 0)
   'あえて抜き出しました。
   If IsNumeric(i) Then
    If StrComp(.Cells(i, 2).Value, TextBox2.Text) = 0 Then
     Application.DisplayAlerts = False
     Sheets(1).Delete  '挿入削除を繰り返すと負荷が多くなります。
     Application.DisplayAlerts = True
     MsgBox "ログイン", 64
    Else
     MsgBox "パスワード相違", 48
    End If
   Else
    MsgBox "氏名相違", 48
   End If
   End If
  End With

 End Sub

Private Sub CommandButton2_Click()
 Application.DisplayAlerts = False '* 
 Application.Quit
 ThisWorkbook.Close False  '単独で開いている場合、Quit とコードが逆さになる
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
 If CloseMode = vbFormControlMenu Then
  MsgBox "終了ボタンを使ってください。", vbInformation
  Cancel = True
 End If
End Sub

なお、登録シートは、xlSheetVeryHedden で扱った方がよいと思います。

一例/終了する時も同等のものを作ります。
Private Sub Workbook_Open()
 If Worksheets("登録").Visible <> xlSheetVeryHidden Then
  Worksheets("登録").Visible = xlSheetVeryHidden
 End If
 UserForm1.Show
End Sub
    • good
    • 0
この回答へのお礼

大変詳細にご回答いただきありがとうございました。コードを修正したところうまく動作しました。大変勉強になりました。

お礼日時:2017/07/14 01:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!