VBA100本ノック 75本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ
問題
#VBA100本ノック75本目
ブックを開いたら「ログイン」フォームを表示し、
IDとパスワードを入力してもらうVBAを作成します。
IDとパスワードは、「ID」シートに登録されています。
IDまたはパスワードを3回間違ったら、ブックを閉じてください。
正しく入力されたら、「ログイン」フォームを閉じてください。

解答
Dim Misscnt As Long
Private Sub UserForm_Initialize()
Misscnt = 0
End Sub
Private Sub btnLogIn_Click()
Application.DisplayAlerts = False
Dim ws As Worksheet: Set ws = Sheets("ID")
Dim X As String
X = WorksheetFunction.XLookup(Me.txtID, ws.Range("A:A"), ws.Range("B:B"), "なし")
If X = Me.txtPass.Text Then
Unload Me
Else
Misscnt = Misscnt + 1
If Misscnt = 3 Then
ThisWorkbook.Close False
End If
End If
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
MsgBox "ログインボタンを押してね"
Cancel = True
End If
End Sub
■考え方・流れ
0:00 冒頭・問題確認
2:03 ブック起動時にフォームを起動する
3:34 入力されたIDとパスを取得
5:53 IDとパスが一致すればフォームを終了する
7:43 “3回間違えたら”という条件の追加
10:18 キャンセルボタンの挙動を設定する

ユーザーフォームの
問題ですね!

全Excelユーザー必見だな!

必須ではないぞ…
ブック起動時にフォームを起動する
さて!じゃあまずは…
下記2点を実装しよう!!
これは復習だぞ!!

ブック起動時にマクロを実行したい場合は…
ブックモジュールを開いて…

Workbook_Openイベントが挿入できたね!!

そして…ユーザーフォームの表示は…
フォーム名.Show
だったね!


ここまではごりっごりの復習だぞ!!
入力されたIDとパスを取得
よし!そしたらお次!
お次は入力されたIDとパスをどうやって取得するかだ!!!
これらは、ログインボタンを押したときに入っているものを表示したいから…
ログインボタンをダブルクリックすると…

こんな感じで↓このボタンを押したときに実行されるマクロを作成できる!!

中身について!!
Me.オブジェクト名.Textで値を取得できるぞ!!

実行結果↓

IDとパスが一致すればフォームを終了する
お次!!
ちゃんとIDとパスがあってた場合(IDシートに対応する情報があった場合)
ログイン成功!!ってことで、フォームを終了しよう!

ま、VLOOKかその辺でA列を検索して、B列のパスを拾ったらいけるよね!

テキトーに変数「X」を作って、XLOOKUPの結果を代入!

もしXがパスワードと同じだったら…フォーム終了!(Unload Me)

ほんで、もし間違ってた場合は…
即刻強制終了しちゃうか!!一旦ね!!

3回間違えたら”という条件の追加
お次!仏の顔も三度(二度??)まで!!
IDとパスがもし一致してなくても、2回までは許してやろう?
お初にお目にかかる、グローバル変数というものを使っていってみよう!

ここ…ちょっとドドドっと進めました!!
一番上(Option Explicitの下)に Dim Miiscnt as Long ってのを宣言。
これがグローバル変数ってやつだね!

簡単に言うと、別のプロシージャでも使いまわせる変数のこと!!

今回…ミスしても3回までは許してあげたい!
つまり、最後ログインのフォームを表示するコードを実行したい!
でも!数はカウントしておきたい!
そんな時にはここを使ってあげよう!

こうしてあげれば~Misscntって変数がぁ~
まわりまわって~!
カウントできるのさぁ~!

キャンセルボタンの挙動を設定する
よし!これで全ておわりや!!と思ったそこのあなた…
ツメが甘すぎる…
こんなもん…天才ハッカーどころか…部長ですら突破できちゃうぞ…なぜなら…

閉じるボタンを押せば、フォーム自体が終了しちゃうからねっ!ww

なんてこった…
でも安心して!!
この「閉じる」ボタンの挙動も制御できるからね!

それがこの!!UserForm_QueryColse!!



UserForm_QueryCloseに関しては…調べたら使い方は分かると思う!
CancelをTrueにしたら、その操作は実行しまへんで~!ってイメージ!!
この、Cancelってのが意外といろんなところで出てくるから、覚えておくといいかもね!

終わりです!!お疲れさまでした!

惜しい…
誰でもログインできそうだったのに…!

アホなこと考えんといてください!
あとがたり
おはこんばんちは。uぷ主です。
75本目、IDとパスを求めるフォームを作成する問題でした!!
いやぁ~フォームは難しいっす…
しかも今回みたいに…
3回まで!とか、条件が付くと途端に難しいっすね。
もっと精進しなければ…
あ、そういや、何気に初めてグローバル変数についても解説しました。
あ、ちなみにuぷ主は昔、全部の変数をグローバルにしてたことありましたよww
グローバル覚えたての頃ねww
あれ、やりたくなりません?ww
そういうところがダメなんだろうなぁ…
コメント