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


第6話へ 第7講第1話へ

講義トップへ

数学研究室に戻る