Excel講座

スピル配列

本章で用いる実習用ファイル

Excelなどデータを処理する環境(処理系)は一つの変数(セルなど)で単一のデータだけで無く、複数のデータを同時に扱うデータ構造(配列)を持っている。Excelにおいては配列とはこれまで使ってきた複数セルを含む「範囲」だけではなく、複数のデータを1つのセルで扱うこともできる、そのようなデータ構造のことである。これまでの数式の結果や関数の戻り値は一つの値しか扱えなかった。だから例えば九九表の処理を行うには81個の数式が必要となる。これは効率が悪い。配列を使うと数式の結果や関数の戻り値でも複数のデータを扱える。

ただExcelの従来の配列は使い勝手はあまり良くなく、それほど普及はしなかった。「このままではExcelは駄目だ!」とMicrosoftが思ったかどうなのかはわからないが、これまでのExcelの配列の使い勝手の悪さを劇的に解消する新機能が登場した。新機能なので、使えるExcelのバージョンは限られている(Excel 2021以降)。Microsoft Office365でExcelを使っていれば、この新機能が使える(はず)。しかし旧来のバンドル版Officeを使っている人の中には使えない人もいる。ちなみに組織のPCはバージョンアップがそれほど頻繁にはできない(組織でシステムを運用するというのはそういうこと)関係上、新機能は使えない可能性が高い。

というわけで全員が確実に使える機能というわけではないが、しかしこの新機能、「筋」が非常に良い。確実に今後のスタンダードになる。やや先走り感はあるが、使える環境にある人(Microsoft Office365ユーザ)はしっかりものにしておこう。

スピル配列への道

相対参照とオートフィル

下記表で「金額」を求めるためには「個々の単価*個々の個数」からなる5つの数式が必要となる。オートフィルをつかえばセルC2に1つ数式を入力すればあとは自動的に入力させられるとは言っても、入力される数式は5つなのである。

ABCD
1単価個数金額
21503=A2*B2
312012
42104
532025
61906
7

セル[C2]に入力されている数式を変更しても、残りの数式は元のままである。(オートフィルを用いて)改めて入力し直さなければならない。

静的配列(Static Array)

配列では全く考え方が変わる。「単価一式*個数一式」で5つの「金額」を一気に計算する。

ABCD
1単価個数金額
21503=A2:A6*B2:B6
312012
42104
532025
61906
7
  1. セルC2:C6をアクティブセルにする
  2. 単価セルの範囲A2:A6×個数セルの範囲B2:B6の計算式を立てる
  3. Ctrl + Shift + Enterキーを押す

一つの数式で全ての計算ができた。

配列の中身
12345
A2*B2
450
A3*B3
1440
A4*B4
840
A5*B5
8000
A6*B6
1140

この5つの値がC2:C6に順に展開される。

これで入力されるのがExcelの(元からある)配列数式(Legacy Array Formulas)である。

基本的な考え方はエレガントなのだが、実用上はあまり美しくない。まず入力からしていけない。「Ctrl + Shift + Enterキーを押す」ってなに?さらにこれで入力される配列数式は意固地で柔軟性がとんと無い。Excelの従来からの配列は静的配列(Static Array)または固定長配列(Fixed-length Array)と呼ばれ、配列の長さ(配列の中に入っているデータの個数)を変えることができない。

例えばこの表から5行目にデータを増やしたくなったとする。「行の挿入」機能を用いて5行目に挿入してみよう。

配列の一部を変更することはできません。

というアラートが出る。「行の削除」機能を用いても同じ(長さを変えられない配列=固定長配列なのだから、当然なのだが)。このアラート、何かに付けて出てくる。アラートはいちいち「OK」しなければならない。ストレスMAXである。

筋は良いのだが柔軟性が欠けるのが問題。この配列の使い勝手の悪さを根本的にたたき直したのがスピル配列(Spilled Array)なのである。スピル配列は動的配列(Dynamic Array)・あるいは可変長配列(Variable-length Array)をExcelで実装した形態である。

従来の配列はデータの長さを変える(データを増減させる)ことができなかった。スピル配列はそれができる。おまけに入力も簡単、変なキーアサインを覚える必要が無い。スゴイ!素敵!カッコイイ!

