【´・ω・`】:下が時間割自動作成マクロプロトタイプⅢの核となる部分だ。
1: %MyRange=Range("B2:F7")
2: %Cnt=0
3: Do While %Cnt <10000
4: Range("B2:F7")=%MyRange
5: Put2Jikan
6: Main_Part
7: If Cells(13, 9) = Cells(13, 10) Then
8: MsgBox("Done")
9: Stop
10: End If
11: %Cnt =%Cnt+1
12: Loop
13: MsgBox("解が見つかりませんでした。")
【´・ω・`】:説明のために行番号をふっておいた。
(●`ε´●):たったの13行か?
【´・ω・`】:うん。・・・では解説しよう。
まず、1行目。ここで初期状態の時間割表を変数%MyRangeに
格納しておく。
(●`ε´●):初期状態?
【´・ω・`】:うん。最初にユーザはあらかじめ、いくつかの科目は
何曜日の何時間目と・・・指定しているかもしれない。
(●`ε´●):この場合は火曜6限の「総合」と木曜6限の「LHR」の
ことか?
【´・ω・`】:そう。なんでこんなことをするかは後ですぐわかる。
(●`ε´●):OK。それでは2行目は?
【´・ω・`】:ループカウンタの初期化だ。3行目から12行目まで
黙っていれば10000回ループする。ここで適当に科目を
割り振っていって、上手く割り振れればループを抜ける。
まず、4行目で時間割表を初期状態にする・・・。
関数Put2Jikanを呼び出して2時間続きの科目を時間割表に
書き込む・・・。次に関数Main_Partを呼び出し、2時間続きではない
科目を時間割表に書き込む。
次に7行目で全ての科目を時間割表に書き込めたかをチェックして
書き込めていれば終了、そうでなければ4行目に戻る・・・。
1万回ループしても解が見つからなければ、その旨を表示して
プログラムを終了する。
(●`ε´●):なるほど、書き込みに失敗した場合、時間割表にはいろいろと
科目が書き込まれてしまっているから、それを初期状態に戻せるように
1行目で・・・
%MyRange=Range("B2:F7")
・・・としておいたのか。
【´・ω・`】:うん。プログラムの流れがだいたい、わかったと思う。次回は
サブルーチンのPut2Jikan と Main_Part を見てみよう。
コメント