こんにちは!かいけつマクロです。
「Excelマクロで電卓を自作しよう」も、いよいよ最終回です!!皆さんここまでよく頑張ってきました!
今回は、前回用意した変数「buf」を使い、適切な値が入力されるまで、再度ユーザに入力を促すような仕組みを作っていきます。
それでは、張り切ってまいりましょう!
「適切な値が入力されるまで、再度ユーザに入力を促す仕組み」の作り方
さて、「適切な値が入力されるまで、再度ユーザに入力を促す仕組み」は、こちらの2段階で作っていきます。
- インプットボックスに入力された値が、適切な値であるか判定する
- 適切な値でない場合、もう一度、インプットボックスを表示する
こんな感じのイメージです。
条件に合致するまで、「繰り返し」処理を行う
このように、「条件に合致するまで、「繰り返し」処理を行う」という命令を出したいときに使えるのが、「Do~Loop」です。どのように記述するか、実際に見てみましょう。
'1つ目の数字--------------
'インプットボックスの入力値を、Variant型変数に代入
buf_a = InputBox("1つ目の数字を入力")
'適切な値が入力されるまで、Do~Loopで繰り返し処理を行う
Do While 変数buf_aの中身が、適切な値でない
'インプットボックスを再度表示する
'入力された値を、変数buf_aに代入する
Loop
'変数buf_aの値を変数aに代入する
a = InputBox("1つ目の数字を入力")
Cells(4, 2).Value = a
処理の内容を詳しく見ていきましょう。
まず、「Do」。こちら、英単語の「Do」ですね。つまり、マクロに対して、何かをしなさいと命令しているということです。
続いて、「While」。これは、「~の間」という意味です。そしてすぐ後ろには「どの間か」という「条件」を記述します。そのため、今回の場合で言えば、「変数buf_aの中身が、適切な値でない間」ということになります。
なんとなく見えてきましたかね?そして、次の行では、「While」で書いた条件を満たしている間に実施する、「処理」を記載していきます。今回でいえば、この2つです。
- インプットボックスを再度表示
- 入力された値を、変数buf_aに代入
そして最後のLoopは、「繰り返しの範囲はここまでだよー」とマクロに伝えてあげるためのものになります。(第5講のIf文の時に出てきた、「End If」と似たようなものですね。)
ここまでをまとめると、こうなります。
- (Whileの直後に記述した)「条件」を満たしている間、
- (Do While~Loopの間に記述した)「処理」を、繰り返して実行する
Do~Loopは、処理が少しだけ複雑な(ように見える)ので、慣れるまでがなかなか大変かもしれません。ただ、意味をしっかり理解すれば、なんてことないので、いっしょに克服していきましょう!(わからなくなったら、またここに戻ってきてください!)
入力された値が、適切かどうかを判定する
前の章で、「再度ユーザに入力を促す仕組み」の、大枠の部分は完成しました。次は、
- どういうときに繰り返し処理をさせるか
※この繰り返し処理を「ループ」といいます - どういうときはループさせないか
という「条件」の部分を、実装していきます!
数値かどうかを判定する(IsNumeric)
まずは、変数buf_aについて見ていきましょう。
変数buf_aには、「数値」が入力されることを期待しており、数値かどうかを判定する方法として、「IsNumeric」を使います。実装すると、こんな感じ。
'適切な値が入力されるまで、Do~Loopで繰り返し処理を行う
Do While Not IsNumeric(buf_a)
buf_a = InputBox("1つ目の数字を入力")
Loop
こちらの「IsNumeric」は、「()の中の変数buf_aについて、その中身は数字ですか?」という「質問」、と考えてください。
数字であれば、
数字でやんす(True)
数字でなければ、
違うでやんす(False)
と、Excelマクロが返事をしてくれます。この返事をDo~Loopで受け取ることによって、分岐処理を作る、というわけですね。
そして、併せて、次の「処理」の部分も変更してしまいました。第6講で見てきたように、ユーザにインプットボックスから入力してもらうようにするためには、「InputBox()」というコマンドを記述すればよいのでした。
ちょっと忘れちゃったかも・・・
という方は、こちらを振り返ってみましょう。
・・・さて、よく見ると、なにか「Not」っていう見たことないものが、Whileの次にありましたね。安心してください。これは、英語と同じ「否定」の意味です。今回の電卓では、
数字じゃない(Not IsNumeric)間、繰り返し、インプットボックスに入力してほしい
ので、「Not」をWhileの後につけています。
ここまでの解説は、変数buf_bも全く同じなので、一気に修正してしまったうえで、次の章に進みましょう!
'2つ目の数字--------------
'インプットボックスの入力値を、Variant型変数に代入
buf_b = InputBox("2つ目の数字を入力")
'適切な値が入力されるまで、Do~Loopで繰り返し処理を行う
Do While Not IsNumeric(buf_b)
buf_b = InputBox("2つ目の数字を入力")
Loop
四則演算かどうかを判定する
続いて、四則演算かどうかを判定する方法を見ていきましょう。まずは、いつも通り、実装方法から確認していきます。
'やりたい計算(+、-、×、÷)
buf_operator = InputBox("やりたい計算の種類(+、-、×、÷)を入力")
'適切な値が入力されるまで、Do~Loopで繰り返し処理を行う
Do While buf_operator <> "+" And _
buf_operator <> "-" And _
buf_operator <> "×" And _
buf_operator <> "÷"
buf_operator = InputBox("やりたい計算の種類(+、-、×、÷)を入力")
Loop
まず、「Do~Loop」の「While」の後に「繰り返しの条件」を書き、その次に「処理」を書く。この大きな作りは問題ないですよね。
ただ、今回は、初めて見るものが、3つあります。
3つなんて多すぎるよー
なーんて思わなくても大丈夫!1つ1つは、めっっっっっっっちゃ簡単なので(酸欠になるかと思いました)、しっかりと一緒に学んでいきましょう!
まず、1つ目は、<>という記号。これは、上に出てきた「Not(否定)」と同じ意味です。実際、こんな感じで、<>を「Not =」で置き換えても、まったく同じ動きをします。(どちらを使うかは、とりあえず、使いやすい方を選んでいただければよいと思います。)
続いて2つ目は、Do~Loopの条件部分に書かれた「_(アンダーバー)」。
Excelマクロのプログラムは、基本的に、1行1コマンドを記述する、というルールになっています。
・・・なんですが、1行当たりの文字数が多くなってくると、プログラムがメチャメチャ読みづらくなってきますよね。そんな時に、「改行するけど、1つのコマンドだよー」ということをExcelマクロに伝えてあげる方法として、この「_」を使います。
つまり今回は、以下の4行が1つの塊、ということですね。
'適切な値が入力されるまで、Do~Loopで繰り返し処理を行う
Do While buf_operator <> "+" And _
buf_operator <> "-" And _
buf_operator <> "×" And _
buf_operator <> "÷"
そして最後3つ目は、Whileの後にある「And」。これも英語の通り、「かつ」という意味です。今回は、こちらの4つの条件を「全て」満たしている場合、ということを記述するため、「And」を利用しました。
- buf_operator <> “+”
- buf_operator <> “-”
- buf_operator <> “×”
- buf_operator <> “÷”
(補足)似たようなものに「Or」があり、こちらは、「いずれか」「1つ以上」という意味になります。
さて、これで、四則演算かどうかの判定も実装が完了しました。あと、1点だけ修正をして、電卓を完成させましょう!
変数bufから計算用変数への代入
今まで、インプットボックスに入力された値は、ずっと変数bufに格納していたのですが、実際に計算に利用するのは、変数a、b、operatorになります。
そのため、変数bufから、変数a、b、operatorへ代入するための処理を作ってあげましょう。(もし「代入」について不安な方がいらっしゃれば、第4講をご覧ください。)
a = buf_a
b = buf_b
operator = buf_operator
本日のまとめ
お疲れさまでした!これで、Excelマクロを使った電卓の作成は、全て終了です!!
ぜひ、いろんなインプットを試して、どんな動きになるか、確認してみて下さい。
(何か気付きやご感想、ここがわからないのでもっと詳しく説明してほしい、などあれば、コメント欄や、Twitterなどでご連絡いただけると、とっても喜びます。)
コメント