エクセルでログイン画面を作成しています。
①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とパスワードを入力しないと先へ進めないようにしたいと考えています。(その他に動作については、意図することができるようになってます。)
コードの追加なのかコードの修正なのかどなたかご存知の方がいましたら詳しく教えてください。
よろしくお願い致します。
No.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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユニクロやGUのシフト管理アプ...
-
Excelのセルにユーザー名...
-
「@」(アットマーク)の無いメ...
-
メールのマナー編
-
LINE TCBというところからLINE...
-
インスタの捨て垢で友達のスト...
-
iPhoneのiCloudメールなよです...
-
runas実行した時にきかれるパス...
-
メールアドレスを人に教えるの...
-
YouTubeが毎回ログインしないと...
-
インスタのアイコンについてるN...
-
メールアドレスで上付きのハイフン
-
インスタのアカウントが削除さ...
-
メールをパスワードつきで送る方法
-
存在しないアドレスにメールを...
-
CDにパスワードをかける
-
メールアドレス 上バーの入力...
-
CSVファイルを添付するときにパ...
-
メールを返信したら、英語のメ...
-
エクセルで複数ファイルに同一...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelのセルにユーザー名...
-
YouTubeが毎回ログインしないと...
-
YahooIDをパスワード形式にした...
-
インスタの捨て垢で友達のスト...
-
iPhoneのiCloudメールなよです...
-
携帯電話を解約してもSMSの受信...
-
インスタの乗っ取り解除につい...
-
「@」(アットマーク)の無いメ...
-
メールを返信したら、英語のメ...
-
メールアドレスで上付きのハイフン
-
verify@twitter.comから、メー...
-
星の王子さまというアプリで、 ...
-
CSVファイルを添付するときにパ...
-
LINE TCBというところからLINE...
-
メールアドレス 上バーの入力...
-
ユニクロやGUのシフト管理アプ...
-
インスタのアイコンについてるN...
-
インスタのアカウントの消し方...
-
高一男子です 僕が絶対に悪いん...
-
メールをパスワードつきで送る方法
おすすめ情報