GEN MUTO'S HOMEPAGE  エクセル大事典  エクセルVBAを極める

エクセルExcel大事典 エクセル大事典TOPページへ
 ■ エクセルの基本操作を完全マスター!
  配列数式を使ってみよう!
 
■配列数式とは

エクセルの機能の中であまり知られていないものに、この配列数式があります。
配列数式とは、文字通り「配列」を数式の中に当てはめて結果を求める数式です。
配列は定数で指定することもできますし、セル範囲を指定することもできます。

配列数式を用いることで、本来ならば複数の作業セルを用いて求めなければならない計算結果を、一つの数式で求めることができます。
また、複数の条件に合致したデータの件数や合計値などを一つの数式で求めることも可能です。

早速、配列数式を利用した計算を見ていきましょう。



まず、このような表で配列数式を利用してみます。
ある月の社用車の燃料費の計算を行っています。
社用車はA車、B車、C車の3車でA車とB車はガソリン車です。C車はディーゼル車なので軽油を使用します。
一回で入れるリッター数や月に給油する回数もそれぞれ違います。

作業セルを用いて計算する。

作業セルを用いれば、それぞれの燃料費の小計を算出し、合計することでその月の燃料費の合計が求められます。

=SUM(E2:E4)
同じことを作業セルを用いずに算出してみましょう。

SUMPRODUCT関数を用いて計算する。

=SUMPRODUCT(B2:B4,C2:C4,D2:D4)

SUMPRODUCT関数は配列の積の合計を計算します。この場合、単価が入力されている「B2:B4」とリッター数が入力されている「C2:C4」、回数が入力されている「D2:D4」がそれぞれ配列になります。

つまり=SUMPRODUCT(単価*リッター数*回数)を各行で行い、その合計値を返しています。
答えは当然、各行の小計の合計値と等しくなります。

配列数式を用いて計算する。

=SUM(B2:B4*C2:C4*D2:D4)

まず、セルF2あたりに上記の数式を入力し、Enterを押してみてください。7500の数値が返ってきたことと思います。
なぜこうなるかというと、SUM関数が共通部分参照を行う関数だからです。
つまりこの場合、2行目のB2*C2*D2の計算を行い、その結果を返したからです。
試しに、この式をF3、F4と移動すると、各行の小計を表示するはずです。そしてF5に移動したとき、5行目には計算する数値がないため、#VALUE!のエラー値を返すはずです。

では、F5にまで移動させた後、F5セルを編集可能状態にします。(F2キー押下または数式バーをクリック)そして、Ctrl+Shift+Enterを押下して数式を確定してください。

{=SUM(B2:B4*C2:C4*D2:D4)}

このような表示で数式が確定されるはずです。そして、F5セルに燃料費の合計値が表示されているはずです。

これが配列数式です。
※ 配列数式を確定するときは、通常の数式の確定と異なりCtrl+Shift+Enter押下で確定する必要があります。Enterだけでは配列数式として確定されませんので注意してください。

このとき、B2:B4、C2:C4、D2:D4、はそれぞれ配列として数式の中にもたれます。つまり、
=SUM({125;125;105}*{30;25;35}*{2;2;1})

こうなっているわけです。あとはそれぞれの一次元配列の要素を順番に計算していきます。
つまり125*30*2と125*25*2と105*35*1を計算し、SUM関数で合計しています。

※ {125;125;105}のようなデータの塊を配列定数と呼びます。上記の説明で便宜上、一次元配列と呼びましたが、配列定数は基本的に矩形の二次元配列になります。上記の場合は3行1列の二次元配列です。配列定数の書式は、
={1,2,3;4,5,6;7,8,9}のように記述します。この中で、","は列の区切り、";"は行の区切りになります。この例の場合では、3行3列の矩形範囲に1〜9のデータが格納された二次元配列になります。

1 2 3
4 5 6
7 8 9  <=3行3列の矩形範囲にこのようにデータが格納されているイメージです

 
複数の条件に合致するデータの件数や合計を算出してみよう

おそらく配列数式が最も重宝されるのが、この複数条件のデータを扱う場合です。



