第6講 同じことの横縦の繰り返し(2次元ループ)
第6話 繰り返しを数える(コントロール)数の始め方
Private Sub CommandButton1_Click()
Dim i As Byte, j As Byte
For i = 0 To 9
For j = 1 To 10
Cells(6 + i, 1 + j) = 10 * i + j
Next
Next
End Sub
において1つだけ異質なのは、100です。
ここだけ3桁の整数なのです。
なので、
Private Sub CommandButton1_Click()
Dim i As Byte, j As Byte
For i = 0 To 9
For j = 1 To 10
Cells(6 + i, 1 + j) = 10 * i + j
Next
Next
End Sub
は
Private Sub CommandButton1_Click()
Dim i As Byte, j As Byte
For i = 0 To 9
For j = 0 To 9
Cells(6 + i, 2 + j) = 10 * i + j
Next
Next
End Sub
と訂正する方が自然です。
これの実行結果を予想してください。
答えは30行下です。
答え
この結果は
00,01,02,03,04,05,06,07,08,09
10,11,12,13,14,15,16,17,18,19
20,21,22,23,24,25,26,27,28,29
・
・
・
90,91,92,93,94,95,96,97,98,99
に対応しています。
ですから、2次元ループを理解していただくための最も自然な課題は、
を実現する
Private Sub CommandButton1_Click()
Dim i As Byte, j As Byte
For i = 0 To 9
For j = 0 To 9
Cells(6 + i, 2 + j) = 10 * i + j
Next
Next
End Sub
プログラムを考えよ、であるわけです。
同じことの繰り返しをコントロールする数を、
わかりやすさを優先して、
For i = 1 To ?
と1から始めることが多かったわけですが、
実は0から始める方が自然であるということが今回の話題から理解していただけたでしょうか。
もちろん、いくつから始めるからは課題によりますし、
プログラマーの好みでもあるわけです。
プログラムという行為は、真に創造的な行為でして、自由なものです。
ですから、
を実現するためには、
Private Sub CommandButton1_Click()
Dim i As Byte, j As Byte
For i = 0 To 9
For j = 0 To 9
Cells(6 + i, 2 + j) = 10 * i + j
Next
Next
End Sub
でも、
Private Sub CommandButton1_Click()
Dim i As Byte, j As Byte
For i = 1 To 10
For j = 1 To 10
Cells(5 + i, 1 + j) = 10 * (i - 1) + j - 1
Next
Next
End Sub
でも
Private Sub CommandButton1_Click()
Dim i As Byte, j As Byte
For i = 6 To 16
For j = 2 To 12
Cells(i, j) = 10 * (i - 6) + j - 2
Next
Next
End Sub
でもよいわけです。
今まで解答例と必ず例を付けてきた理由は、
プログラムの場合答えは無数にあるからです。
以上を断った上で、
同じことの繰り返しをコントロールする数は、
0から始めるのが自然である、とあえて繰り返しておきましょう。
普通はものごとは1から数え始めるのですが、
プログラミングの場合は、0から数え始めることが多いのです。
0から数え始まるということを理解していませんと、
第8講で学ぶ予定になっている配列の理解に支障を来します。
因みに、第7講では、社長と社員(親分と子分)を学ぶ予定になっています。
さて、最後にとても難しい課題を出してこの話を閉めます。
第5講第5話において、
Private Sub CommandButton1_Click()
Cells(6, 2) = "出席番号"
Cells(6, 3) = "国語"
Cells(6, 4) = "社会"
Cells(6, 5) = "数学"
Cells(6, 6) = "理科"
Cells(6, 7) = "英語"
Cells(6, 8) = "合計"
Cells(6, 9) = "平均"
Cells(6, 10) = "評価"
Dim i As Byte, w As Integer
For i = 1 To 10
Cells(6 + i, 2) = i
Cells(6 + i, 3) = Int(100 * Rnd())
Cells(6 + i, 4) = Int(100 * Rnd())
Cells(6 + i, 5) = Int(100 * Rnd())
Cells(6 + i, 6) = Int(100 * Rnd())
Cells(6 + i, 7) = Int(100 * Rnd())
Next
w = 0
For i = 1 To 10
w = w + Cells(6 + i, 3)
Next
Cells(17, 3) = w
Cells(18, 3) = w / 10
If w / 10 >= 50 Then
Cells(19, 3) = "合格"
Else
Cells(19, 3) = "不合格"
End If
w = 0
For i = 1 To 10
w = w + Cells(6 + i, 4)
Next
Cells(17, 4) = w
Cells(18, 4) = w / 10
If w / 10 >= 50 Then
Cells(19, 4) = "合格"
Else
Cells(19, 4) = "不合格"
End If
w = 0
For i = 1 To 10
w = w + Cells(6 + i, 5)
Next
Cells(17, 5) = w
Cells(18, 5) = w / 10
If w / 10 >= 50 Then
Cells(19, 5) = "合格"
Else
Cells(19, 5) = "不合格"
End If
w = 0
For i = 1 To 10
w = w + Cells(6 + i, 6)
Next
Cells(17, 6) = w
Cells(18, 6) = w / 10
If w / 10 >= 50 Then
Cells(19, 6) = "合格"
Else
Cells(19, 6) = "不合格"
End If
w = 0
For i = 1 To 10
w = w + Cells(6 + i, 7)
Next
Cells(17, 7) = w
Cells(18, 7) = w / 10
If w / 10 >= 50 Then
Cells(19, 7) = "合格"
Else
Cells(19, 7) = "不合格"
End If
w = 0
For i = 1 To 5
w = w + Cells(7, 2 + i)
Next
Cells(7, 8) = w
Cells(7, 9) = w / 5
If w / 5 >= 50 Then
Cells(7, 10) = "合格"
Else
Cells(7, 10) = "不合格"
End If
w = 0
For i = 1 To 5
w = w + Cells(8, 2 + i)
Next
Cells(8, 8) = w
Cells(8, 9) = w / 5
If w / 5 >= 50 Then
Cells(8, 10) = "合格"
Else
Cells(8, 10) = "不合格"
End If
w = 0
For i = 1 To 5
w = w + Cells(9, 2 + i)
Next
Cells(9, 8) = w
Cells(9, 9) = w / 5
If w / 5 >= 50 Then
Cells(9, 10) = "合格"
Else
Cells(9, 10) = "不合格"
End If
w = 0
For i = 1 To 5
w = w + Cells(10, 2 + i)
Next
Cells(10, 8) = w
Cells(10, 9) = w / 5
If w / 5 >= 50 Then
Cells(10, 10) = "合格"
Else
Cells(10, 10) = "不合格"
End If
w = 0
For i = 1 To 5
w = w + Cells(11, 2 + i)
Next
Cells(11, 8) = w
Cells(11, 9) = w / 5
If w / 5 >= 50 Then
Cells(11, 10) = "合格"
Else
Cells(11, 10) = "不合格"
End If
w = 0
For i = 1 To 5
w = w + Cells(12, 2 + i)
Next
Cells(12, 8) = w
Cells(12, 9) = w / 5
If w / 5 >= 50 Then
Cells(12, 10) = "合格"
Else
Cells(12, 10) = "不合格"
End If
w = 0
For i = 1 To 5
w = w + Cells(13, 2 + i)
Next
Cells(13, 8) = w
Cells(13, 9) = w / 5
If w / 5 >= 50 Then
Cells(13, 10) = "合格"
Else
Cells(13, 10) = "不合格"
End If
w = 0
For i = 1 To 5
w = w + Cells(14, 2 + i)
Next
Cells(14, 8) = w
Cells(14, 9) = w / 5
If w / 5 >= 50 Then
Cells(14, 10) = "合格"
Else
Cells(14, 10) = "不合格"
End If
w = 0
For i = 1 To 5
w = w + Cells(15, 2 + i)
Next
Cells(15, 8) = w
Cells(15, 9) = w / 5
If w / 5 >= 50 Then
Cells(15, 10) = "合格"
Else
Cells(15, 10) = "不合格"
End If
w = 0
For i = 1 To 5
w = w + Cells(16, 2 + i)
Next
Cells(16, 8) = w
Cells(16, 9) = w / 5
If w / 5 >= 50 Then
Cells(16, 10) = "合格"
Else
Cells(16, 10) = "不合格"
End If
w = 0
For i = 1 To 10
w = w + Cells(6 + i, 8)
Next
Cells(17, 8) = w
Cells(18, 8) = w / 10
Dim v As Single
v = 0
For i = 1 To 10
v = v + Cells(6 + i, 9)
Next
Cells(17, 9) = v
Cells(18, 9) = v / 10
Cells(17, 2) = "合計"
Cells(18, 2) = "平均"
Cells(19, 2) = "評価"
End Sub
(参考ファイル 1次元ループによる成績一覧表マクロ
ここから学習を始める方は上のリンクをクリックして開いてください。)
という大変できの悪いプログラムコード
(プログラムの文章のこと、プログラムソースともいいます。)
を組みました。
これを同じことの横縦の繰り返しを用いて、
洗練されたプログラムの文章に変更してください。
第5話へ 第7話へ
vc++講義へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義へ
VB講義基礎へ
初心者のためのJava 入門 基礎から応用まで
数学研究室に戻る