第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

2次元の意味
において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行下です。







































答え
vba
この結果は
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次元ループを理解していただくための最も自然な課題は、
2013
を実現する
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から始める方が自然であるということが今回の話題から理解していただけたでしょうか。
もちろん、いくつから始めるからは課題によりますし、
プログラマーの好みでもあるわけです。
プログラムという行為は、真に創造的な行為でして、自由なものです。
ですから、
2010
を実現するためには、
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話において、

2007
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 入門 基礎から応用まで
数学研究室に戻る