マークシート、データの集計


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。その他

問題:採点プログラムを作ろう。  上記の集計プログラムは、採点プログラムではない。集計は各列ごとに(縦に)処理をしてゆくが、採点は各行ごとに(横に)行なうし、ソートも必要ない。