第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 | 2 | 3 | 4 | 5 | 6 | |
7 | 1 | 16 | 33 | 26 | 32 | 3 |
8 | 31 | 8 | 10 | 20 | 7 | 35 |
9 | 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 | 2 | 3 | 4 | 5 | 6 | |
7 | 1 | 16 | 33 | 26 | 32 | 3 |
8 | 31 | 8 | 10 | 20 | 7 | 35 |
9 | 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 | 2 | 3 | 4 | 5 | 6 | |
7 | 1 | 16 | 33 | 26 | 32 | 3 |
8 | 31 | 8 | 10 | 20 | 7 | 35 |
9 | 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 | 2 | 3 | 4 | 5 | 6 | |
7 | 1 | 16 | 33 | 26 | 32 | 3 |
8 | 31 | 8 | 10 | 20 | 7 | 35 |
9 | 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 | 2 | 3 | 4 | 5 | 6 | |
7 | 1 | 16 | 33 | 26 | 32 | 3 |
8 | 31 | 8 | 10 | 20 | 7 | 35 |
9 | 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 | 2 | 3 | 4 | 5 | 6 | |
7 | 1 | 16 | 33 | 26 | 32 | 3 |
8 | 31 | 8 | 10 | 20 | 7 | 35 |
9 | 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 | 2 | 3 | 4 | 5 | 6 | |
7 | 1 | 16 | 33 | 26 | 32 | 3 |
8 | 31 | 8 | 10 | 20 | 7 | 35 |
9 | 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 | 2 | 3 | 4 | 5 | 6 | |
7 | 1 | 16 | 33 | 26 | 32 | 3 |
8 | 31 | 8 | 10 | 20 | 7 | 35 |
9 | 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回目のループに入ります。
さてファイルが大分大きくなってしまいましたので、
以降のトレースは次話で。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