マークシート、データの集計
1。概要
マークシートを読み込んで取得したデータをもっているとき、全体像をつかむために集計したい。
2。使い方
まず、第1行目の項目名称を「含ませないで」、データ部分の全体をドラッグして選択しておく。そして、「選択範囲のデータを集計する」ボタンをクリックすると、選択範囲の確認画面が現われる。OKボタンを押せば、全体の処理が始まる。時間の経過につれて、データ部分は何度もソートされてゆく。集計値は下に書き込まれてゆく。
3。作り方
まず、ひとつのボタン(ボタン1)を作成する。つぎに以下のように、VBAスクリプトを記述する。ボタン名を合わせておくこと。
-----------------------------------
Sub ボタン1_Click()
'--マークシート、データ集計プログラム 2004.5(c)旭貴朗
'--セル(n,m)のデータを縦に集計して、セル(t,u)に横に書き込んでゆく
'--準備
Set myRange = Application.Selection
gyo1 = myRange.Row
gyo2 = myRange.Rows(myRange.Rows.Count).Row
m1 = myRange.Column
m2 = myRange.Columns(myRange.Columns.Count).Column
msg1 = "「第1行目の項目名を除く」データ全体を選択していますか。"
msg2 = "わたしは、このように理解しています。1行目は項目名で、データは"
msg3 = " 行範囲 " & gyo1 & " から " & gyo2 & " まで"
msg4 = " 列範囲 " & m1 & " から " & m2 & " まで"
msg5 = "データはソートされ、集計結果は選択部分より下の行に書き込みます。"
msg6 = "それでよろしいか?"
msg = msg1 & Chr(13) & Chr(10) & msg2 & Chr(13) & Chr(10) & msg3 & Chr(13) & Chr(10) & msg4 & Chr(13) & Chr(10) & msg5 & Chr(13) & Chr(10) & msg6
ret = MsgBox(msg, vbOKCancel)
If ret = 2 Then Exit Sub
'--集計開始
t = gyo2 + 2
For m = m1 To m2
Cells(gyo2 + 2, 1) = m & "列を処理中"
myRange.Sort (myRange.Columns(m)) '--第m列をキーとしてデータをソート
t = t + 2
Cells(t, 1) = Cells(1, m) '--1行目の項目名を記入
startChar = Cells(gyo1, m) '--2行目のデータの値を取得
u = 2
Cells(t, u) = startChar
counter = 1
Cells(t + 1, u) = counter '--その値が1個あったことになる
For n = gyo1 + 1 To gyo2
atai = Cells(n, m) '--3行目以降の値を取得
If atai = startChar Then
counter = counter + 1 '--以前と同じ値ならカウント増加
Cells(t + 1, u) = counter
Else
startChar = atai
counter = 1
u = u + 1
Cells(t, u) = atai
Cells(t + 1, u) = counter
End If
Next n
Next m
Cells(gyo2 + 2, 1) = (m - 1) & "列を処理しました"
End Sub
4。プログラムの解説
<データ>
第1行目に必ず項目名があること。2行目以下は、各行がひとつのマークシートの読取り値である。上記の例図では、第20行がデータの終わりである。つまり19枚のマークシートを読み込んだのである。これにボタンを作成して利用する。
<プログラム>
プログラムは、準備部分と集計部分に分けられる。準備部分では、選択範囲の確認のために、MsgBox関数を使っている。集計部分では、各列に対して、まずソートを行ない、その列の値(記号)を順序よく並ばせる。上から順に見てゆき、同じ値のものをカウントしている。
5。その他
問題:採点プログラムを作ろう。
上記の集計プログラムは、採点プログラムではない。集計は各列ごとに(縦に)処理をしてゆくが、採点は各行ごとに(横に)行なうし、ソートも必要ない。