みなさん、こんにちは。マクロVBA入門の8回目(演習)です。
前回は、If Thenステートメントについて紹介しました。
今回は、これまでの内容(主にForNextステートメント)を使って、パズルを作成する演習です。
レジュメ(パズル演習)のダウンロードはこちらから↓
こちらのパズル演習については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
- 2重ループを使って、空欄セルを探す
- 空欄セルがあれば、上下左右いずれかのセルを代入
- 代入すればループを抜ける
- 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を使っています。
ストアカやっています!!↓↓
まとめ
今回は、パズルにおけるセルの移動を紹介しました。
次回は、パズルが揃ったあとの処理を紹介します。
お楽しみに!!
コメント