マクロVBAのFor文で作るパズル(演習)②

VBA入門
スポンサーリンク

みなさん、こんにちは。マクロVBA入門の9回目(演習)です。

前回は、これまでの内容(主にForNextステートメント)を使って、パズルを作成しました

マクロVBAのFor文で作るパズル(演習)
ForNextステートメンとIfThenステートメントを使ってパズルを作成する方法について紹介しています。Excelダウンロードファイルを使ってブログ記事を読み進めながら一緒に作成することができます。

今回は、パズルが揃った(完成した)場合の処理について紹介します。

パズル演習」学習用Excelファイルのダウンロードはこちらから↓

マクロVBA入門講座|ワイエム
「ブログ記事とオリジナルレジュメを使ってマクロVBAの基礎を学ぼう!!」ということで、ブログにてVBA基礎の習得を目指した記事をアップしていきます。最終目標は”私がVBA習得のきっかけとなった”YouTubeチャンネル:Mr.ラビットのにょきにょきパソコン講座にて題材となってパズルを作成することです!!YouTubeを...

今回のパズル演習記事は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
  1. クリアを確認するための条件分岐としてブール型変数にTRUEを代入
  2. 2重ループで右隣りの数値が+1となるか(整列しているか)繰り返し処理で確認
  3. IF文を使ってパズルが整列していなければ、ブール型変数をFalseに変える
  4. 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 = To     ‘行
For c = To   ‘列   
Next c Next r

スポンサーリンク

Boolean型変数②

If flag = True Then
MsgBox “クリア!!”
Call reset
End If

For文を全てループして、Boolean型変数:flagがTrueのままならば、各行が数字順に整列しているということなので、「クリア!」となります。

call resetは次回、紹介します。

スポンサーリンク

まとめ

今回はパズルの値が整列しているか?をFor文If文そしてBoolean変数でチェックする方法について解説しました。

次回は、クリアしたパズル(整列したパズル)をバラバラにするコード(リセット処理)を紹介します。

お楽しみに!!

コメント

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