第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次魔方陣がすでに完成しています。