第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 | 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 |
(列番号の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 | 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 |
すなわち、
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 | 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 |
すなわち、
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 | 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 |
すなわち、
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 | 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 |
すなわち、
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 | 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 |
すなわち、
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 | 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 |
すなわち、
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 | 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 |
B13に合計値111が表示されてB列の合計の算出と表示に成功したのです。
最後に、
w = 0
によって、wが0に戻されます。
このタイミングで0に戻されるのは、次のループでC列に入るからです。
Next
によって13回目のループに入ります。
以降のトレースは是非ご自分でお願いします。
プログラミングは、心底納得する必要があるからです。
トレースが終わったら、行部分の改良に入りましょう。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