このような表で説明します。
この表で例えば性別が男性の会員人数を算出したければ、
=COUNTIF(B2:B6,"男")
の数式で算出することができます。
また東京に住む会員が納めた会費の合計なら、
=SUMIF(C2:C6,"東京",D2:D6)
で求めることができます。

しかし、東京に住む男性会員の人数や、納めた会費の合計値は1つの数式で求めることができません。
(※ SUMPRODUCT関数を使用した論理積、論理和の数式を除く)
配列数式を使用すれば、このような場合でも1つの数式で算出することが可能です。

{=SUM((B2:B6="男")*(C2:C6="東京"))}

この配列数式では、性別を入力したB2:B6の配列で"男"のデータならTRUEを、住所を入力したC2:C6の配列で"東京"のデータならTRUEを返し、その積を求めています。
論理値のTRUEは数値の1でFALSEは0です。ですからTRUE*TRUEは数値計算の1*1になり、その結果は1になります。
つまり、会員の中で男性で東京在住の人のデータは1を返しているわけです。SUM関数でその1の数を合計しているので、結果は男性で東京在住の会員の人数を計算しているわけです。

ちなみにSUMIFで行った、男性会員の数だけを求める場合には次のようにします。

{=SUM((B2:B6="男")*1)}

ここで、1を掛けているのは、TRUE・FALSEの論理値が数値として扱われるためにはあくまで演算を行う必要があるためです。
何もしなければTRUE=1とは扱わず、TRUE=TRUEのまま無視してSUM関数は合計を計算してしまい、結果として0の値が返ります。

次に、男性で東京在住の会員が納めた会費を合計してみましょう。

{=SUM(IF((B2:B6="男")*(C2:C6="東京"),D2:D6,0))}

先ほどの例で男性で東京在住の会員、(B2:B6="男")*(C2:C6="東京")はTRUEを返すことがわかっています。
IF関数で、TRUEのときD2:D6の配列を使用し、FALSEのとき0を使用するよう定義していますので、男性で東京在住の会員ならば、納めた会費の金額がそのまま返ってきます。最後にSUM関数で金額を合計しているので、男性で東京在住の会員が納めた会費の合計額が算出されるというわけです。

前述の複数条件はAND条件でした。OR条件の場合はどうすればよいのでしょう?

人数を求める場合、
{=SUM(((B2:B6="男")+(C2:C6="東京")<>0)*1)}

会費の合計を求める場合、
{=SUM(IF((B2:B6="男")+(C2:C6="東京"),D2:D6,0))}

OR条件の場合は、論理値の和を求めます。TRUE+TRUEなら2、TRUE+FALSEなら1、FALSE+FALSEなら0がそれぞれ返ります。
会費の合計を求める場合は、IF関数を使用しているため、条件式の結果が0以外(FALSE+FALSE以外)ならそれぞれの会費を返します。つまり、東京在住でもなく男性でもない場合以外は全て会費を返すわけです。これはIF関数の場合、条件式が0(FALSE)以外ならすべてTRUEと判断するからです。1でも2でもTRUEと判定します。

人数を求める場合は工夫が必要です。
男性かつ東京在住の場合、TRUE+TRUEで2を返してしまうので、人数が二人とカウントされてしまいます。
そこで、<>0(0以外)の条件をつけ再度、TRUE・FALSEの判定をしています。最後に1を掛けているのは、先ほど述べたとおり、そのままだとTRUEはTRUEとして扱われ、数値としては扱われないため一度演算をしてやる必要があるからです。

AND条件(論理値の積)
TRUE  TRUE  1
TRUE  FALSE 0
FALSE TRUE  0
FALSE FALSE 0

OR条件(論理値の和)
TRUE  TRUE  2
TRUE  FALSE 1
FALSE TRUE  1
FALSE FALSE 0

このようになります。

 
 
最後に、配列数式を用いて数値範囲のデータ個数を求めてみましょう

数値範囲のデータ個数を求める関数に、FREQUENCY関数があります。
まずはFREQUENCY関数を用いて、年齢別の会員数を調べてみましょう。



