ダウンロード

配列数式−予備集計表を使わずに一気に集計

配列数式ハイレツスウシキとは?

文字通り配列を数式の中に当てはめて結果を求める数式です。
複雑な計算も作業用セルを使わず一つの数式で計算できます。
また、複数の条件に合致したデータの件数や合計値などを一つの数式で求めることも可能です。
ここでは、画配列数式と似た機能を持つSUMPRODUCT関数を例として始め、
徐々に配列数式をメインに移していきます。




SUMPRODUCTサムプロダクト

書式: =SUMPRODUCT(配列2,配列2)

配列に対応する要素間の積をまず計算し、さらにその合計を返します。

複数条件の件数をカウントしたり、合計を算出することができ、
後述する配列数式を用いる方式に、かなり近い機能を有しています。

ここでは、簡単な集計から始め、最初のうちは、
SUMPRODUCTを用いる方法
データベース関数(SUMIF , COUNTIF , DSUM など)
配列数式を用いる方法
の3つを併記しながら進めます。

SUMPRODUCTと配列数式は、かなり考え方が似ているので、 SUMPRODUCTの練習を行っていく過程で、配列数式の練習にもなると思います。

以下、練習問題形式

合計金額算出 - 配列間の要素の積の合計を計算



問.売り上げ金額を求めなさい。


この表には、合計金額=単価×数量のフィールドがありません。
が、SUMPRODUCTを使うと一発で売り上げ金額を求めることが出来ます。


■SUMPRODUCTを使う方法



セル I17 に = SUMPRODUCT(G6:G15,H6:H15)と入力。以上。
この関数が計算される過程で、内部では以下のように処理されます。
1. G6:G15が配列A、H6:H15が配列Bに割り当てられる
 また、A,Bの大きさに応じた集計用配列Cが作成される。
 (配列A,B,Cは、エクセル内での作業用配列)
2. 配列Aの1番目(G6)の値と、配列Bから1番目(H6)の値を出す
3.その積を計算し結果を集計用配列Cに格納
4. 配列全ての要素の処理が終わったら、集計用配列Cの合計値を計算し結果を出力。
それぞれの配列の要素を順に処理していきますので、配列のサイズは一致していなければいけません。
試しに、単価の範囲だけを HG:H16と大きくして計算してみると、#N/Aのエラーが発生します。
単価のH16を処理する段階で、対応する数量の要素が無いためです。

■集計関数を使う方法



SUM関数で合計する場合は、集計用金額フィールドを追加し、単価×数量を計算しておく必要があります。

■配列数式を使う方法



ほとんどSUMPRODUCTと同じです。SUM関数を使用。

方法
1.セルに「 SUM 」を入力して、範囲 G49:G58 を選択、
2.*(乗算) を入力、
3.範囲 H49:H58 を選択して、Ctrl+Shift+Enter を押下。ここがポイント。

式の前後に { } 記号が自動的に挿入されます。これが配列数式を表しています。
なお、この記号は記号としては直接入力することはできません

また、式を編集しようとしただけで解除されます。
式を編集した場合は、再度、Ctrl+Shift+Enter を押下する必要があります。
入力を取り消す場合は、ESCを押します。

金額算出 - 条件に合致する合計金額を計算

問、商品名と一致する金額の合計を計算しなさい



=SUMPRODUCT($B$3:$B$14=G7,$D$3:$D$14)
とすれば、合計金額が出そうですが、$B$3:$B$14=G7 は TRUE/FALSE の論理値なので、 TRUE → 1、FALSE → 0 とする必要があります。
以降でも述べていますが、数値を掛けることにより、論理値 → 数値に変換することができます。
具体的には、下図のように1を掛けます。
($B$3:$B$14=G7)*1
条件に合致したところだけ1、合致しなかったところは 0 になるので、 条件に合致する商品区分のみが合計対象となります。
データベース関数 SUMIF関数 を使った方法も併記 このレベルでは、どの方法も「どっこいどっこい」ですね。
配列数式では、計算式自体が 論理値×数値 なので、*1 の必要はありません。

複数条件1 - 複数の条件に合致する個数を計算

問.商品名とサイズに一致する商品の個数を計算しなさい

■SUMPRODUCTを使う方法

少し難しくなります。
どちらの配列も数値では無いので、簡単には個数は出ません。
商品名の配列 B10:B17 と指定商品名 B7 を比較します。
比較演算 B10:B17= B7 の結果は TRUE / FALSE の論理値となるので、これを数値に変換する必要があります。
INT (TRUE)→1 INT(FALSE)→0
なので、これを利用しても良いのですが、前問と同様に1を掛けることで可能
TRUE*1 →1 FALSE*1→0
となります。
(B10:B17=B7)*1 商品名が一致したら 1、しなかったら 0
(C10:C17=C7)*1 サイズが一致したら 1、しなかったら 0