スピル配列(Spilled Array)(Excel2019×)

ここからの操作は使用しているExcelのバージョンによってできたりできなかったりする(できているように見えても、実は違う動きをしていたりする)。Office 365ユーザなら問題なく使えるはずだが、一応チェックしておこう。

ABCD
1単価個数金額
21503=A2:A6*B2:B6
312012
42104
532025
61906
7
  1. セルC2をアクティブセルにする
  2. 単価セルの範囲A2:A6×個数セルの範囲B2:B6の計算式を立てる
  3. Enterキーを押す

Excel2021以降ならC2:C6に正しい計算結果が出力される。

C2に入力した数式は5個の数字を答えに持つ(数値配列)。

配列の中身
12345
A2*B2
450
A3*B3
1440
A4*B4
840
A5*B5
8000
A6*B6
1140

当然この5つの数値は一つのセル(C2)には入りきらない。そのこぼれた(Spilled)数値をそこから連なるセルに出力するのがスピル配列(Spilled Array)である。

この操作でC2にしか計算結果が出力されないとあなたのExcelはスピル配列には対応していない。Excel Onlineが対応しているのでそちらを用いる。

以後、スピル配列が使えることを前提で、話を進める。

データの増減

データの長さを増減してみる。例えば5行目で「行の挿入」を行ってみよう。

ABCD
1単価個数金額
21503450
3120121440
42104840
50
6320258000
719061140
8

セルA5,セルB5に適当な数値を入力すると、C5にはA5*B5の結果が出力される(従来の相対参照数式だとC5に新たに数式を入力しなくてはならない、オートフィルを用いるにせよ)。

ABCD
1単価個数金額
21503450
3120121440
42104840
5100505000
6320258000
719061140
8

絶対参照的な

従来の「絶対参照」にも対応する。

ABCDEFG
1日付曜日時間支給額時給
210月11日4.51000
310月12日6
410月13日3
510月14日5.5
610月15日3.5
710月16日6
810月17日1
9

日々の「支給額」は「時間」×「時給」である。

ABCDEFG
1日付曜日時間支給額時給
210月11日4.5=C2:C8*F21000
310月12日6
410月13日3
510月14日5.5
610月15日3.5
710月16日6
810月17日1
9

数式をコピーしてセル位置を変えるわけではないので、時給F2への参照も不変である。つまり絶対参照にする必要が無い(しても構わない)。

あるいは式を全部絶対参照で立てることも可能である。むしろその方が正しいとも言える。時間はC2:C8に入力されているのであり、時給はF2に入力されていて、どこのセルから参照しようとそれは不変だからである。

ABCDEFG
1日付曜日時間支給額時給
210月11日4.5=$C$2:$C$8*$F$21000
310月12日6
410月13日3
510月14日5.5
610月15日3.5
710月16日6
810月17日1
9

このように式を全部絶対参照で立てることができる、というのは大きな意味がある。なぜか?その説明は次に持ち越す(謎を残して…)。

配列の集計

個数分の合計金額を求めたいとする。

ABCD
1商品価格個数
2Camellia S9¥65,0003
3Magnolia A5¥24,0002
4juice P9¥18,0002
5Ange E9¥15,0004
6
7合計
8
ABCD
1商品価格個数
2Camellia S9¥65,0003
3Magnolia A5¥24,0002
4juice P9¥18,0002
5Ange E9¥15,0004
6
7合計
8

B2:B5 * C2:C5で4つの数値

1234
B2*C2
195000
B3*C3
48000
B4*C4
36000
B5*C5
60000

配列として得られる。これまではその4つの数値を4つのセルに出力していたが、今回はこれをそのままSUM関数の引数にする。

ABCD
1商品価格個数
2Camellia S9¥65,0003
3Magnolia A5¥24,0002
4juice P9¥18,0002
5Ange E9¥15,0004
6
7合計
=SUM(B2:B5*C2:C5)
8

スピル機能が有効なときは単にEnterで確定すれば正しい結果が得られる(有効でない場合、従来の「配列」を用いるため、Ctrl + Shift + Enterで確定する)。

