【第8講】Excelマクロで電卓を自作しよう⑤(Do~Loop)

スポンサーリンク

こんにちは!かいけつマクロです。

「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~Loopのイメージ

処理の内容を詳しく見ていきましょう。

まず、「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を完成

こちらの「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 =」で置き換えても、まったく同じ動きをします。(どちらを使うかは、とりあえず、使いやすい方を選んでいただければよいと思います。)

<>を「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などでご連絡いただけると、とっても喜びます。)

本日の学びポイント
  • 「条件に合致するまで、「繰り返し」処理を行う」という命令には、「Do~Loop」を使う
  • 数値かどうか判定するときは、「IsNumeric」を使う
  • 「_(アンダーバー)」を使って、コマンドを改行できる

コメント

タイトルとURLをコピーしました