タイトルを悩んだのですけど、要するに次のような動作です。マクロ中で、ユーザーにパスワードなどを入れてもらうとき、
ここで正しいパスワードを入力してくれればいいのですが、間違えるときもありますよね。そんなときは、
のようなメッセージを出して、再び
の画面を出して、また入力させたい。正しいパスワードが入力されない限り、これを繰り返したいと。とはいえ、これを延々と無限に繰り返していては、マクロ作成者も、そのマクロを使っている人も、どちらも気まずくなって人間関係に影響が出るかもしれません。なので、適当なところで
みたいなメッセージを出して、処理を中止してしまおうと。そういう仕組みです。これ、けっこう多くの方が作れなくて困っているようですね。
まず、InputBoxを出して、間違ったパスワードだったらメッセージを出すところです。なお、ここでは正しいパスワードを"1234"としました。安易ですみません。
Sub Macro1() Dim A As String A = InputBox("パスワードを入力してください") If A <> "1234" Then MsgBox "パスワードが違います", vbExclamation End If End Sub
ここで「もしパスワードが間違っていたら、InputBoxの行に戻りたい(ジャンプしたい)」と考えてはいけません。「正しいパスワードが入力されるまで、InputBoxを繰り返したい」と考えます。これ、まったく意味が違いますよ。繰り返すのですから、これをDo Loopで囲みます。
Sub Macro1() Dim A As String Do A = InputBox("パスワードを入力してください") If A <> "1234" Then MsgBox "パスワードが違います", vbExclamation End If Loop End Sub
じゃ、正しいパスワードが入力されたかどうか、どうやって判定すればいいのでしょう。簡単です、それようの変数をひとつ使えばいいんです。一般的に、こうした目的で使う変数のことをフラグなどと呼びます。
Sub Macro1() Dim A As String, flag As Boolean Do While flag = False A = InputBox("パスワードを入力してください") If A <> "1234" Then MsgBox "パスワードが違います", vbExclamation Else flag = True End If Loop End Sub
落ち着いて考えてくださいね。ブール型の変数flagは、最初(初期値が)Falseです。もし、正しいパスワードが入力されたときだけ、この変数flagにTrueをセットします。ということは、正しいパスワードが入力されない限り、永遠に変数flagはFalseのままです。Do Loopの条件には「もし、変数flagがFalseだったら繰り返す」を指定しています。したがって、正しいパスワードが入力されない限り、このDo Loopは永遠に繰り返されます。
間違ったパスワードが"5回"入力されたかの判定も、間違えた回数をカウントする変数を用意します。
Sub Macro1() Dim A As String, flag As Boolean, N As Long Do While flag = False A = InputBox("パスワードを入力してください") If A <> "1234" Then MsgBox "パスワードが違います", vbExclamation N = N + 1 Else flag = True End If Loop End Sub
これで、パスワードを間違えるたびに、変数Nが1ずつ増えていきます。この変数Nが4のとき、さらに間違えたら、それは5回目の間違いです。そこで、処理を中止すればいいです。
Sub Macro1() Dim A As String, flag As Boolean, N As Long Do While flag = False A = InputBox("パスワードを入力してください") If A <> "1234" Then If N = 4 Then MsgBox "5回間違えたので処理を中止します", vbExclamation Exit Sub Else MsgBox "パスワードが違います", vbExclamation N = N + 1 End If Else flag = True End If Loop End Sub