第6講 If文(分岐)を理解しよう

第13話 1次元のFor文で2次元ループをする方法による列部分の改良トレースその2


解説の続きトレースその2

  h = 1
  w = 0
  k = Int(6 * (6 * 6 + 1) / 2) '毎回計算させないようにするための変更
  For i = 0 To 35
    a = i Mod 6
    s = Int(i / 6)
    w = w + Cells(
7 + a, 1 + s)
    If a = 5 Then
      If h = 1 Then If w <> k Then h = 0
      Cells(
13, 1 + s) = w
      w = 0
    End If
  Next

 
1 16 33 26 32 3
31 8 10 20 7 35
18 24 15 14 28 12
10  19 13 22 23 9 25
11  6 29 27 17 30 2
12  36 21 4 11 5 34
13 111 

(列番号のABCDEFはわかりやすくするため
Cells(
*,*)の後半の番号123456に変更してあります。)
トレースは、
列番号行番号の色が対応させてありますので、
色対応に注意しながら読んでください。
i = 6(For文7回目のループ)のとき、
    a = 6 Mod 6
    s = Int(6 / 6)
 すなわち
    a = 6 Mod 6
    s = Int(1 / 6)

 から
    a = 0
    s = 1
 
はじめて、sが0から動きました。
 次に
   w = w + Cells(
7 + a, 1 + s)
 は
    w = w + Cells(7 + 0, 1 + 1)
 から
    w = w + Cells(7, 2)

 
1 16 33 26 32 3
31 8 10 20 7 35
18 24 15 14 28 12
10  19 13 22 23 9 25
11  6 29 27 17 30 2
12  36 21 4 11 5 34
13 111

 すなわち、
    w = 0 + 16
 から
    w = 16
 次のIf文は
    If a = 5 Then
      If h = 1 Then If w <> k Then h = 0
      Cells(
13, 1 + s) = w
      w = 0
    End If

 a = 0なので実行されません。
  Next
 によって8回目のループに入ります。

i = 7(For文8回目のループ)のとき、
    a = 7 Mod 6
    s = Int(7 / 6)
 すなわち
    a = 7 Mod 6
    s = Int(7 / 6)

 から
    a = 1
    s = 1
 次に
   w = w + Cells(
7 + a, 1 + s)
 は
    w = w + Cells(7 + 1, 1 + 1)
 から
    w = w + Cells(8, 2)

 
1 16 33 26 32 3
31 8 10 20 7 35
18 24 15 14 28 12
10  19 13 22 23 9 25
11  6 29 27 17 30 2
12  36 21 4 11 5 34
13 111

 すなわち、
    w = 16 + 8
 から
    w = 24
 次のIf文は
    If a = 5 Then
      If h = 1 Then If w <> k Then h = 0
      Cells(
13, 1 + s) = w
      w = 0
    End If

 a = 1なので実行されません。
  Next
 によって9回目のループに入ります。

i = 8(For文9回目のループ)のとき、
    a = 8 Mod 6
    s = Int(8 / 6)
 すなわち
    a = 8 Mod 6
    s = Int(8 / 6)

 から
    a = 2
    s = 1
 次に
   w = w + Cells(
7 + a, 1 + s)
 は
    w = w + Cells(7 + 2, 1 + 1)
 から
    w = w + Cells(9, 2)

 
1 16 33 26 32 3
31 8 10 20 7 35
18 24 15 14 28 12
10  19 13 22 23 9 25
11  6 29 27 17 30 2
12  36 21 4 11 5 34
13 111

 すなわち、
    w = 24 + 24
 から
    w = 48
 次のIf文は
    If a = 5 Then
      If h = 1 Then If w <> k Then h = 0
      Cells(
13, 1 + s) = w
      w = 0
    End If

 a = 2なので実行されません。
  Next
 によって10回目のループに入ります。

i = 9(For文10回目のループ)のとき、
    a = 9 Mod 6
    s = Int(9 / 6)
 すなわち
    a = 9 Mod 6
    s = Int(9 / 6)

 から
    a = 3
    s = 1
 次に
   w = w + Cells(
7 + a, 1 + s)
 は
    w = w + Cells(7 + 3, 1 + 1)
 から
    w = w + Cells(10, 2)

 
1 16 33 26 32 3
31 8 10 20 7 35
18 24 15 14 28 12
10  19 13 22 23 9 25
11  6 29 27 17 30 2
12  36 21 4 11 5 34
13 111

 すなわち、
    w = 48 + 13
 から
    w = 61
 次のIf文は
    If a = 5 Then
      If h = 1 Then If w <> k Then h = 0
      Cells(
13, 1 + s) = w
      w = 0
    End If

 a = 3なので実行されません。
  Next
 によって11回目のループに入ります。

i = 10(For文11回目のループ)のとき、
    a = 10 Mod 6
    s = Int(10 / 6)
 すなわち
    a = 10 Mod 6
    s = Int(10 / 6)

 から
    a = 4
    s = 1
 次に
   w = w + Cells(
7 + a, 1 + s)
 は
    w = w + Cells(7 + 4, 1 + 1)
 から
    w = w + Cells(11, 2)

 
1 16 33 26 32 3
31 8 10 20 7 35
18 24 15 14 28 12
10  19 13 22 23 9 25
11  6 29 27 17 30 2
12  36 21 4 11 5 34
13 111

 すなわち、
    w = 61 + 29
 から
    w = 90
 次のIf文は
    If a = 5 Then
      If h = 1 Then If w <> k Then h = 0
      Cells(
13, 1 + s) = w
      w = 0
    End If

 a = 4なので実行されません。
  Next
 によって12回目のループに入ります。

i = 11(For文12回目のループ)のとき、
    a = 11 Mod 6
    s = Int(11 / 6)
 すなわち
    a = 11 Mod 6
    s = Int(11 / 6)

 から
    a = 5
    s = 1
 次に
   w = w + Cells(
7 + a, 1 + s)
 は
    w = w + Cells(7 + 5, 1 + 0)
 から
    w = w + Cells(12, 2)

 
1 16 33 26 32 3
31 8 10 20 7 35
18 24 15 14 28 12
10  19 13 22 23 9 25
11  6 29 27 17 30 2
12  36 21 4 11 5 34
13 111

 すなわち、
    w = 90 + 21
 から
    w = 111
 次のIf文は
    If a = 5 Then
      If h = 1 Then If w <> k Then h = 0
      Cells(
13, 1 + s) = w
      w = 0
    End If

 a = 5なのではじめて実行されます。
 hはもちろん1なので、If文
      If h = 1 Then If w <> k Then h = 0
 が遂行されますが、
 wは111、kも111(<>は等しくないという意味)で等しいので、
 w <> kは成り立ちませんから
 h = 0の命令は実施されずhは1のままです。
 そして、
      Cells(13, 1 + s) = w
 すなわち
      Cells(13, 1 + 1) = w
 すなわち
      Cells(13, 2) = w

 によって

 
1 16 33 26 32 3
31 8 10 20 7 35
18 24 15 14 28 12
10  19 13 22 23 9 25
11  6 29 27 17 30 2
12  36 21 4 11 5 34
13 111  111

  B13に合計値111が表示されてB列の合計の算出と表示に成功したのです。
 最後に、
      w = 0
 によって、wが0に戻されます。
 このタイミングで0に戻されるのは、次のループでC列に入るからです。

  Next
 によって13回目のループに入ります。

以降のトレースは是非ご自分でお願いします。
プログラミングは、心底納得する必要があるからです。

トレースが終わったら、行部分の改良に入りましょう。

12話へ 第14話へ


トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