第6講 4次魔方陣を作ってみよう。
第7話 解答2解説
Private Sub CommandButton1_Click()
Dim i As Integer, j As Integer, w As Integer
For i = 1 To 4
For j = 1 To 4
Cells(i + 4, j + 2) = 4 * (i - 1) + j
Next
Next
For i = -3 To 3 Step 2
Cells(i / 2 + 14.5, i / 2 + 4.5) = Cells(i / 2 + 6.5, i
/ 2 + 4.5)
Cells(-i / 2 + 14.5, i / 2 + 4.5) = Cells(-i / 2 + 6.5,
i / 2 + 4.5)
For j = -3 To 3 Step 2
If (i <> j And i <> -j) Then Cells(-i
/ 2 + 14.5, -j / 2 + 4.5) = Cells(i / 2 + 6.5, j / 2 + 4.5)
Next
Next
・
・
以下略
・
・
End Sub
4次魔方陣プログラムその2実行プログラムとの違いは、
ピンク
For i = -3 To 3 Step 2
Cells(i / 2 + 14.5, i / 2 + 4.5) = Cells(i / 2 + 6.5, i / 2 + 4.5)
Cells(-i / 2 + 14.5, i / 2 + 4.5) = Cells(-i / 2 + 6.5, i / 2 +
4.5)
For j = -3 To 3 Step 2
If (i <> j And i <> -j) Then Cells(-i / 2 +
14.5, -j / 2 + 4.5) = Cells(i / 2 + 6.5, j / 2 + 4.5)
Next
Next
の記述です。このピンクでは紺色のFor文で作った自然配列
| 3 | 4 | 5 | 6 | |
| 5 | 1 | 2 | 3 | 4 |
| 6 | 5 | 6 | 7 | 8 |
| 7 | 9 | 10 | 11 | 12 |
| 8 | 13 | 14 | 15 | 16 |
のピンクのセルを魔方陣の中心にたいして点対称移動した形で、
そして濃い緑はそのままで、
8つ下にコピーし、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 15 | 14 | 4 |
| 14 | 12 | 6 | 7 | 9 |
| 15 | 8 | 10 | 11 | 5 |
| 16 | 13 | 3 | 2 | 16 |
を作り出しているのです。
iとjに−3,−1,1,3を代入して
For i = -3 To 3 Step 2
Cells(i / 2 + 14.5, i / 2 + 4.5) = Cells(i / 2 + 6.5, i / 2 + 4.5)
Cells(-i / 2 + 14.5, i / 2 + 4.5) = Cells(-i / 2 + 6.5, i / 2 +
4.5)
For j = -3 To 3 Step 2
If (i <> j And i <> -j) Then Cells(-i / 2 +
14.5, -j / 2 + 4.5) = Cells(i / 2 + 6.5, j / 2 + 4.5)
Next
Next
の動きを追ってみましょう。次の2つの表と各式の動きを対応させて読んでください。
| 3 | 4 | 5 | 6 | |
| 5 | 1 | 2 | 3 | 4 |
| 6 | 5 | 6 | 7 | 8 |
| 7 | 9 | 10 | 11 | 12 |
| 8 | 13 | 14 | 15 | 16 |
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 15 | 14 | 4 |
| 14 | 12 | 6 | 7 | 9 |
| 15 | 8 | 10 | 11 | 5 |
| 16 | 13 | 3 | 2 | 16 |
i=−3のとき
Cells(13, 3) = Cells(5, 3)
Cells(16, 3) = Cells(8, 3)
| 01 |
と
| 13 |
がそのまま8つ下のセルにコピーされました。
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | ||||
| 15 | ||||
| 16 | 13 |
j=−3のとき
i=j=−3なので条件(i <> j And i <> -j)に適していませんから、Then以降
Cells(-i / 2 + 14.5, -j / 2 + 4.5) = Cells(i / 2 + 6.5, j / 2 + 4.5)
は実行されません。
j=−1のとき
i=−3,j=−1なので条件(i <> j And i <> -j)を満たします。したがって、Then以降が実行され
Cells(16, 5) = Cells(5, 4)
によって、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | ||||
| 15 | ||||
| 16 | 13 | 2 |
となります。
j=1のとき、
i=−3,j=1なので、条件(i <> j And i <> -j)を満たします。したがって、Then以降が実行され
Cells(16, 4) = Cells(5, 5)
によって、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | ||||
| 15 | ||||
| 16 | 13 | 3 | 2 |
となります。
j=3のとき、
i=−3,j=3でi=−jとなり、条件(i <> j And i <> -j)を満たしません。
したがって、Then以降が実行されませんので、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | ||||
| 15 | ||||
| 16 | 13 | 3 | 2 |
のままです。
i=−1のとき
Cells(14, 4) = Cells(6, 4)
Cells(15, 4) = Cells(7, 4)
| 06 |
と
| 10 |
がそのまま8つ下のセルにコピーされました。
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | 6 | |||
| 15 | 10 | |||
| 16 | 13 | 3 | 2 |
j=−3のとき
i=-1,j=−3なので条件(i <> j And i <> -j)を満たしますから、Then以降が実行され
Cells(15, 6) = Cells(6, 3)となり、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | 6 | |||
| 15 | 10 | 5 | ||
| 16 | 13 | 3 | 2 |
となります。
j=−1のとき
i=−1,j=−1なので条件(i <> j And i <> -j)を満たしません。したがって、Then以降が実行されず、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | 6 | |||
| 15 | 10 | 5 | ||
| 16 | 13 | 3 | 2 |
は変わりません。
j=1のとき、
i=−1,j=1でi=−iなので、条件(i <> j And i <> -j)を満たしません。したがって、Then以降が実行されず、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | 6 | |||
| 15 | 10 | 5 | ||
| 16 | 13 | 3 | 2 |
は変わりません。
j=3のとき、
i=−1,j=3で、条件(i <> j And i <> -j)を満たします。
したがって、Then以降が実行され
Cells(15, 3) = Cells(5, 6)となり、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | 6 | |||
| 15 | 8 | 10 | 5 | |
| 16 | 13 | 3 | 2 |
となります。
i=1のとき
Cells(15, 5) = Cells(7, 5)
Cells(14, 5) = Cells(6, 5)
| 11 |
と
| 07 |
がそのまま8つ下のセルにコピーされました。
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | 6 | 7 | ||
| 15 | 8 | 10 | 11 | 5 |
| 16 | 13 | 3 | 2 |
j=−3のとき
i=1,j=−3なので条件(i <> j And i <> -j)を満たしますから、Then以降が実行され
Cells(14, 6) = Cells(7, 3)となり、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | 6 | 7 | 9 | |
| 15 | 8 | 10 | 11 | 5 |
| 16 | 13 | 3 | 2 |
となります。
j=−1のとき
i=1,j=−1でi=−jなので条件(i <> j And i <> -j)を満たしません。したがって、Then以降が実行されず、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | 6 | 7 | 9 | |
| 15 | 8 | 10 | 11 | 5 |
| 16 | 13 | 3 | 2 |
のままです。
j=1のとき、
i=1,j=1でi=iなので、条件(i <> j And i <> -j)を満たしません。したがって、Then以降が実行されず、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | 6 | 7 | 9 | |
| 15 | 8 | 10 | 11 | 5 |
| 16 | 13 | 3 | 2 |
は変わりません。
j=3のとき、
i=1,j=3で、条件(i <> j And i <> -j)を満たします。
したがって、Then以降が実行され
Cells(14, 3) = Cells(7, 6)となり、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 00 |
| 14 | 12 | 6 | 7 | 9 |
| 15 | 8 | 10 | 11 | 5 |
| 16 | 13 | 3 | 2 |
となります。
i=3のとき
Cells(16, 6) = Cells(8, 6)
Cells(13, 6) = Cells(5, 6)
| 16 |
と
| 04 |
がそのまま8つ下のセルにコピーされました。
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 4 |
| 14 | 12 | 6 | 7 | 9 |
| 15 | 8 | 10 | 11 | 5 |
| 16 | 13 | 3 | 2 | 16 |
j=−3のとき
i=3,j=−3でi=−jなので条件(i <> j And i <> -j)を満たしません。したがって、Then以降が実行されず、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 00 | 4 |
| 14 | 12 | 6 | 7 | 9 |
| 15 | 8 | 10 | 11 | 5 |
| 16 | 13 | 3 | 2 | 16 |
のままです。
j=−1のとき
i=3,j=−1なので条件(i <> j And i <> -j)を満たしますから、Then以降が実行され
Cells(13, 5) = Cells(8, 4)となり、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 00 | 14 | 4 |
| 14 | 12 | 6 | 7 | 9 |
| 15 | 8 | 10 | 11 | 5 |
| 16 | 13 | 3 | 2 | 16 |
となります。
j=1のとき、
i=3,j=1で、条件(i <> j And i <> -j)を満たします。
したがって、Then以降が実行され
Cells(13, 4) = Cells(8, 5)となり、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 15 | 14 | 4 |
| 14 | 12 | 6 | 7 | 9 |
| 15 | 8 | 10 | 11 | 5 |
| 16 | 13 | 3 | 2 | 16 |
となります。
j=3のとき、
i=3,j=3でi=iなので、条件(i <> j And i <> -j)を満たしません。したがって、Then以降が実行されず、
| 3 | 4 | 5 | 6 | |
| 13 | 1 | 15 | 14 | 4 |
| 14 | 12 | 6 | 7 | 9 |
| 15 | 8 | 10 | 11 | 5 |
| 16 | 13 | 3 | 2 | 16 |
のままですが、以上の処理によって4次魔方陣がすでに完成しています。