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

第12話 1次元のFor文で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  111  111  111  111  111 

(列番号のABCDEFはわかりやすくするため
Cells(
*,*)の後半の番号123456に変更してあります。)
トレースは、
列番号行番号の色が対応させてありますので、
色対応に注意しながら読んでください。
  h = 1
  w = 0
  k = Int(6 * (6 * 6 + 1) / 2) '毎回計算させないようにするための変更
の3行によってhは1、wは0、kは111となります。
そして、For文のループに入ります。
i = 0(For文1回目のループ)のとき、
    a = i Mod 6
    s = Int(i / 6)
 すなわち
    a = 0 Mod 6
    s = Int(0 / 6)

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

 
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

 すなわち、
    w = 0 + 1
 から
    w = 1
 次の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
 によって2回目のループに入ります。

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

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

 
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

 すなわち、
    w = 1 + 31
 から
    w = 32
 次の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
 によって3回目のループに入ります。

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

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

 
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

 すなわち、
    w = 32 + 18
 から
    w = 50
 次の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
 によって4回目のループに入ります。

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

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

 
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

 すなわち、
    w = 50 + 19
 から
    w = 69
 次の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
 によって5回目のループに入ります。

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

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

 
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

 すなわち、
    w = 69 + 6
 から
    w = 75
 次の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
 によって6回目のループに入ります。

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

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

 
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

 すなわち、
    w = 75 + 36
 から
    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 + 0) = w
 すなわち
      Cells(13, 1) = 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 

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

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

さてファイルが大分大きくなってしまいましたので、
以降のトレースは次話で。


11話へ 第13話へ


トップ

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

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