SUMPRODUCTは配列間の積の和を算出するので、
商品名とサイズが一致(共に 1)した場合だけ 1 となり その総和が個数となります。
 共に1の場合 1=1x1
 どちらかが一致しない場合 0=1x0 0=0x1

以上

なお、ここでは合わせてデータベース関数DCOUNTAを使った方法も併記します。

■配列数式を使う方法




=SUM(B48:B55=B45)*(C48:C55=C45)
と入力して、Ctrl+Shift+Enter を押します。
SUMPRODUCT と同じく、B48:B55=B45 は論理値になりますが、論理値を乗算した時点で数値になります。
*1 の必要はありません。
それぞれのAND条件の論理値なので、掛け算として処理できます。

SUMPRODUCTより少しだけ簡素。

論理積表

TRUE × TRUE -> 1
TRUE × FALSE -> 0
FALSE × TRUE -> 0
FALSE × FALSE -> 0


複数条件2 - 全てに合致!

問.テスト結果で、全て80点以上ならば「合格」と表示なさい。

全て80点以上でも可能ですが、どれかが80未満なら不合格と認識した方が、処理的には簡単です。
以下の式は、16行目の式を例にしています。
4〜15行の4式も同様 - コピー用に複合参照としています。

■SUMPRODUCT

条件は1つなので、配列は1つしか使用しません。

80未満の人を判定し、1を掛けて O , 1 の数値に変換
 SUMPRODUCT(($C16:$G16<80)*1) 結果は80点未満の人の人数となるので、結果が 0 の場合に"合格"です。

■データベース関数

COUNTIF関数を使します。 同じく、80点未満の人数が0ならば合格ですね。

配列数式も簡単。 SUMPRODUCT と同様。SUMで集計します。
SUM($C16:$G16<80)*1)
配列計算のそれぞれ段階で、80点未満であれば1、以外は 0
よって、配列数式として途中の計算結果が合計されると80点未満の人の人数となります。

配列数式2は「80点以上のテスト数がテスト総数と等しい場合に合格」 という条件で設定したもの。
少し、数式が長くなります。

複数条件3 - 性別 AND 年齢 集計



問.指定の性別、かつ、30歳以上の人数を集計しなさい。

■SUMPRODUCT

