第6講 4次魔方陣を作ってみよう。
第6話 解答1解説
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 = 1 To 4
For j = 1 To 4
Cells(i + 12, j + 2) = Cells(i + 4, j + 2)
Next
Next
For i = -1 To 1 Step 2
w = Cells(13, i / 2 + 4.5)
Cells(13, i / 2 + 4.5) = Cells(16, -i / 2 + 4.5)
Cells(16, -i / 2 + 4.5) = w
Next
For i = -1 To 1 Step 2
w = Cells(i / 2 + 14.5, 3)
Cells(i / 2 + 14.5, 3) = Cells(-i / 2 + 14.5, 6)
Cells(-i / 2 + 14.5, 6) = w
Next
Cells(17, 1) = "縦合計"
For i = 1 To 4
w = 0
For j = 1 To 4
w = w + Cells(j + 12, i + 2)
Next
Cells(17, i + 2) = w
Next
Range("g10:g12").Select
Selection.HorizontalAlignment = xlRight
Cells(10, 7) = "横"
Cells(11, 7) = "合"
Cells(12, 7) = "計"
Range("a1").Select
For i = 1 To 4
w = 0
For j = 1 To 4
w = w + Cells(i + 12, j + 2)
Next
Cells(i + 12, 7) = w
Next
Cells(18, 1) = "右斜め対角線合計"
w = 0
For i = 1 To 4
w = w + Cells(i + 12, i + 2)
Next
Cells(18, 5) = w
Cells(19, 1) = "左斜め対角線合計"
w = 0
For i = 1 To 4
w = w + Cells(i + 12, 7 - i)
Next
Cells(19, 5) = w
End Sub
For i = 1 To 4
For j = 1 To 4
Cells(i + 4, j + 2) = 4 * (i - 1) + j
Next
Next
この紺色の部分では、自然配列
3 | 4 | 5 | 6 | |
5 | 1 | 2 | 3 | 4 |
6 |
5 | 6 | 7 | 8 |
7 |
9 | 10 | 11 | 12 |
8 |
13 |
14 | 15 | 16 |
を作っています。
次の青色
For i = 1 To 4
For j = 1 To 4
Cells(i + 12, j + 2) = Cells(i + 4, j + 2)
Next
Next
では、その自然配列を8つ下にコピーして
3 | 4 | 5 | 6 | |
13 | 1 | 2 | 3 | 4 |
14 |
5 | 6 | 7 | 8 |
15 |
9 | 10 | 11 | 12 |
16 |
13 | 14 | 15 | 16 |
を作っています。
次のピンクと赤色が今回のメインです。
まず、ピンク
For i = -1 To 1 Step 2
w = Cells(13, i / 2 + 4.5)
Cells(13, i / 2 + 4.5) = Cells(16, -i / 2 + 4.5)
Cells(16, -i / 2 + 4.5) = w
Next
では
3 | 4 | 5 | 6 | |
13 | 1 | 2 | 3 | 4 |
14 |
5 | 6 | 7 | 8 |
15 |
9 | 10 | 11 | 12 |
16 |
13 | 14 | 15 | 16 |
のピンクの部分を魔方陣の中心の点にたいして点対称移動して、
3 | 4 | 5 | 6 | |
13 | 1 | 15 | 14 | 4 |
14 |
5 | 6 | 7 | 8 |
15 |
9 | 10 | 11 | 12 |
16 |
13 | 3 | 2 | 16 |
を作成しています。
トレースしてみましょう。
i=−1から始まります。
i=−1のとき、w = Cells(13, i / 2 + 4.5)
はw = Cells(13, 4)
です。i/2はi÷2ですので
i=−1のとき、−0.5であるからですよね。以下、
Cells(13, i / 2 + 4.5) = Cells(16, -i / 2 + 4.5)
Cells(16, -i / 2 + 4.5) = w
は
Cells(13, 4) = Cells(16, 5)
Cells(16, 5) = wです。
もう一度3行を見てみると、
w = Cells(13, 4)
Cells(13, 4) = Cells(16, 5)
Cells(16, 5) = w
で結局Cells(13, 4)とCells(16, 5)、
すなわち
02 |
と
15 |
交換が行われています。
今回は、Step 2がついていますので、i=−1の次はi=1ですから
次のループの3行は
w = Cells(13, 5)
Cells(13, 5) = Cells(16, 4)
Cells(13, 5) = w
ですからCells(13, 5)とCells(16, 4)、
すなわち
03 |
と
14 |
の交換が行われています。
次の赤
For i = -1 To 1 Step 2
w = Cells(i / 2 + 14.5, 3)
Cells(i / 2 + 14.5, 3) = Cells(-i / 2 + 14.5, 6)
Cells(-i / 2 + 14.5, 6) = w
Next
では
3 | 4 | 5 | 6 | |
13 | 1 | 15 | 14 | 4 |
14 |
5 | 6 | 7 | 8 |
15 |
9 | 10 | 11 | 12 |
16 |
13 | 3 | 2 | 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に−1と1を代入して動きを追ってみてください。