どこでもいいので、3行1列のセル範囲を選択します。
その状態で、最初のセルに、
=FREQUENCY(D2:D6,{29,39})
を入力します。

Ctrl+Shift+Enter押下で確定すると、
{=FREQUENCY(D2:D6,{29,39})}
の配列数式が、3行1列のセル範囲に入力され、それぞれの範囲のデータ個数を返すはずです。

このとき、29歳以下のデータ個数が1行目のセルに、30〜39歳のデータ個数が2行目のセルに、40歳以上のデータ個数が3行目のセルに表示されます。

※ なぜ、こうなるのかというと"29","39"で範囲指定された「データの個数」は、3つの要素をもつ配列として返されるからです。(上述の29以下、30〜39、40以上の3つの返り値)
返される要素が3つなので当然、表示するセルも3つ必要になります。そこで、3行1列のセル範囲に配列数式として結果を表示させたというわけです。

またFREQUENCY関数を使用しなくても、先ほどの複数条件指定の配列数式を用いることで、データ個数を求めることが可能です。

G1〜G3のセルに0,30,40の数値を、H1〜H3のセルに29,39,100の数値を入力します。
I1のセルに次の配列数式を入力します。

{=SUM(($D$2:$D$6>=G1)*($D$2:$D$6<=H1))}

I1セルをオートフィルでI3までドラッグし数式をコピーします。
年齢が入力されているセル範囲、$D$2:$D$6はオートフィルをしても参照するセル範囲が変わらないように絶対参照しています。
I2のセルに、
{=SUM(($D$2:$D$6>=G2)*($D$2:$D$6<=H2))}
I3のセルに、
{=SUM(($D$2:$D$6>=G3)*($D$2:$D$6<=H3))}
の配列数式がコピーされているはずです。

この配列数式は、年齢がG列の数値以上、H列の数値以下の場合、論理値の積として1を返し、SUM関数でその数を合計しています。
つまり、FREQUENCY関数同様に、ある数値からある数値の範囲までのデータ個数を計算しているわけです。

この場合さらに、数値以外の条件を追加してデータ個数を算出することも可能です。


以上、配列数式について解説してきました。

配列数式は必ずおぼえなければならないテクニックではありません。配列数式を使用しなくても、同様の計算結果を作業セルや関数を用いて算出することは可能です。

しかし配列数式が使えれば、作業セルを使用して求めた計算結果を検証したり、表を変更することなく複雑な計算結果を算出できるなど、エクセルの使用範囲や用途が大きく広がります。

おぼえておいても、決して損なテクニックではないでしょう。

>> 次の話にすすむ


サイト内検索ができます

Microsoft Most Valuable Professional

Microsoft MVP Excel
武藤 玄 プロフィール
 

■■■ 執筆した書籍 ■■■
 

EXCEL VBA 業務自動化
 

Excel VBA を5日でマスターする本
 

仕事を速くする Excel VBA 入門
 

Excel VBAと業務改善のポイントがわかる本
 

Access VBA ベーシック スタンダード
 

Excel VBA アクションゲーム作成入門
 

■■■ 連載中の記事 ■■■
 

Excel VBAで業務改善!
 

実務で使うExcel VBA
 


TOPページ


■ エクセルVBA超入門

 ・9ステップで"Hello World!"
  からオブジェクト指向まで!
  1."Hello World!"を表示しよう
  2.基本はデータの入出力
  3.繰り返し処理
  4.シートで簡易データベース
  5.名前をつけよう
  6.構造化プログラムに挑戦
  7.構造体を使ってみよう
  8.フォームを使ってみよう
  9.オブジェクト指向に挑戦