性別の比較: $C$4:$C$20=G6
年齢の比較: $E$4:$E$20>=$I$5
以下、修正した計算式。1をかける必要はありません。掛け算の時点で数値になります。
=SUMPRODUCT(($C$4:$C$20=G6)*($E$4:$E$20>=($I$5))
補足:I5,K5,M5にて「30以上」と文字のようになっていますが、表示形式で"以上"が表示されているだけで、 実際には「30」という数値です。

■配列数式

同様。
{=SUM($C$4:$C$20=G6)*($E$4:$E$20>=$I$5)}

■DCOUNT(データベース関数)

式自体は簡単ですが、条件フィールドを作る必要があり、性別の一覧状態での集計表の作成が難しいようです。
=DCOUNTA($B$3:$E$20,"年齢",$M$8:$N$9)
補足:全体的に絶対参照として記述しているのは、式を行方向に数式をコピーするため。
SUMPRODUCT や配列数式の機能とは関係ありません。

複数条件4 - 都道府県 OR 集計

例1.都道府県が「東京都、神奈川県」のいずれかの人数を求めなさい

■SUMPRODUCT

都道府県の上比較: D4:D23={"東京都","神奈川県"}
{ }で括ることで配列定数として使用できます。
この { } は配列数式と異なって手入力します。
D4:D23={"東京都","神奈川県"} とすることで、「いずれかに一致」としての OR条件として使用可能。
以下、1を掛けて数値化。
=SUMPRODUCT((D4:D23={"東京都","神奈川県"})*1)

■配列数式

同様。
{=SUM((D4:D23={"東京都, 神奈川県})*1)}

■DCOUNT(データベース関数)

DCOUNT関数には条件フィールドが必要
=DCOUNTA(B3:E23,"都道府県",M9:M11)

< おまけ >

例2.都道府県が「東京都、神奈川県」のいずれかで、男性の人数を求めなさい

AND条件が追加されましたが、これは今までと同じ。
例1で作成した条件式に、「男性」であるという条件式を掛けた式(論理積)になります。

複数条件5 - 性別 OR 年齢 集計

問、指定の性別または、30歳以上の人数を集計しなさい。

■配列数式

論理和は足し算で実現できますが、注意点がひとつ。
TRUE + TRUE → 2 となって、余分に集計されてしまいます。下図の論理和表参照
よって、ここではIF関数を使って強制的に 1,0 にしています。
0 の場合 → 0、0 以外 → 1
論理和表
TRUE + TRUE -> 2 ← 注意
TRUE + FALSE -> 1
FALSE + TRUE -> 1
FALSE + FALSE -> 0


{=SUM(IF(C4:C23=J2)+(E4:E23>=J3),1,0)))}
IFを嫌えば、次のように書き換えることも出来ます。ますます、難解・・
{=SUM((((C4:23=J2)+(E4:E23>=J3)>0)*1)}

■SUMPRODUCT

配列数式と同じに形式に記述するとOK
=SUMPRODUCT((((C4:E23=J2)+(E4:E23>=J3))>=1)*1)
IFを使って記述すると、何故か結果が0になる・・・ - 保留
=SUMPRODUCT(IF((C4:C23=J2)+(E4:E23>=J3)>=1,1,0))
ちなみに、フリーのオフィスソフト LibreOfficeCalc で開いてみると、下図のように正常「6」に計算されています。


キングソフト( kingsoft-spreadsheets2012) では、エクセルと同じく「0」となります。

■DCOUNT(データベース関数)

条件フィールドが必要
=DCOUNTA(B3:E23,"性別",M9:N11)

複数条件6 - 日数集計(勤務集計)

下のシフト表から勤務ごとの日数を緑枠内に集計しなさい。


SUMPRODUCT

=SUMPRODUCT(($C13:$AG13=AI$12)*1,($C13:$AG13<>"")*1)

配列数式

{=SUM(($C13:$AG13<>"")*($C13:$AG13=AP$12)*1)}

SUMIF

SUMIFで集計するためには数値表が必要となるので、あらかじめCOUNTIFで勤務数を集計しておきます。
=SUMIF($C13:$AG13,AI$33,$C34:$AG34)


複数条件7 - 日数集計(曜日集計)

問. シフト表を集計して、勤務を選択したら曜日ごと勤務日数が表示されるようにしなさい。

 また、ワイルドカード「*」の場合、全勤務が集計対象になるようにしなさい。

■配列数式

{=SUM($C$12:$AG$12=AI$12)*IF((($AG$8="*")*($C13:$AG13<>""))+($AG$8=$C13:$AG13),1,0))}
集計表の曜日と一致 - $C$12:$AG$12=AI$12
指定勤務とシフト表の勤務が一致 - $AG$8=$C13:$AG13
ただし、指定勤務が「*」の場合は、空白で無い全ての勤務が対象なので
($AG$8="*")*($C13:$AG13<>"") となります。
以上、指定勤務が一致する場合とのOR条件となるので、
(($AG$8="*")*($C13:$AG13<>""))+ ($AG$8=$C13:$AG13)
となります。
ここで、この論理和は両方が成り立つ(勤務名が「*」の)場合に 2 となり集計に不備が出てきます。
本例では勤務名に「*」は無いのでありえませんが・・・ 念のために以下のようにIF関数で判定しで置きます。
{=SUM($C$12:$AG$12=AI$12)*IF((($AG$8="*")*($C13:$AG13<>""))+($AG$8=$C13:$AG13),1,0))}

■データペース関数

一気には計算できないので、IF関数で集計予備表に曜日番号が表示されるようにして置きます。
この予備表を元にCOUNTIF関数で集計することになります。
=COUNTIF($C34:$AG34,AI$33)

その他1 - 順位を付ける



問.中間テストの成績順位を付けなさい。

全体順位クラス内順位を付けます。


■RANK関数

順位を付ける方法として最も一般的な方法は、RANK関数と思われます。
比較対象と範囲を指定するだけで順位が求まりますが、条件を付ける事が出来ません。
RANKIFなる関数があれば良いのですが・・・残念ながら無いようです。

■COUNTIF関数

IFを末尾に持つ関数にCOUNTIF関数がありますが、惜しいかな、条件は一つしか設定できません。 上記例は、自分より大きい点数の数 +1 を順位としています。
自分より点数が大きい人が3人いる場合、自分の順位は4番目。「">" & D17」 が条件式

■配列数式 - 全体順位

配列数式を使うと簡単に順位も求めることが出来ます。
$D$6:$D$17>$D17 が真(点数が上)の場合にTRUEとなり、それに1を掛けて整数化
点数が上でない場合はFALSEとなり、1を掛けて0となるので、SUMで合計すると自分より大きい点数の人数が得られます。 その値に1を加算したものが自分の順位。

■配列数式 - クラス内順位

Bにクラス番号と一致するか判定($C$6:$C$17=$C17)を掛けることにより条件を絞り込むことができます。
クラスが一致しなければ全て 0 なので順位に影響しません。
この例から判るように、必要であれば男女/出身地なども条件追加でき、その条件数に制限はありません。
また、AND条件だけでなく、OR条件も可能です。
使用方法を会得できれば、万能の力を発揮しそうです!

その他2 - 最も長い文字列を探す

問、下図の5つの文字列で、文字数の一番多い文字列を取り出しなさい。

通常は、
@ それぞれの文字列の長さを求める - LEN関数
A 一番長い文字列を探す - MAX関数
B その行位置を調べる - MATCH関数
C 行位置から求める文字列を出す - INDEX関数
の手順で行うことになるかと思われます。

配列数式を使うと、これらを1行の数式に纏めることが出来ます。
この問題で配列数式を使うべきかは異論があると思いますが、
この手法をマスターすることで、どのような場面でも配列数式を適用することが出来るようになることでしょう。


その他3 - 等しくないデータ個数と最大値データ

例1.二つのセル範囲で、等しくないデータの個数を調べる


例2. セル範囲内で、最大値の位置(アドレス)を調べる


セルD46の式
{=ADDRESS(MIN(IF(D36:D44=MAX(D36:D44), ROW(D36:D44),"")), COLUMN(D36:D44))}
注: {=ADDRESS(IF(D36:D44-MAX [D36:D44),ROW(D36:D44),""),COLUMN(D36:D44))} とは書けません。
 配列数式 IF(D36:D44=MAX(D36:D44),ROW(D36:D44),"")配列で返るため、
 ADDRESS関数では受け取れないためです。

上記の式の意味
・作業用の内部配列に
 指定範囲内のデータがその範囲内の最大値と等しいとき行番号をセット
 等しくなかったら空白をセット
・作業配列をMIN関数に渡す - 返り値は最小の行番号
・行番号と列番号をADDRESS関数に渡して、そのセルのアドレスが返る。

実際には、範囲に名前を付けておいた方が良いでしょう。
範囲 D36:D44 に”データ”と名前を付けておいた場合
{=ADDRESS(MIN(IF(データ=MAX(データ),ROW(データ),"")),COLUMN(データ))}
と、かなり見易くなります。

まとめ



数式配列を使用すると、ほとんどの集計が可能ですが、配列集計でのみ可能な問題はありません。
配列集計で可能なことは、予備表を使って必ず可能です。
また、簡単な条件の場合は、通常のSUMIF COUNTIFなどが、はるかに便利です。

長所

★計算式の簡素化
数式配列が威力を発揮するのは、複雑な条件になった場合です。
条件の判定は、AND, ORが条件の掛け算/足し算として設定できるため、数式が簡素になります。
IFやSUMIF, COUNTIFでも同じく条件式を掛け算/足し算で可能ですが、
配列数式は配列全体に対して演算が行えます。
★シート構成の簡素化
予備の集計表を使う必要がないため、ワークシートの構成簡素にできます。

短所

★式の意味が難解
難点は、慣れない人には何の数式かさっぱり判らない、簡単に配列数式が解除されることです。
★配列数式が簡単に解除される
配列数式は、ダブルクリックや数式バーで式を見ようとしただけで簡単に解除されます。
忘れて、そのままにして置くと数式自体がエラーとなります。
作った本人は、まだ、CTRL+SHIFT+ENTER で式を閉じることで復元出来ますが、
他者が作ったものは、 配列数式に慣れている人でも、元が配列数式だと気付くのには少々時間がかかります。
(数式内の見慣れない論理演算などで判断するしかありません・・・)
配列数式を使ったシートには、シート保護(編集ロック)を掛けておく必要があるでしょう。
★他者への配布
最大の注意点は、他者へEXCELブックを渡す場合です。
ブックを他者へ渡す場合は、詳細な数式の説明書が必要でしょう。
★計算速度の低下
配列数式は、内部的には表と同じ作業領域をメモリに確保されるため、
大きな配列数式を使用する場合、メモリ使用量の増加計算速度の低下をもたらす場合があります。

便利な反面、結構、面倒です。

記述上の注意点

★ 配列関数で AND 関数とOR関数を直接使用することはできません。

代わりに、OR / AND 条件を満たす値に対して、加算や乗算などの数学的論理演算を使用します。

★複数セルの配列数式を構成する個々のセルを上書きすることはできません。

配列の一部を変更できません」とメッセージが表示され、変更が拒否されます。
これは、配列数式として設定された数式は全てのセルで同じという一貫性を保つためです。
変更したい場合は、範囲を全て選択して変更後、CTRL+SHFT+ENTERを押す必要があります。
配列数式を解除したい場合は、範囲を選択して、数式バーにカーソルを置き、CTRL+ENTERを押します。

関連項目


>> トップページ へ    >> エクセル無料教材 へ




×
PageTop