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

VBA入門
スポンサーリンク

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

前回は、If Thenステートメントについて紹介しました。

10日で習得!VBA入門⑦If Thenステートメント
If Thenステートメントについて演習問題付きで簡潔に紹介しています。 記事を読み進めていくことで、マクロVBAを使って同一シート内のデータ処理を自動化するために必要なVBAスキルを習得できます。VBA初学者が添付のレジュメを使って一緒に手を動かしながらVBAコードを記述していくことで、自分のペースでじっくり確実に習得することができます。

今回は、これまでの内容(主にForNextステートメント)を使って、パズルを作成する演習です。

レジュメ(パズル演習)のダウンロードはこちらから↓

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

こちらのパズル演習についてはYouTubeチャンネル「Mr.ラビットのにょきにょきパソコン講座」にで動画がアップされていたものです。

今回はマクロVBAの演習問題としてこちらを使用して、解説していきます。

スポンサーリンク
スポンサーリンク

演習で得られるもの

  • 様々な繰り返し処理や変数の使い方が理解できる
  • IF文(条件分岐)の使いどころが理解できる
  • マクロVBAの学習が楽しくなる

つまり、このパズルの作成は、これから事務処理などの自動化に挑戦していく上で、転用できる点がたくさんあります!

帳票書類の自動化演習などの実務演習の前に、こんな遊びから入ってみたらVBAを楽しく学べるきっかけになります。(私の体験談です)

スポンサーリンク

コード解説(パズルを動かすコード)

Sub move(y As Integer, x As Integer)
    Dim i As Integer
    Dim j As Integer
    For i = 2 To 4 
        For j = 2 To 4 
            If Cells(i, j) = "" Then
                Cells(i, j) = Cells(i + y, j + x)
                Cells(i + y, j + x) = ""
                Exit Sub
            End If
        Next
    Next
End Sub

Sub 右移動()
    Call move(0, -1)
End Sub

Sub 左移動()
    Call move(0, 1)
End Sub

Sub 上移動()
    Call move(1, 0)
End Sub

Sub 下移動()
    Call move(-1, 0)
End Sub

  1. 2重ループを使って、空欄セルを探す
  2. 空欄セルがあれば、上下左右いずれかのセルを代入
  3. 代入すればループを抜ける
  4. Callステートメントで上下左右の引数を渡す

※VBAコードについて、YouTubeで紹介しているコードから若干編集しています。

2重ループ(2重For文)

Dim i As Integer
Dim j As Integer
    For i = 2 To 4  '行番号
        For j = 2 To 4  '列番号
            If Cells(i, j) = "" Then 'セルが空欄ならば
                Cells(i, j) = Cells(i + y, j + x) '空欄セルの+y、+xのセルの値を代入
                Cells(i + y, j + x) = "" 'セルを空欄にする
               Exit Sub
            End If
        Next
    Next
End Sub

こちらのパズルは、縦横9個のセルのうちの空白のセルに数字を移動させます。

9個のセルのうちどこに空白があるのか?は2重ループ(For文)If文を使って探しています。

2重ループ(For文)の動き

2重ループ(For文)とはFor文の中にFor文があり、その2つを使ってループさせます。

2重ループ内の変数は以下の順番で入ります。

Cells(2,2)
Cells(2,3)
Cells(2,4)
Cells(3,2)
Cells(3,3)
Cells(3,4)
Cells(4,2)
Cells(4,3)
Cells(4,4)

つまり、2重ループを使って縦横9個のセルを巡回して空欄を探しています。

そして、セルが空欄である場合の条件分岐はIf Thenステートメントで行います。

If Cells(i, j) = “” Then ‘セルが空欄ならば

セルが空欄ならば、上下左右いずれかセルを代入します。

Cells(i, j) = Cells(i + y, j + x) ‘空欄セルの+y、+xのセルの値を代入

スポンサーリンク

上・下・左・右キー

上下左右の何れかのパネル(番号)の移動は下記のコードです。

Sub 右移動()
    Call move(0, -1)
End Sub

Sub 左移動()
    Call move(0, 1)
End Sub

Sub 上移動()
    Call move(1, 0)
End Sub

Sub 下移動()
    Call move(-1, 0)
End Sub
スポンサーリンク

Callステートメント

プロシージャの中で、他のプロシージャを呼び出すときにCallステートメントを使います。

そして、呼び出す時に引数を設定できます。

上記コードの場合、Callステートメントにてmoveプロシージャを呼び出しています。そしてそれぞれのmoveプロシージャに渡す引数は、上・下・左・右の移動によって下記のように変わります。

上移動は、行番号はマイナスになります。

下移動は、行番号がプラスになります。

左移動は、列番号がマイナスになります。

右移動は、列移動がプラスになります。

スポンサーリンク

セルの値の移動

If Cells(i, j) = "" Then 'セルが空欄ならば
    Cells(i, j) = Cells(i + y, j + x) '空欄セルの+y、+xのセルの値を代入
    Cells(i + y, j + x) = "" 'セルを空欄にする
    Exit Sub
 End If

よって、セルが空欄の場合、「y」(行番号)と「x」(列番号)の渡された引数によって、空欄セルの上下左右の何れかのセルの値が空欄セルに代入されます。

そして、上下左右いずれかのセルは空欄にします。

これでセルの値の移動を表しています。

Exit Sub

Exit Subについては、1つ代入できれば2つ以上の代入は必要ないのでプロシージャ自体を終了させるためにExit Subを使っています。

ストアカやっています!!↓↓

スポンサーリンク

まとめ

今回は、パズルにおけるセルの移動を紹介しました。

次回は、パズルが揃ったあとの処理を紹介します。

お楽しみに!!

コメント

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