みなさん、こんにちは。マクロVBA入門の9回目(演習)です。
前回は、これまでの内容(主にForNextステートメント)を使って、パズルを作成しました。
今回は、パズルが揃った(完成した)場合の処理について紹介します。
「パズル演習」学習用Excelファイルのダウンロードはこちらから↓
今回のパズル演習記事はYouTubeチャンネル「Mr.ラビットのにょきにょきパソコン講座」の動画を題材にしています。
コード解説(パズルの完成を確認するコード)
Sub check()
Dim r As Long
Dim c As Long
Dim flag As Boolean
Dim x As Long
flag = True
For r = 2 To 4
For c = 2 To 3
If Cells(r, c).value <> 8 Then
If Cells(r, c).value <> Cells(r, c + 1).value - 1 Then
flag = False
Exit For
End If
End If
Next c
Next r
If flag = True Then
MsgBox "クリア!!"
Call reset
End If
End Sub
- クリアを確認するための条件分岐としてブール型変数にTRUEを代入
- 2重ループで右隣りの数値が+1となるか(整列しているか)繰り返し処理で確認
- IF文を使ってパズルが整列していなければ、ブール型変数をFalseに変える
- 2重ループを抜けて、ブール型変数がTRUEのままであればクリア
Boolean型変数
Dim flag As Boolean ‘ブール型の変数宣言
flag = True ’変数flagにTrueを代入
Boolean型変数は、主に条件分岐に使用します。
使い方は、論理式を扱うようにTrueまたはFalseを変数に代入します。Boolean型変数の初期値にはFalseが入っています。
先述したように初期値はFalseなので、Falseとして使用する場合は代入の必要はないのですが、Trueにしたい場合は上記コードのようにTrueを代入しておきます。
IF文と2重ループ
For r = 2 To 4 '行
For c = 2 To 3 '列
If Cells(r, c).value <> 8 Then 'セルの値が8ではなければ
If Cells(r, c).value <> Cells(r, c + 1).value - 1 Then 'セルの値と右隣のセルの値マイナス1が同数にならなければ
flag = False '変数flagにFalseを代入
Exit For 'ループは抜ける
End If
End If
Next c
Next r
IF文①
このパズルゲームのクリアの条件は以下の通りです。
クリアの条件:各行が数字順に整列すること(パズルの並び方は右の列に進むにつれてセルの値が1つずつ大きくなる並び方)※下図参照
上図のようにパズルが配置されているかをVBAで確認するコードが以下になります。
If Cells(r, c).value <> Cells(r, c + 1).value – 1 Then
「もしCells(r,c).value※基準セルの値とCells(r,c+1).value※右隣のセルの値マイナス1が同じ数値ではなければ」
flag = False ‘変数flagにFalseを代入
Exit For ‘ループは抜ける
もし、基準のセルの値と基準のセルの値マイナス1の値が同じ数字にならなければ、(つまり数字順に整列してなければ)
Boolean型変数:flagをFalseに変えます。
Exit Forでループを抜けます。※For文については後述
IF文②
ただし、上記のIF文の前にもう1つIF文があります。
If Cells(r, c).value <> 8 Then ‘セルの値が8ではなければ
If Cells(r, c).value <> Cells(r, c + 1).value – 1 Then ‘セルの値と右隣のセルの値マイナス1が同数にならなければ
セルの値(パズルの数字)は「8」より大きな値はないので、「8」以外の値ならばという条件を付けています。
「8」以外の値ならば、右隣りの数字が1つ大きな値か?をさらに確認するという流れです。
2重ループ
上記コードを1セルずつチェックするのに使っているのが、2重ループです。
For r = 2 To 4 ‘行
For c = 2 To 3 ‘列
Next c Next r
Boolean型変数②
If flag = True Then
MsgBox “クリア!!”
Call reset
End If
For文を全てループして、Boolean型変数:flagがTrueのままならば、各行が数字順に整列しているということなので、「クリア!」となります。
call resetは次回、紹介します。
まとめ
今回はパズルの値が整列しているか?をFor文とIf文そしてBoolean変数でチェックする方法について解説しました。
次回は、クリアしたパズル(整列したパズル)をバラバラにするコード(リセット処理)を紹介します。
お楽しみに!!
コメント