配列として保持された4つの数値{195000,48000,36000,60000}をSUMで合計した結果がセルB7に出力される。

SUM(配列1 2 3 4)
1234
195000480003600060000
  • SUMやAVERAGEなど引数を集計する関数は配列(複数の値を保持)を一つの値にまとめる。
  • 四則演算と同様、配列に含まれる値を一つ一つ処理し、複数の値を返す関数もある(ex. IF関数)。

課題

下表の

  

のセルに数式を立てて、スピル配列を用いて

  

を埋め、表を完成させよ(オートフィルは用いない)。


※スピル配列が使えないバージョンの場合、

  

が埋まらない。

課題:九九表(xlsx形式)

セル[B2]のみに数式を立てて、九九表を完成させよ。

ABCDEFGHIJK
1123456789
2123456789
32 2 4 6 8 10 12 14 16 18
43 3 6 9 12 15 18 21 24 27
54 4 8 12 16 20 24 28 32 36
65 5 10 15 20 25 30 35 40 45
76 6 12 18 24 30 36 42 48 54
87 7 14 21 28 35 42 49 56 63
98 8 16 24 32 40 48 56 64 72
109 9 18 27 36 45 54 63 72 81
11

課題:家計費(xlsx形式)

1世帯あたり1年間の支出(全世帯)を示した表である。

各年ごとの品目別の構成比と2000年時に比して2019年の消費金額の増減率を求めよ。

※数式は3つしか入力してはならない(オートフィルも×)。

ABCDEFF
1品目2000年(円)2000年構成比(%)2019年(円)2019年構成比(%)増減比
2食料費973,680965,536
3住居費246,3346.47%205,2355.83%-16.68%
4光熱・水道費259,5466.82%263,4087.48%1.49%
5家具・家事用品費139,1483.65%140,5983.99%1.04%
6被服および履き物費206,7425.43%135,6773.85%-34.37%
7保健医療費137,7323.62%168,1244.78%22.07%
8交通・通信費438,74811.52%525,76814.93%19.83%
9教育費167,0894.39%137,9373.92%-17.45%
10教養娯楽費403,05510.58%368,15010.46%-8.66%
11その他消費支出835,86221.95%610,11517.33%-27.01%
12

課題:納品書(xlsx形式)

4つの商品を「個数」分購入し、消費税を加えた合計金額を求めよ。

※セル[B8]以外に数式を立ててはならない。

ABCD
1商品単価個数
2コレクション生写真¥1,00010
3BDフォトスタンド¥3,6002
4デザインマスク¥1,2003
5DVDマガジン¥5,0001
6
7消費税率10%
8合計
9

課題:ホテル宿泊料金(xlsx形式)

AHOホテルの宿泊料金は部屋の種類と宿泊日によって金額が決まる。すべての宿泊料金を求めよ。

ABCDE
1平日休日休日前日
2シングル7,0008,400
3ツイン9,00010,35010,800
4ダブル10,00011,50012,000
5デラックスツイン25,00028,75030,000
6
7休日休日前日
8割増率15%20%
9

課題:ツアー料金(xlsx形式)

キャメリアツアーズの河口湖ツアーでは基本料金とオプション料金を組み合わせてツアー料金が決まる。すべての料金を求めよ。

ABCDEF
1OP料金シングルツインスイート
210,00022,00038,000
3食事なし0272,000288,000
4朝食付き12,000272,0000284,000300,000
5全食事付き45,000305,000317,000333,000
6観光付き35,000295,000307,000323,000
7全食事・観光付き70,000330,000342,000358,000
8
9基本料金250,000
10

課題:点数換算(xlsx形式)

満点が異なる試験結果を100点満点換算せよ。換算後の点数は小数点以下第1位まで表示せよ。

ABCDEFGH
1素点100点満点換算
2氏名国語数学英語国語数学英語
3高橋 理子1801216980.776.7
4新垣 希空164754677.050.051.1
5亀井 安美1531357176.590.078.9
6道重 ゆめの1321455566.096.761.1
7田中 樹々1591273879.584.742.2
8満点20015090100
9