2013-12-19

データの集計

最初に、前回の練習問題「九九の表」の説明をします。

For文を使った足し算

1から10までの数の合計を計算しましょう。
cells(1,1)=1+2+3+4+5+6+7+8+9+10
と書いても計算できますが、これでは「1から100までの数の合計を計算しなさい」と言われた時に大変です。
同じような作業の繰り返しはパソコンに任せましょう。

sub 足し算()
wa=0
for j=1 to 10
  wa=wa+j
next j
cells(1,1)=wa
end sub

と書いて実行すると、cells(1,1)に1から10までの数の合計が計算されます。
理由は、まず最初にwa=0にしておいて
wa=wa+1 (この時点でwaは1)
wa=wa+2 (この時点でwaは1+2)
wa=wa+3 (この時点でwaは1+2+3)
wa=wa+4 (この時点でwaは1+2+3+4)
wa=wa+5 (この時点でwaは1+2+3+4+5)
wa=wa+6 (この時点でwaは1+2+3+4+5+6)
wa=wa+7 (この時点でwaは1+2+3+4+5+6+7)
wa=wa+8 (この時点でwaは1+2+3+4+5+6+7+8)
wa=wa+9 (この時点でwaは1+2+3+4+5+6+7+8+9)
wa=wa+10(この時点でwaは1+2+3+4+5+6+7+8+9+10)
となるからです。

練習:1から100までの数の合計を計算しなさい。

For文を使った足し算

実際のデータの足し算をしてみましょう。
以前と同じデータを使います。
生徒身長座高
115988
215084
315786
415381
515883
615285
715583
815783
914576
1015885
1116185
1215083
1314879
1415484
1515485
1615985
1714983
1815586
1915384
2016088
出典

これをA1セルから貼り付けます。
すると20人の身長はB2からB21、つまりCells(2,2)からCells(21,2)にあります。
このままでは番号が分かりづらいので、x(1), x(2),...,x(20)という変数を用意して、そこへ代入します。

sub 身長と座高()
dim x(20)
for j=1 to 20
  x(j)=cells(j+1,2)
next j
end sub

ここまででは身長のデータを配列x(1), x(2),...,x(20)に読み込んで終わりです。
練習:20人の身長の合計を計算して、一行あけたcells(23,2)に代入するようにマクロを書き足しなさい。
sub 身長と座高()
dim x(20)
for j=1 to 20
  x(j)=cells(j+1,2)
next j
ここに身長の合計を変数 wa に代入するマクロを書く
cells(23,1)="合計"
cells(23,2)=wa
end sub

合計を計算したら続けて平均も計算できます。
変数名に漢字を使うこともできます。

sub 身長と座高()
dim x(20)
for j=1 to 20
  x(j)=cells(j+1,2)
next j
ここに身長の合計を変数 wa に代入するマクロを書く
cells(23,1)="合計"
cells(23,2)=wa
身長の平均=wa/20 cells(24,1)="平均"
cells(24,2)=身長の平均
end sub

"平均"のように " " で囲むと 平均 という文字が表示され、囲まないと 身長の平均 という変数に代入された値が表示されます。

While文を使って個数を数える

今回は20人のデータでしたが、一つのマクロを複数のデータに対して用いる場合は、データによって人数が一定とは限りません。
そのような場合のために、マクロの最初で人数を数えましょう。

数える操作は何回繰り返すかが分かっておらず、上から順に見ていって最後に到達するまで繰り返します。
このように、条件を指定して繰り返すにはWhile文を使います。

Do While 条件
 この部分が繰り返される
Loop

先ほどのマクロのEnd Subより後に、次のマクロを書いてみてください。

Sub 数える()
j = 1
Do While Cells(j + 1, 2) <> ""
  j = j + 1
Loop
人数=j
MsgBox (人数)
End Sub

最後のMsgBox(人数)は、人数という変数の値を表示するマクロです。
Cells(j+1,2)が空っぽではない間は繰り返す、という意味です。
正しく数えられましたか?ずれていた場合はその理由を考えましょう。

配列の大きさを変更する。

人数が分かったので配列を用意するときに

Dim x(人数)

と書きたいのですが、これではエラーになります。
配列を用意するときの(括弧)の中に変数を書くことは出来ません。
マクロの途中で配列の大きさを変えるには、まず最初に

Dim x()

のように(括弧)の中に何も書かずに
人数を数えた後で

ReDim x(人数)

と書きます。

練習

先ほど作ったマクロを、最初から20人に限らず、マクロの中で人数を数えて配列を用意して計算するように改造してください。

0 件のコメント: