配列数式は、配列内の 1 つ以上の項目に対して複数の計算を実行できる数式です。 配列は、値の行または列、または値の行と列の組み合わせと考えることができます。 配列数式は、複数の結果または 1 つの結果を返すことができます。
Microsoft 365 用の 2018 年 9 月の更新プログラム以降、複数の結果を返すことができる数式は、自動的にダウンするか、隣接するセルにこぼします。 この動作の変更には、いくつかの新しい 動的配列関数も伴います。 動的配列数式は、既存の関数または動的配列関数を使用しているかどうかに関係なく、単一のセルに入力するだけで済み、 Enter キーを押して確認できます。 以前の従来の配列数式では、最初に出力範囲全体を選択してから、 Ctrl + Shift + Enter キーを押して数式を確認する必要があります。 これらは一般に CSE 数式と呼ばれます。
配列数式を使用して、次のような複雑なタスクを実行できます。
- サンプル データセットをすばやく作成します。
- セル範囲に含まれる文字数をカウントします。
- 特定の条件を満たす数値 (範囲の最小値、上限と下限の境界の間にある数値など) のみを合計します。
- 値の範囲内のすべての N 番目の値を合計します。
次の例では、複数セルおよび単一セル配列の数式を作成する方法を示します。 可能な場合は、動的配列関数の一部と、動的配列とレガシ配列の両方として入力された既存の配列数式の例が含まれています。
サンプルをダウンロードする
この記事のすべての配列数式の例を含むサンプル ブックをダウンロードします。
複数セル配列と単一セル配列
この演習では、複数セルの配列数式および単一セルの配列数式を使用して、売上金額を計算します。 まず、複数セルの数式を使用して、小計を求めます。 次に、単一セルの数式を使用して、総計を求めます。
複数セルの配列数式
ここでは、セル H10 に 「=F10:F19*G10:G19 」と入力して、各営業担当者のクーペとセダンの合計売上を計算します。
Enter キーを押すと、結果がセル H10:H19 にスピル ダウンします。 スピル範囲内のセルを選択すると、スピル範囲が境界線で強調表示されていることに注意してください。 セル H10:H19 の数式が淡色表示されていることにも気付く場合があります。これらは参照のために存在するため、数式を調整する場合は、マスター数式が存在するセル H10 を選択する必要があります。単一セル配列の数式
ブック例のセル H20 で、 =SUM(F10:F19*G10:G19)と入力またはコピーして貼り付け、 Enter キーを押します。
この場合、Excel は配列内の値 (セル範囲 F10 から G19) を乗算し、SUM 関数を使用して合計を一緒に追加します。 この結果、売上の総計である 1,590,000 円が求められます。
この例から、配列数式がいかに便利であるかがわかります。 たとえば、1,000 行のデータがあるとします。 単一のセルに配列数式を作成すると、数式を 1,000 行分下にドラッグしなくても、そのデータの一部またはすべてを集計できます。 また、セル H20 の単一セル式は、マルチセル式 (セル H10 から H19 の数式) とは完全に独立していることに注意してください。 これは、配列数式を使用することのもう 1 つの利点である柔軟性です。 H20 の数式に影響を与えずに、列 H の他の数式を変更できます。 また、結果の精度を検証するのに役立ちますので、このような個別の合計を設定することをお勧めします。動的配列数式には、次の利点もあります。
- 一貫性 H10 のセルを下方向にクリックすると、同じ数式が表示されます。 この一貫性が、正確さの向上に役立ちます。
- 安全 複数セル配列数式のコンポーネントを上書きすることはできません。 たとえば、セル H11 をクリックし、Delete キーを押します。 Excel では配列の出力は変更されません。 これを変更するには、配列の左上のセル、またはセル H10 を選択する必要があります。
- ファイル サイズを小さくする 多くの場合、複数の中間数式の代わりに 1 つの配列式を使用できます。 たとえば、自動車販売の例では、1 つの配列式を使用して列 E の結果を計算します。=F10*G10、F11*G11、F12*G12 などの標準数式を使用していた場合は、11 の異なる数式を使用して同じ結果を計算していました。 これは大したことではありませんが、合計で数千行あった場合はどうでしょうか。 その後、大きな違いを生み出すことができます。
- 効率 配列関数は、複雑な数式を作成する効率的な方法です。 配列数式 =SUM(F10:F19*G10:G19) は、=SUM(F10*G10,F11*G11,F12*G12,F 13*G13,F14*G14,F15*G15,F16*G16,F17*G17,F18*G18,F19*G19)。
- こぼれる 動的配列の数式は自動的に出力範囲にスピルされます。 ソース データが Excel テーブル内にある場合、データを追加または削除すると、動的配列数式のサイズが自動的に変更されます。
- Excel での #スピル! を修正する 動的配列では、何らかの理由で意図したスピル範囲がブロックされていることを示す #SPILL! エラーが発生しました。 ブロックを解決すると、数式が自動的にスピルします。
1 次元および 2 次元配列定数を作成する
配列定数は、配列数式の構成要素です。 配列定数を入力するには、項目のリストを入力し、次のように、手動でリストを中かっこ ({ }) で囲みます。
={1,2,3,4,5} または ={"January","February","March"}
カンマを使用して項目を区切った場合は、水平配列 (行) が作成されます。 セミコロンを使用して項目を区切った場合は、垂直配列 (列) が作成されます。 2 次元配列を作成するには、各行の項目をコンマで区切り、各行をセミコロンで区切ります。
水平定数、垂直定数、および 2 次元定数を作成する手順を次に示します。 SEQUENCE 関数を使用して配列定数を自動的に生成する例と、手動で入力した配列定数を示します。
-
水平定数を作成する
前の例のブックを使用するか、または新しいブックを作成します。 空のセルを選択し、「 =SEQUENCE(1,5)」と入力します。 SEQUENCE 関数は、 ={1,2,3,4,5} と同じ 1 行 5 列配列を作成します。 次の結果が表示されます。
-
垂直定数を作成する
その下に空白のセルを選択し、=SEQUENCE(5)、または ={1 と入力します。2;3;4;5} 次の結果が表示されます。
-
2 次元定数を作成する
右側とその下にある空白のセルを選択し、「 =SEQUENCE(3,4)」と入力します。 次の結果が表示されます。
または ={1,2,3,4 と入力することもできます。5,6,7,8;9,10,11,12} ですが、セミコロンとコンマを置く場所に注意する必要があります。
ご覧のように、SEQUENCE オプションは、配列定数値を手動で入力するよりも大きな利点があります。 主に、時間を節約できますが、手動入力によるエラーを減らすのにも役立ちます。 また、特にセミコロンはコンマ区切り記号と区別するのが難しい場合があるため、読みやすくなります。
配列定数の構文
大きな数式の一部として配列定数を使用する例を次に示します。 サンプル ブックで、 数式ワークシートの定数 に移動するか、新しいワークシートを作成します。
セル D9 では、 =SEQUENCE(1,5,3,1)と入力しましたが、セル A9:H9 には 3、4、5、6、7 と入力することもできます。 その特定の数値の選択については特別な何もありません。差別化のために 1 から 5 以外のものを選択しました。
セル E11 に 「=SUM(D9:H9*SEQUENCE(1,5))」または 「=SUM(D9:H9*{1,2,3,4,5})」と入力します。 数式は 85 を返します。
SEQUENCE 関数は、配列定数 {1,2,3,4,5}と同等の値を構築します。 Excel は最初にかっこで囲まれた式に対して演算を実行するため、次に実行される 2 つの要素は、D9:H9 のセル値と乗算演算子 (*) です。 この時点で、格納された値に対応する定数の値を掛ける数式が実行されます。 これは、次の式に相当します。
=SUM(D9*1,E9*2,F9*3,G9*4,H9*5)、または =SUM(3*1,4*2,5*3,6*4,7*5)
最後に、SUM 関数は値を追加し、85 を返します。
ストアド配列の使用を回避し、操作を完全にメモリ内に保持するには、別の配列定数に置き換えます。
=SUM(SEQUENCE(1,5,3,1)*SEQUENCE(1,5)),または =SUM({3,4,5,6,7}*{1,2,3,4,5})
配列定数で使用できる要素
- 配列定数には、数値、テキスト、論理値 (TRUE や FALSE など)、エラー値 (#N/A など) を含めることができます。 数値は、整数、10 進数、および科学形式で使用できます。 テキストを含める場合は、引用符 ("text") で囲む必要があります。
- 配列定数には、別の配列、数式、または関数を含めることができません。 つまり、カンマまたはセミコロンで区切られた文字列または数値のみを含めることができます。 {1,2,A1:D4}、{1,2,SUM(Q2:Z8)} などの数式を入力すると、警告メッセージが表示されます。 また、数値には、パーセント記号、ドル記号、カンマ、かっこを含めることができません。
配列定数に名前を付ける
配列定数を使用する最適な方法の 1 つは、名前を付ける方法です。 名前付き定数は使いやすく、使用すると他の人の目には配列数式の複雑さの一部が見えなくなります。 配列定数に名前を付け、数式で使用するには、次の操作を行います。
[数式>既定の名前>Define Name] に移動します。 [ 名前 ] ボックスに「Quarter1」と入力します。 [参照範囲] ボックスに次の定数を入力します (中かっこを手動で入力してください)。
={"1 月","2 月","3 月"}
ダイアログ ボックスは次のようになります。
[ OK] をクリックし、3 つの空白セルがある任意の行を選択し、「 =Quarter1」と入力します。
次の結果が表示されます。
結果を水平方向ではなく垂直方向にスピルする場合は、 =TRANSPOSE(Quarter1)を使用できます。
財務諸表の作成時に使用する場合と同様に、12 か月の一覧を表示する場合は、SEQUENCE 関数を使用して現在の年から 1 つを基準にすることができます。 この関数に関するきちんとした点は、月のみが表示されているにもかかわらず、その背後に他の計算で使用できる有効な日付があるということです。 これらの例は、サンプル ブックの 名前付き配列定数 ワークシートと クイック サンプル データセット ワークシートにあります。
=TEXT(DATE(YEAR(TODAY()),SEQUENCE(1,12),1),"mmm")
これにより 、DATE 関数 を使用して現在の年に基づいて日付を作成し、SEQUENCE は 1 月から 12 月の 12 までの配列定数を作成し、 TEXT 関数 は表示形式を "mmm" (1 月、2 月、3 月など) に変換します。 1 月などの完全な月の名前を表示する場合は、"mmmm" を使用します。
配列数式として名前付き定数を使用する場合は、必ず等号を入力してください。=Quarter1 のように、Quarter1 だけではありません。 等号を入力しなかった場合、配列は文字列として扱われ、数式は期待どおりに動作しません。 最後に、関数、テキスト、数値の組み合わせを使用できることに注意してください。 それはすべて、あなたが取得したいどのように創造的に依存します。
配列定数の使用例
配列数式で配列定数を使用する方法を示す例をいくつか紹介します。 一部の例では 、TRANSPOSE 関数 を使用して行を列に変換し、その逆の変換を行います。
-
配列内の複数の各項目
「=SEQUENCE(1,12)*2」または「={1,2,3,4」と入力します。5,6,7,8;9,10,11,12}*2
(/) で除算し、 を (+) で加算し、 を (-) で減算することもできます。 -
配列の各項目を 2 乗する
「=SEQUENCE(1,12)^2」または「={1,2,3,4」と入力します。5,6,7,8;9,10,11,12}^2 -
配列内の二乗項目の平方根を見つける
「=SQRT(SEQUENCE(1,12)^2)」または「=SQRT({1,2,3,4」と入力します。5,6,7,8;9,10,11,12}^2) -
1 次元の行を転置する
「=TRANSPOSE(SEQUENCE(1,5))」または「=TRANSPOSE({1,2,3,4,5})」と入力します。
入力したのは水平配列定数ですが、TRANSPOSE 関数によって、配列定数が列に変換されます。 -
1 次元の列を転置する
「=TRANSPOSE(SEQUENCE(5,1))」または「=TRANSPOSE({1;2;3;4;5})
入力したのは垂直配列定数ですが、TRANSPOSE 関数によって、配列定数が行に変換されます。 -
2 次元定数を転置する
=TRANSPOSE(SEQUENCE(3,4))、または =TRANSPOSE({1,2,3,4) と入力します。5,6,7,8;9,10,11,12})
TRANSPOSE 関数によって、行が列に変換されます。
基本的な配列数式の使用例
このセクションでは、基本的な配列数式の例を示します。
既存の値から配列を作成する
次の例では、配列の数式を使用して、既存の配列から新しい配列を作成する方法について説明します。
=SEQUENCE(3,6,10,10)、または ={10,20,30,40,50,60 と入力します。70,80,90,100,110,120;130,140,150,160,170,180}
数値の配列を作成するため、10 を入力する前に{(始め中かっこ) を入力し、180 を入力した後に } (右中かっこ) を入力してください。
次に、空白セルに 「=D9#」または 「=D9:I11 」と入力します。 セルの 3 x 6 配列が、D9:D11 と同じ値で表示されます。 # 記号は スピルされた範囲演算子と呼ばれ、入力する代わりに配列範囲全体を参照する Excel の方法です。
既存の値から配列定数を作成する
スピルされた配列数式の結果を取得し、その結果をそのコンポーネントパーツに変換できます。 セル D9 を選択し、 F2 キーを押して編集モードに切り替えます。 次に、 F9 キーを押してセル参照を値に変換し、Excel で配列定数に変換します。 Enter キーを押すと、数式 =D9#が ={10,20,30 になります。40,50,60;70,80,90}.セル範囲の文字数を数える
次の例では、セル範囲の文字数をカウントする方法を示します。 これにはスペースが含まれます。
=SUM(LEN(C9:C13))
この場合、 LEN 関数 は、範囲内の各セル内の各テキスト文字列の長さを返します。 次に、SUM 関数によってこれらの値が一緒に追加され、結果が表示されます (66)。 平均文字数を取得する場合は、次を使用できます。
=AVERAGE(LEN(C9:C13))範囲 C9:C13 の最長セルの内容
=INDEX(C9:C13,MATCH(MAX(LEN(C9:C13)),LEN(C9:C13),0,1)
この数式が機能するのは、データ範囲のすべてのセルが単一の列に含まれる場合だけです。
この式を、内側の要素から順番に詳しく確認してみましょう。 LEN 関数は、セル範囲 D2:D6 内の各項目の長さを返します。 MAX 関数は、これらの項目の中で最大の値を計算します。これは、セル D3 にある最長のテキスト文字列に対応します。
ここからは、少し複雑になります。 MATCH 関数は、最も長いテキスト文字列を含むセルのオフセット (相対位置) を計算します。 この計算を行うには、検査値、検査範囲、および照合の種類という 3 つの引数が必要です。 MATCH 関数は、指定された検査値を検査範囲で検索します。 この例の場合、検査値は、最も長い文字列です。
MAX(LEN(C9:C13)
この文字列は、次の配列に含まれます。
LEN(C9:C13)
この場合の match 型引数は 0 です。 一致する型には、1、0、または -1 の値を指定できます。- 1 - ルックアップ val 以下の最大値を返します
- 0 - ルックアップ値と完全に等しい最初の値を返します
- -1 - 指定した参照値以上の最小値を返します
- 照合の種類を指定しなかった場合は、1 が指定されたと見なされます。
最後に、 INDEX 関数 は、配列と、その配列内の行と列の番号という引数を受け取ります。 セル範囲 C9:C13 は配列を提供し、MATCH 関数はセル アドレスを提供し、最後の引数 (1) は値が配列の最初の列から取得されることを指定します。
最小のテキスト文字列の内容を取得する場合は、上記の例の MAX を MIN に置き換えます。範囲内で値の小さい方から n 番目までを検索する
この例では、セル範囲で 3 つの最小値を検索する方法を示します。セル B9:B18has のサンプル データの配列は、 =INT(RANDARRAY(10,1)*100) で作成されています。 RANDARRAY は揮発性関数であるため、Excel が計算するたびに新しい乱数セットを取得します。
「=SMALL(B9#,SEQUENCE(D9),=SMALL(B9:B18,{1;2;3})
この数式では、配列定数を使用して SMALL 関数 を 3 回評価し、セル B9:B18 に含まれる配列内の最小の 3 つのメンバーを返します。3 はセル D9 の変数値です。 より多くの値を見つけるには、SEQUENCE 関数の値を増やすか、定数にさらに引数を追加します。 SUM、AVERAGE などの追加の関数をこの数式と組み合わせて使用することもできます。 次に例を示します。
=SUM(SMALL(B9#,SEQUENCE(D9))
=AVERAGE(SMALL(B9#,SEQUENCE(D9))範囲内で値の大きい方から n 番目までを検索する
範囲内の最大値を見つけるには、SMALL 関数を LARGE 関数に置き換えます。 次の例では、ROW 関数と INDIRECT 関数も使用しています。
「=LARGE(B9#,ROW(INDIRECT("1:3"))、または =LARGE(B9:B18,ROW(INDIRECT("1:3"))) と入力します。
ここで、ROW 関数と INDIRECT 関数について簡単に説明しておきます。 ROW 関数を使用すると、連続する整数の配列を作成できます。 たとえば、空の を選択し、次のように入力します。
=ROW(1:10)
これで、10 個の連続する整数の列が作成されます。 潜在的な問題を確認するために、配列数式が格納されている範囲の上 (つまり、行 1) に行を挿入します。 Excel によって行参照が調整され、数式によって 2 から 11 の整数が生成されるようになりました。 この問題を修正するには、次のように、INDIRECT 関数を数式に追加します。
=ROW(INDIRECT("1:10"))
INDIRECT 関数は、引数としてテキスト文字列を使用します (範囲 1:10 が引用符で囲まれる理由です)。 行の挿入、または配列数式の移動を行っても、Excel によって文字列値が調整されることはありません。 この結果、ROW 関数は、常に目的の整数の配列を生成するようになります。 SEQUENCE を使用するのと同じくらい簡単です。
=SEQUENCE(10)
前に使用した数式 (=LARGE(B9#,ROW(INDIRECT("1:3"))) を調べてみましょう。内部かっこから始まり、外側に向かって動作します。INDIRECT 関数はテキスト値のセットを返します。この場合、値は 1 から 3 です。 ROW 関数は、次に 3 セルの列配列を生成します。 LARGE 関数は、セル範囲 B9:B18 の値を使用し、ROW 関数によって返される参照ごとに 1 回、3 回評価されます。 さらに多くの値を検索する場合は、INDIRECT 関数にセル範囲を広く追加します。 最後に、SMALL の例と同様に、SUM や AVERAGE などの他の関数でこの数式を使用できます。
エラーの処理
-
エラー値を含む範囲の合計を求める
Excel の SUM 関数は、エラー値を含む範囲 (#VALUE など) を合計しようとすると機能しません。 または #N/A。 この例では、エラーを含む Data という名前の範囲内の値を合計する方法を示します。
-
=SUM(IF(ISERROR(Data),"",Data))
この数式では、元の値からエラー値を引いた値を格納した新しい配列が作成されます。 内側の関数から順に説明すると、ISERROR 関数は、セル範囲 ("データ") でエラーがないか検索します。 IF 関数は、指定された条件を評価した結果が TRUE の場合は特定の値を返し、評価した結果が FALSE の場合は別の値を返します。 この例の場合、すべてのエラー値については TRUE に評価されるため、空の文字列 ("") が返され、範囲 (データ) の残りの値については FALSE に評価される (つまり、エラー値を格納していない) ため、値自体が返されます。 次に、SUM 関数が、フィルター処理された配列の合計を計算します。 -
範囲内のエラー値の個数を数える
この例は前の数式に似ていますが、フィルター処理するのではなく、Data という範囲のエラー値の数を返します。
=SUM(IF(ISERROR(Data),1,0))
この数式では、エラーを含むセルの場合は値 1 を、エラーを含まないセルの場合は値 0 を格納している配列を作成します。 次のように、IF 関数の 3 つ目の引数を省いて数式を簡略化しても、同じ結果が得られます。
=SUM(IF(ISERROR(Data),1))
この引数を指定しなかった場合、セルにエラー値が含まれていないと、IF 関数は FALSE を返します。 この数式をさらに簡略化して、次のようにすることもできます。
=SUM(IF(ISERROR(Data)*1))
この形式が機能するのは、TRUE*1=1 で、FALSE*1=0 であるためです。
条件に基づいて値を合計する
条件に基づいて値を集計することが必要になる場合があります。
たとえば、この配列数式は Sales という範囲の正の整数のみを合計します。これは、上の例のセル E9:E24 を表します。
=SUM(IF(Sales>0,Sales))
IF 関数は、正の値と false 値の配列を作成します。 0+0=0 であるため、SUM 関数は基本的に false 値を無視します。 この数式で使用するセル範囲には、指定の数の行と列を含めることができます。
複数の条件を満たす値を合計することもできます。 たとえば、この配列式では、0 より大きい値 と 2500 未満の値が計算されます。
=SUM((Sales>0)*(Sales<2500)*(Sales))
範囲に数値以外のセルが含まれている場合、この数式はエラーを返します。
OR 条件を使用する配列数式を作成することもできます。 たとえば、0 より大きい値 または 2500 未満の値を合計できます。
=SUM(IF((Sales>0)+(Sales<2500),Sales))
AND 関数と OR 関数は単一の結果 (TRUE または FALSE) を返しますが、配列数式では結果の配列が必要であるため、配列関数で AND 関数と OR 関数を直接使用することはできません。 この問題に対処するには、前の数式で示したロジックを使用します。 つまり、OR または AND 条件を満たす値に対して加算や乗算などの算術演算を実行します。
範囲内の値から 0 を除いて平均を求める方法の例を次に示します。 この数式では、"売上" という名前のデータ範囲を使用しています。
=AVERAGE(IF(Sales<>0,Sales))
IF 関数が、0 と等しくない値の配列を作成し、これらの値を AVERAGE 関数に渡します。
2 つのセル範囲間で相違する値の個数を数える
この配列数式では、MyData および YourData という名前の 2 つのセル範囲の値を比較し、この 2 つの範囲間で相違する値の数を返します。 2 つの範囲の内容が一致する場合は、0 が返されます。 この数式を使用するには、セル範囲が同じサイズで同じディメンションである必要があります。 たとえば、MyData が 3 行から 5 列の範囲の場合、YourData は 3 行 5 列にする必要もあります。
=SUM(IF(MyData=YourData,0,1))
この数式は、比較対象範囲と同じサイズの新しい配列を作成します。 IF 関数が、配列に値 0 と値 1 を設定します (不一致の場合は 0 で、同一セルの場合は 1)。 次に、SUM 関数が、配列内の値の合計を返します。
この数式は、次のように簡略化できます。
=SUM(1*(MyData<>YourData))
範囲内のエラー値の個数を数える数式と同様、この数式が機能するのは、TRUE*1=1 で、FALSE*1=0 であるためです。
この配列数式は、"データ" という名前の単一列の範囲に含まれる最大値の行番号を返します。
=MIN(IF(Data=MAX(Data),ROW(Data),""))
IF 関数が、"データ" という範囲に対応する新しい配列を作成します。 対応するセルに範囲内の最大値が含まれている場合、配列に行番号が格納されます。 それ以外の場合は、配列に空の文字列 ("") が格納されます。 MIN 関数は、この新しい配列を 2 番目の引数として使用して、最小値 ("データ" の最大値の行番号に対応) を返します。 "データ" という範囲に同じ最大値が複数含まれている場合は、最初の値の行が返されます。
最大値の実際のセル住所を返すには、次の数式を使用します。
=ADDRESS(MIN(IF(Data=MAX(Data),ROW(Data),")),COLUMN(Data))
サンプル ブックの [ データセット間の相違点 ] ワークシートには、同様の例があります。
確認
この記事の一部は、Colin Wilcox によって書かれた一連の Excel Power User 列に基づいており、Excel 2002 数式の第 14 章と 15 章から適応されています。これは、元 Excel MVP の John Walkenbach が執筆した書籍です。
補足説明
Excel Tech Community の専門家にいつでも依頼したり、コミュニティでサポートを受けたりすることができます。