配列数式は使わない。作業セルを使う。
この記事は自分用の覚書です。
(Windows 8.1 Pro 64ビット + Excel2016 Office365 Business サブスクリプション バージョン1710(ビルド8625.2139))
H.K さん
配列数式の件ですが、タイトル通りです。
誤解のないように付け加えておくと「我々の業務上では」という話です。
「配列数式そのものがだめ」だとか、単に「使ってはいけない」という意味ではありません。
我々の業務で配列数式をなぜ使ってはいけないのか。
周囲の誰も配列数式について知らないからです。
おそらく「配列数式」という言葉を知っているのが、私と H.K さんだけだと思います。
仕事でつくるファイルは、誰のものでもなくて皆のものです。
ほかの人に引き継ぐかもしれませんし、「先月つくったのが役立つから、今回使えるよ」というように既存のファイルを流用することだってあるでしょう。
そんなときに、誰も知らない配列数式なんてものを使ったファイルを渡されても困ることのほうが多いでしょう。つくった本人が、異動や退職などでいなかったら尋ねることもできません。
H.K さんと同等かそれ以上のスキルと知識をもった人が仕事を引き継ぐとは限りません。
引き継ぐ人が「関数ってよくわからないので、これから勉強します」というような人かもしれないじゃないですか。
仕事でつくるファイルは、できるかぎり誰もが簡単に理解できるようにつくっておくべきです。
例外があるとしたら、職場の誰もが、そして今後入社してくる誰もが、配列数式を十分に理解している場合でしょうか。
そんな職場だったら、配列数式を使っても何の問題もないと思います。誰もが理解しているのですから。
そもそも、我々の業務で「配列数式を使わなければならない具体的な理由」なんてよほどのことがない限り存在しないでしょう。たいていのことは使わなくてもできます。
ネットで次のような記事を見つけました。
・Excelの配列数式で合計を一発で計算する方法 (@IT - アットマーク・アイティ)
リンク先では、
「配列数式」と呼ばれる式を使うと、小計を計算せずに、1つの式で簡単に合計を計算できる。
(出典:@IT - アットマーク・アイティ)
と書いてありますが、H.K さんや周囲の人にとって、リンク先の記事の内容は "1つの式で簡単に合計を計算できる" と断言できるほど簡単ですか?
たぶん理解するのにちょっと苦労すると思います。
リンク先の例では、確かに1つの式で答えが得られています。だから、「1つの式で簡単に合計を計算できる」と書いてあるだけのことです。
配列数式というものは、誰にでも簡単に理解できるもので、簡単に使えるものだという意味ではありません。
また、リンク先でいう "行が多い表となると結構面倒な作業" は、Excel2016では面倒ではありません。
ああいう形の表なら、セル D2 に式を入れてセルのフィルハンドルをダブルクリックすればいいだけです。何百何千、何万行あっても、一番下のセルまであっという間に式が入力されます。
リンク先であげている「1行おきの合計」という例も、配列数式の解説記事なので配列数式を使うように書いているだけです。
SUMIF関数を使えばできることです。
配列数式とSUMIF関数――どちらが理解しやすいですか?
私は、SUMIF関数のほうが理解しやすいです。仕事で同じことをするのならSUMIF関数を使います。
使わなければならない具体的な理由が無いものは、仕事では使わないほうがよいということです。
作業セル(作業列)は使う。
リンク先では「MOD関数を使って行番号の偶数奇数を求めて、それを各行を判別する材料にするやり方」を挙げています。それはそれとして覚えておいて損はないです。
もし、MOD関数を知らなくて同じことをしたい場合はどうしたらよいでしょう?
各行を区別できるように何らかの印をつけてやって、それを判別材料に使えば、SUMIF関数で対応できます。
「何らかの印をつける」ための列を追加してやればいいんです。つまり、作業列(セル)です。
作業列を使うことを避けないでください。作業列を使って困ることはありませんが、使わないで苦労することはあります。
「作業列を使うとどんどん列が増えていって見づらくなるので使わない」と主張する人がいます。
あるいは、「1つのセルのなかで配列数式を使えば、作業セルを使わないで済む」というものもあります。
私に言わせれば、そもそも考え方が間違っています。
作業セルを使うことと配列数式を使うこと。どちらがより簡単でしょうか。どちらが皆にとって理解しやすいでしょうか。
作業列のほうではないですか。より簡単にできる(皆が理解しやすい)ほうを採ったほうがよいでしょう。
「どんどん列が増えていって見づらい」なら、列を非表示にすればいいだけです。
「作業セルを使わないで済むので、(より難しい)配列数式を使う」のではなくて、「(より難しい)配列数式を使うよりは、(より簡単な)作業セルを使う」ほうが、仕事としては正しいと思います。
1つのセルで答えを得ることにこだわらないでください。
そのことに固執すると1つのセルにやたら長い数式を入れがちです。そんな数式は、関数に不慣れな人には荷が重いです。
作業列で、計算の過程をいくつかにわけてやれば、全体として何をしているのかが誰にでも理解しやすくなります。
おそらく、「作業列を使うとどんどん列が増えていって見づらくなるので使わない」と主張する人は、やりたいことができあがった最終形としての表を強くイメージしているのだと思います。
作業列を増やすごとに、そのイメージから離れていくので列が増えることを嫌うのでしょう。
見た目で列が増えることにどうしても支障があるなら、あるシートで作業列を使った計算をしておいて、最終形としてのレイアウトを作った別のシートから、そのシートを参照してやればいいんです。
そうすれば、計算の過程をわかりやすくしておくことと、必要な列だけが表示されている状態を同時につくれます。
作業列を使って値を抜き出す例
英字と数字がハイフォンで区切られていて、数字のところだけを抜き出す例です。
"-" (ハイフォン)が、文字列のなかで左から何文字目にあるかわかれば、その1つ右隣から数字を抜き出せます。
例では、B列でFIND関数によってハイフォンの位置をまず求めています。B列が作業列です。
その位置の1つ右隣から数字が始まっているので、C列のMID関数のなかでは、ハイフォンの位置に 1 を足すことで「抜き出し始める位置」を指定しています。
MID関数の 100 という引数は適当に入れています。
「(抜き出し始める位置から)何文字を抜き出すか」の指定ですから、ありえないぐらい多めに指定しておけばいいだけです。
LEN関数と組み合わせて元の文字列の字数を抜き出す文字数として使う方法がありますが、「なるべく簡単にする」という方針でやりたかったので図のようにしています。
MID関数の数式のなかにFIND関数を入れるのではなく、このように作業列で計算の過程を分けると、全体として何をしているのかが理解しやすいと思います。
これでもう「数字のところだけ抜き出せている」ので作業は終わっています。ここからは「得たい見た目を作る」話です。
ここでは表の左端に「ID」という作業列を追加しました。
ID で各行を区別できるので、別のシートでVLOOKUP関数の引数に使っています。
これで最終形として得たいレイアウトになります。作業列が増えていっても、こんなふうに考えれば「得たい見た目」をつくれます。
ちょっと話がそれました。
大事なことは、使うべき具体的理由がないのに配列数式をわざわざ使おうと頑張るのではなく、作業列(セル)を使って処理するやり方を頑張って考えてください、ということです。
作業列をどう使うかを考えるのに、それなりの時間はかかるでしょう。
それでも、ややこしい配列数式を頑張って理解して使うことに時間をかけるよりは、作業列を使うことに時間をかけたほうが、結局は業務全体の効率を上げることにつながると思います。
追伸:
最後の例は、VLOOKUP関数なんか使わなくても単にセル参照すればいいですね。
言いたかったことは「作業列を活用すれば、異なるレイアウトに値を表示できる」ということなんですが、その例としては失敗してます。
これでは、「作業列なんて不要」という話になりそうです。説得力のない例ですみません。
とはいえ、作業列の価値と私の失敗は何にも関係がありません。作業列をぜひ活用してください。
| 固定リンク
コメント
全く同感です。
私も仕事柄,配列数式を使うことがありますが,どうしても避けることができないときに限っています。
人に渡すことを考えると,やはりわかりやすいのが一番ですから。それと,自分でメンテナンスするときにも,配列数式だと,それを読み解くのに時間がかかります。
1つのセルで答えを求める人がもてはやされるようなところがありますが,それをもらって意味が分かって,改良できる人がどれくらいいるのだろうかと思います。
エクセルは,印刷する部分・見せる部分と,作業する部分を分けることができるのですから,作業列を使って高度な抽出をした方が,あとのメンテナンスが非常に楽ですね。
投稿: しげるがもげる | 2018.07.16 07:08