English

一定間隔毎の集計

図1.例題のように C 列の数値を5行間隔毎に合計や平均を求める方法について質問がありました。第1項目 の合計では 『 =c2+c7+c12 』 または 『 =sum(c2,c7,c12) 』、 第2項目 の平均の場合 『 =average(c3,c8,c13) 』 と直接入力すればそれぞれ 合計、平均が得られますが、データが多いと面倒です。また SUM 関数、AVERAGE 関数は 255 (Excel2003では30) までしか引数を設定できません。

オートフィル と SUMIF 関数を使う方法

図1. 例題

図1.B のように適当な任意の5つの語句 ( ここでは単純な A,B,C,D,E を使っていますが 国語、数学、英語、理科、社会 などの語句の方が視覚的に分かりやすいかもしれません。 但し数字を含む語句は不可です ) を b2 〜 b6 セルにタイプ入力し、これら 5 セルを選択したうえで表の最下部までExcel のオートフィル機能を利用して埋めます。(図1.C)

コピー操作の場合は貼り付け先の範囲を5の倍数にする必要がありますがオートフィルではその必要はありません。

第1項目の合計は、 『 =sumif(b2:b16, "a", c2:c16) 』、 " 国語 " の語句を使っていれば 『 =sumif(b2:b16, "国語", c2:c16) 』 で求まります。

第2項目の平均は 『 =averageif(b2:b16, "b", c2:c16) 』、あるいは 数学 の語句を使っているなら『 =averageif(b2:b16, "数学", c2:c16) 』 で5行おきデータの平均が得られます。

(注) AVERAGEIF 関数は Excel2003 では使えません。
SUMIF 関数は =SUMIF(検索範囲, 検索条件 ,〔合計範囲〕)、AVERAGEIF 関数は =AVERAGEIF(範囲, 条件,〔平均対象範囲〕)の形式で使います。
Excel2007 で SUMIF 関数を使う場合セル位置によっては不都合が生じる場合があります。ドロップダウンリスト参照

5行間隔以外の場合

『 A,B,C … 』 のような語句の使用は無味乾燥ですが5行間隔以外でも汎用的に使え、また例で分かるように アルファベットを使った場合には検索条件に大文字、小文字の区別はしないというメリットがあります。

より無味乾燥になりますが7行間隔や12行間隔の場合 『 日、月、火、… 』 また 『 子、丑、寅… 』 を応用するのが簡単です。この場合、 『 日、月… 』、 『 子、丑、寅… 』 のいずれかの一語を1つのセルに入力するだけで表の最下部までオートフィルして7行間隔あるいは 12行周期のデータを埋めることができます。

フィルターを利用する方法

図1.C にフィールド名を追加します。具体的には b1 セルに例えば " 項目 "、 c1 セルに " 点数 " などとタイプします。Excel2003 では 『 データ 』→ 『 フィルタ 』→ 『 オートフィルタ 』、Excel2007 では同様の操作 Alt,A,T (Alt キーに続いてA, T を押す)

b1 セルの " 項目 "に表示されるドロップダウンメニューから ( Excel2007 ではまず 『 (すべて選択) 』のチェックを外してから) A あるいは " 国語 " をチェックして OK を押します。

他の項目がフィルターされたシートが表示され、c17 セルで (オートSUM) のコマンドをクリックすると自動的に『 =SUBTOTAL(9,C2:c16) 』 と入力され 258 と表示されます。

この方法では平均値を求めるのは困難です。

データを別の列に抽出する方法

図2.

前項の5つの語句を使う方法

e2 セルに 『 =if(b2="A", c2, 0) 』と入力し、e3 〜 e16 セルにコピーまたはオートフィルを行って貼り付けます。e17 セルで (オートSUM) で 『 =sum(e2:e16) 』 が自動的に入力され合計が求まります。

一方 f2 セルでは 『 =if(b2="B", c2, "") 』と入力し、f17 で 『 =average(f2:f16) 』 をタ イプして平均を求めています。

除算の余り ( MOD 関数 )と連番を利用

図2. のように A 列 に 1,2,3…のような連番を作っておきます。

e2 セルに 『 =if(mod(a2, 5) = 1, c2, 0) 』とタイプして e3 〜 e16 セルにコピーしても前項と同じ結果になります。

一方、f2 セルで 『 =if(mod(a2, 5)= 2, c2, "") 』 とタイプして同様にコピーしても同じです。

『 =mod(a2, 5) 』 は a 列の a2 セルの値 (1) を 5 で割った余りを返します。

行番号を利用する方法

A 列 の連番とすぐ左の行見出しには一定の関係があり連番を付すのが面倒なのに気が付きます。図2. の g2 セルには
『 =if(mod(row() - row($c$2) + 1, 5)= 3, c2, "") 』
と入力し第1項目の場合と同様にして第3項目( C )の合計を求めますが、途中に空白セルがあるので g17 セルでは 『 =sum(g2:g16) 』 としています。

図2. では最上部 1 行空けていますが、詰めて表を作った場合には 行番号と連番が一致するので
『 =if(mod(row(), 5)= 3, c3, 0) 』
で C(第3項目目)の合計が求まり式もシンプルです。 『 =row() 』 は入力されているセルの行番号を返します。

その他の方法

図3.

少々難しいですが a1 セルからデータが埋まっている場合には 図3.のように a17 セルに
『 =sumproduct((mod(row(a1:a15), 5) =1)*1, a1:a15) 』
とタイプ入力して 第1項目の合計を求めることができます。

[Microsoft Excel ヘルプより] … =SUMPRODUCT(A2:B4, C2:D4) は a2*c2 + b2*d2 + a3*c3 + b3*d3 + a4*c4 + b4*d4 のように、2 つの配列の対応する要素どうしを掛け算し、さらにその和を求めます。

『 mod(row(a1:a15), 5)=1 』 の各要素は 5 で割った余りが 1 の行のときには TRUE で 1 を返しますがそれ以外の行では FALSE で 0 (ゼロ)を返します。

マクロのイミディエイトを使うなら次のようにします。集計最初のセル ( 第1項目 なら a1 セル、第3項目 なら a3 セル )をアクティブにしておきます。特定のセルには入力されずメッセージボックスに値が表示されます。

s=0:for i=1 to 15 step 5:s=s+activecell.cells(i,1):next:msgbox "計:"& s

上記述の変数、数値: s は合計を求める変数で 15 は行数、5 は間隔になります。

一方、第2項目 の平均を出すには a2 セルをアクティブにして

s=0:n=0:for i=1 to 15 step 5:s=s+activecell.cells(i,1):n=n+1:next:msgbox "平均:"& s/n

で OK です。n で個数をもとめています。

このサイトで扱った項目