Junchi Lab

トップ > Excelマクロ > 2-4 自動で最後まで繰り返す(オートフィル)

2-4 自動で最後まで繰り返す(オートフィル)


【今回できるようになること】

・条件が成り立つまで繰り返す処理
・3条件以上の条件分岐
・メッセージボックスの表示


こんにちはー!!
今回は、前回の続きの内容です!

Excelの関数ではないですが、データの数に合わせてドラッグして処理をする
「オートフィル」のような機能を目指します!


vba1_1_1


それでは早速質問です!
前回合否判定を行った5人×2教科のデータですが、6人目のデータが追加されました。
前回のコードをどのように書き換えれば、6人目までの合否判定を実行できるでしょうか?


vba2_4_1


繰り返しの数を13に増やせば良いのでは?と思った方。
その通りです!


vba2_4_2


この変更を思いついた方は、さらにプログラムを進化させましょう。

上の例では、人数が6人で確定していましたが、次はどんな数のデータでも同じコードで対応できるようにしましょう!


それでは、VBEを開いて標準モジュールを追加し、メモ帳みたいなものの「Option Explicit」以下に、下のコードを書いてみましょう!

1-4 マクロを動かす 参照

vba2_4_3


これが書けたら、いままで同様、実行ボタンを配置してマクロ(Bunki)を実行してみましょう!

1-4 マクロを動かす 参照


下のように、合否判定と背景色が更新されたら成功です!


vba2_4_4


ぜひ、七朗や八郎のデータを追加して、任意のデータ数に対応できるか確かめてみてください♪


vba1_4_1


さて、徐々にコードが複雑になってきましたね。
今回は、新たな繰り返しの構文

Do
 繰り返す処理
Loop Until 条件式

を使いました。

これは、
「条件式が成り立つまで、処理を繰り返す」
という意味になります。

今回は、行の終点が来るまで繰り返したいので、
ひとまず終点まで来たかどうか(True/False)を格納する変数「check」を定義しています。
この「check」は、繰り返しを終了するスイッチのような役割を担います。


vba2_4_7


まず最初に「check = False」で、checkをFalse(スイッチオフ)にしておき、
「check = True」の命令が来てスイッチオンになるまで処理を繰り返すことにします。

これが、「Do」~「Loop Until check = True」の部分で書かれています。
そして、上記の繰り返し構文の中に、上から順番にテストの点数を調べて合否判定を行う処理を書いていきます。
ここで、前回も扱ったIfの文が登場しています。

【今回の分岐】
点数のセルを選択して、
●分岐条件1「セルが空っぽ」ならば「(行の終点が来たということなので)checkをTrueにして繰り返し終了」
●分岐条件2「点数が60以上」ならば「右隣に合格を記入」
●分岐条件3「点数が60より小さい」ならば「右隣に不合格を記入し赤色で塗る」

最後に、上記の選択肢中のどれかが実行されたら、If構文の直後にある「Selection.Offset(1,-1).Select」で
次の行の点数のセルを選択して、その行の処理が終了します。

こうすることで、事前にデータ数を指定しなくても、自動でデータの終点まで処理を繰り返すようになります。

ちなみに、データの終点を求める作業については、Endメソッドという専用のコードも存在しますが、
今回はあえて、条件分岐や繰り返しの構文を学ぶために、基本的な構文の組み合わせで機能を実現しています。


vba2_3_5


最後に、繰り返しが終了したことがユーザーに分かりやすいように、
繰り返しが終了したらメッセージを表示するプログラムを書きましょう!

繰り返し文の終点「Loop Until check = True」のすぐ下に、下のような1行を追加してください。


vba2_4_5


こうすることで、繰り返しが終了したら、Excelの画面にメッセージを表示できます。


vba2_4_6


メッセージボックスは、プログラムがどこまで処理されたかどうかの確認にも利用できます。
今回の内容は以上です!またお会いしましょう!!


vba2_1_7

【今回のまとめ】

・条件が成り立つまで繰り返す処理は「Do」と「Loop Until 条件式」の間にはさむ
・複数の条件で分岐させたいときは、「ElseIF 条件式 Then」を使う
・メッセージを表示させたいときは、「MsgBox "表示したい内容"」を使う


前回 2-3 条件分岐(IF関数)
次回 2-5 数列を入力する(オートフィル+)