■ エクセルVBA中級編

 ・VBAでいろんなテクニック
  変数・関数のスコープ
  引数の参照方法を明示
  配列の中身を一気に複写
  識別子がよいコードを作る
  データ定義型をもっと知ろう
  定数と列挙型を活用しよう
  エラー処理の重要性1
  エラー処理の重要性2
  いろいろな条件分岐
  いろいろな繰り返し処理
  演算子について知ろう
  文字列操作 連結 変換 置換
  文字列操作 検索 比較 書式
  日付操作関数を知ろう
  数値操作・評価・その他関数
  並び替えソートをマスター
  いろいろな検索をマスター
  VBEditorを使いこなそう
  マクロの記録を活用しよう1
  マクロの記録を活用しよう2
  VBAからVBEを操作しよう1
  VBAからVBEを操作しよう2
  VBAからVBEを操作しよう3
 ・ワークシートを使いこなす
  セルの参照をマスターしよう
  セルの選択をマスターしよう
  セルの操作をマスターしよう
  セルの書式設定をマスターしよう
  行・列の操作をマスターしよう
  シートの参照をマスターしよう
  シートの操作をマスターしよう
  ブックの操作をマスターしよう
  ウィンドウの操作をマスターしよう
  イベントプロシージャを活用しよう
  ワークシートを印刷しよう1
  ワークシートを印刷しよう2
  音声(読み上げ)機能を操作しよう
  グラフを操作しよう
 ・ユーザーフォームを使いこなす
  ユーザーフォームを使おう
  UserFormsオブジェクト
  Labelコントロール
  TextBoxコントロール
  ComboBoxコントロール
  ListBoxコントロール
  CheckBoxコントロール
  OptionButtonコントロール
  ToggleButtonコントロール
  CommandButtonコントロール
  ScrollBarコントロール
  SpinButtonコントロール
 ・VBA関数の一覧
  Aから始まる関数の一覧
  Cから始まる関数の一覧
  Dから始まる関数の一覧
  Eから始まる関数の一覧
  Fから始まる関数の一覧
  Gから始まる関数の一覧
 
■ エクセルVBAを極める
 VBAスーパーテクニック
 
 ・データベースへ接続してみよう!
  CSVファイルへの接続
  ワークシートへの接続
  mdbファイルへの接続
  SQL Serverへの接続
  ADOレコードセットの操作1
  ADOレコードセットの操作2
 ・ファイルを操作してみよう!
  FileSystemObjectの操作
  Drive File Folderの操作
  TextStream ダイアログ
  ステートメントでファイル操作1
  ステートメントでファイル操作2
 ・他アプリと連携してみよう!
  ActiveXオートメーションの操作
 ・ゲーム技でマクロを超える
  エクセルで音を鳴らす1
  エクセルで音を鳴らす2  
  スクリーン座標を取得
  様々なイベント取得
  リボンUIを制御しよう1
  リボンUIを制御しよう2
  シート上でアニメを動かそう
 
■ 一歩上行くエクセル
 基本操作の完全マスター!

 
 ・あなたはいったい
  エクセルで何をしたいのか?
  エクセルで業務効率化
  エクセル関数を使いこなす
  エクセルの便利技
  エクセルは最高の帳票ツール
 ・エクセル基本操作上級編!
  セル選択、コメント、シリアル値
  オート機能を使いこなそう!
  参照、条件付書式、入力規則
  関数をもっと理解しよう!
  配列数式を有効利用しよう!
  データの正規化をしよう!
  ショートカットキーを利用しよう1
  ショートカットキーを利用しよう2
  Office用アプリを作成しよう!
  PowerPivotとExcelで簡単BI!
 ・世間の誤ったエクセルの
  べからず集
  エクセルで文章を書くべからず
  エクセルで図形を描くべからず
  エクセルでシステムをつくるな
 
■ エクセル関連その他

 ・エクセルコミニュティにあなたも
  参加しませんか?
  Excel関連リンク・コミニュティ
 ・VBの理解がVBAをマスターする
  最短距離!
  VB関連の老舗・大家サイト
 ・エクセルExcel大事典掲示板
 ・プライバシーポリシー

2000アイテムを超えるラベルを販売
送料無料、即納対応の優良ショップ
今買っているラベルより確実に安い!
OAラベルの販売専科グラフトラベル




エクセルExcel大事典ははリンクフリーです エクセル大事典Excel大事典
お問い合わせはこちら gengengen@yahoo.co.jp

Copyright© Gen Muto 武藤 玄 All Rights Reserved,