第3講 For文の学習

第5話 2次元ループその2
第4話問題解答例
Private Sub CommandButton1_Click()
  Dim i As Byte, j As Byte, w As Single

  '各生徒の合計・平均
  For i = 1 To 2
    w = 0
    For j = 1 To 3
      w = w + Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 5) = w
    Cells(6 + i, 6) = w / 3
  Next

  '各教科の合計・平均
  For i = 1 To 5
    w = 0
    For j = 1 To 2
      w = w + Cells(6 + j, 1 + i)
    Next
    Cells(9, 1 + i) = w
    Cells(10, 1 + i) = w / 2
  Next

End Sub
実行画面
g01

解説
2次元ループになると、1次元ループより著しく難しくなります。
なので1行1行解説していきましょう。
  Dim i As Byte, j As Byte, w As Single
iとjをバイト型にした理由は、iとjは5以下であることが明らかだからです。
wは単精度浮動小数点型にしてあります。
理由は、割り算を使うからです。
割り算を使うときは、単精度浮動小数点型か倍精度浮動小数点型にしておいた方がよいのです。
VBAの場合は、整数型にしておいてもちゃんと小数にしてくれますが、
そのデータで足し算を行うときに微妙な誤差が生まれます。
ですから、割り算があるときは単精度浮動小数点型か倍精度浮動小数点型にしておいた方がよいのです。


次の
  '各生徒の合計・平均
  For i = 1 To 2
    
w = 0
    For j = 1 To 3
      w = w + Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 5) = w
    Cells(6 + i, 6) = w / 3
  Next
ですが、うっかり
  '各生徒の合計・平均
  
w = 0
  For i = 1 To 2
    For j = 1 To 3
      w = w + Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 5) = w
    Cells(6 + i, 6) = w / 3
  Next
としてしまうと、
g02
となってしまいます。
出席番号ごとに、いったんは合計を0にしないと累積してしまいます。
392とは42+98+91+22+74+65です。
さて、
  '各生徒の合計・平均
  For i = 1 To 2
    w = 0
    For j = 1 To 3
      w = w + Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 5) = w
    Cells(6 + i, 6) = w / 3
  Next
For文制御変数iとjの働きは何でしょうか。
iは行の操作、jは列の操作です。
i=1は出席番号1に対応します。
ですから、i=2は出席番号2に対応します。
j=1は何に対応するかと申しますと、国語です。
ですから、j=2は数学、j=3は英語に対応します。

トレース(コンピュータの動きを追うこと)してみましょう。
T 
i = 1の場合
 w = 0 
 @ j = 1のとき、
   w = w + cells(6 +
1,1+1)
   より
   w←0+42なのでwの箱には42が入ります。
 A 
j = 2のとき、
   w = w + cells(6 +
1,1+2)
   より
   w←42+98なのでwの箱には140が入ります。
 B j = 3のとき、
   w = w + cells(6 +
1,1+3)
   より
   w←140+91なのでwの箱には231が入ります。
g03
    Cells(6 + 1, 5) = w
    Cells(6 + 1, 6) = w / 3
   により、合計と平均のセルに231と77が入ります。
U 
i = 2の場合
 w = 0 
 @ 
j = 1のとき、
   w = w + cells(6 +
2,1+1)
   より
   w←0+22なのでwの箱には22が入ります。
 A j = 2のとき、
   w = w + cells(6 +
2,1+2)
   より
   w←22+74なのでwの箱には96が入ります。
 B 
j = 3のとき、
   w = w + cells(6 +
2,1+3)
   より
   w←96+65なのでwの箱には161が入ります。
g04
    Cells(6 + 2, 5) = w
    Cells(6 + 2, 6) = w / 3
   により、合計と平均のセルに161と53.67が入ります。


教科などの合計については、ご自分でトレースされてみてください。

さて、いよいよ懸案のダウンロード用ファイル成績一覧表拡大版2次元ループによって完成させましょう。
前に教科合計は作ってありますがその部分も2次元ループにしましょう。




第4話へ 第6話へ

004


vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る