エクセル雑感
難しい数式とは何か?

ExcelマクロVBAとエクセル関数についての私的雑感
公開日:2023-12-07 最終更新日:2023-12-07

難しい数式とは何か?


エクセルでは難しい数式は要らない、𝕏ではそんな話を良く目にします。
同じことをするのなら、難しいより簡単な方が良い、それは当たり前ですね。
では「難しい」とは何を指しているのでしょうか?


普段良く「数字で語る」みたいなことを言いますが、「難しい」の基準もなくそれを計る尺度も存在しない極めて曖昧な話です。
難しい数式を批判しながら言っていることが難しく不明瞭な話になっていますよね。

※表が適切に作製されていれば、そもそもごく簡単な数式だけで済んでしまうものです。
従って数式の難しさではなく、表組みが不適切なことを指摘するべきですね。


SUM関数は難しいのか?

=SUM(A1:A10)
さすがにこれでは議論の余地がないので、少し数式を追加します。
=SUM(A1:A10,B11:B20,C1:C10)
さて、どうでしょうか?
難しくはない、難しくはないが、一瞬戸惑ったりしなかったですか?
ではこれはどうですか、
=SUM(A1:A10)+SUM(B11:B20)+SUM(C1:C10)
数式が長くなってきて読みづらさはありますかね。
でも、難しいという表現にはならないのではないですか。
=SUM(SUM(A1:A10),SUM(B11:B20),SUM(C1:C10))
さすがにこんな数式を書く人はいないとは思いますが・・・
こうなってくると、読みづらいというだけではなく、
なんとなく難しい感じを受ける人も出てくるのではないかと想像しているのですけど、どうでしょうか。

ご案内の通り、
全部同じ意味の数式でありもちろん同じ結果になる数式です。

①=SUM(A1:A10,B11:B20,C1:C10)
②=SUM(A1:A10)+SUM(B11:B20)+SUM(C1:C10)
③=SUM(SUM(A1:A10),SUM(B11:B20),SUM(C1:C10))

たぶんエクセルに詳しい人達に聞けば①が良いというのでしょうね。
でも私は②でも良い、むしろ②の方が良い場合も結構あるのではないかと思っています。
SUM関数に複数の引数を指定できることを知らないエクセル初心者は結構います。
であるならば、1引数で済ませる事にも意味があります。
さらに言うなら、SUM関数の中で計算式が書けることを知らない人もいるのです。
その場合に②の書き方をしていることも当然ありますよね。
さすがに③はなかなかいないと思いますけど(笑)

問題は②の数式を書いている人にとっては、①を難しい数式と感じてしまう可能性があるという事です。
もしそれが会社の上司だったとしたら、あなたはどうしますか?
私としては、①②はどちらでも良いと思っています。
③こそが難しい数式なのではないかと思っています。


VLOOKUP+MATCH
INDEX+MATCH+MATCH
これらの数式は難しいのか?

VLOOKUP+MATCH
INDEX+MATCH+MATCH

これらの数式は難しい数式なのでしょうか?

エクセル Excel 難しい数式

エクセル Excel 難しい数式

=VLOOKUP($F2,$A$2:$D$6,MATCH(G$1,$A$1:$D$1,0),FALSE)
=INDEX($A$2:$D$6,MATCH($F2,$A$2:$A$6,0),MATCH(G$1,$A$1:$D$1,0))

コピーを考慮して複合参照(行列で相対参照と絶対参照を組み合わせ)しているのも相まって難しい数式に見えますよね。
最近流行のXLOOKUPだとどうでしょうか。

=XLOOKUP($F2,$A$2:$A$6,INDEX($B$2:$D$6,,MATCH(G$1,$B$1:$D$1,0)))

うーん、これはXLOOKUPを使う意味はあまりないかな・・・
これらの数式は十分に難しい数式だと思います。
これらの数式が難しくないというのなら、「難しい」とは何か?

しかし、これらの数式は難しくて理解できない、と言われたときどうしますか?
難しい数式は不要、覚えなくて良い、と言うのでしょうか?
恐らく多くのエクセルを扱っている人達は、これくらいは覚えろと言うのではないでしょうか。
だとしたら、不要だという難しい数式とは、どんな数式なのか・・・
上記の関数の使い方に不安がある場合は以下で学習してください。
VLOOKUP関数(範囲の左端列で値検索し対応セル値)
検索値でセル範囲の最初の列を検索し、その範囲の同じ行にある任意のセルから値を返します。Vは縦方向(vertical)の意味です。つまり縦方向の表に対して、検索値を縦に探す場合に使用します。VLOOKUP関数の書式 =VLOOKUP(検索値,範囲,列番号,検索方法) 検索値 表または範囲の左端の列で検索する値を指定し…
INDEX関数(範囲から指定されたセル)
セル範囲から、指定された行と列が交差する位置にあるセルの参照を返します。INDEX関数の書式 INDEX(範囲,行番号[,列番号]) 範囲 セル範囲を指定します。セル範囲が1行または1列である場合、行番号または列番号はそれぞれ省略することができます。
MATCH関数(範囲から値を検索し一致する位置)
セルの範囲内で指定された項目を検索し、その項目の相対的な位置を返します。セル範囲は、縦方向・横方向のどちらでも指定可能です。MATCH関数の書式 MATCH(検査値,検査範囲,照合の型) 検査値 値(数値、文字列、または論理値)、またはこれらの値に対するセル参照を指定できます。


テーブルの構造化参照は難しいか?

エクセル Excel 難しい数式

A1:B6は「テーブル1」です。
D2:D6に「テーブル1」の「値1」×「値2」の計算式を入れます。

エクセル Excel 難しい数式

D2=テーブル1[@値1]*テーブル1[@値2]
この数式をD2にいれてD6までコピー。
構造化参照を使わなければ、

エクセル Excel 難しい数式

D2=A2*B2
これは数式の長さだけなら短いですが・・・

D2=テーブル1[@値1]*テーブル1[@値2]
D2=A2*B2
単純に式の難しさという事なら前者の方が難しいと言えるような・・・

しかし皆さんご承知のように、これは式の長さや難しさの問題ではなく、保守性の問題だったり、そもそも式を入れる時の自動補完の問題です。
つまり総合的に構造化参照が良いという事です。
ここでは「難しい」という尺度そのものが適切ではないという事になります。


スピルは難しいか?

スピルの基本については、
スピルについて|エクセル入門
2019年にOffice365のExcelに実装された革新的な機能としてスピルがあります。数式を入力したセルから結果があふれて隣接したセルにも出力されるのがスピルです。今までは数式を入れたセルにしか結果を出せませんでしたが、スピルでは隣接するセルにまで結果が表示されます。

以下の表で考えてみます。

エクセル Excel 難しい数式

D2=テーブル1[@値1]*テーブル1[@値2]

これは、スピルなら、

エクセル Excel 難しい数式

D2=テーブル1[値1]*テーブル1[値2]

これはもう、難しいとかそういうレベルの話しではないと思いますが、、、
単純に、こういう数式の書き方で良いという事を知れば良いだけですね。
では掛け算九九の表ではどうでしょうか。

エクセル Excel 難しい数式

B2=$A2*B$1

複合参照(行列で絶対参照と相対参照を組み合わせる)の指定が難しい・・・
数式自体は難しくないのですが、複合参照が難しいのですよね。
エクセル苦手な人が最初に突き当たる壁といっても良いかもしれません。
ですが、難しいからといって避けて通れない、これは乗り越えるしかないのです。

エクセル Excel 難しい数式

B2=A2:A10*B1:J1

これはスピルです。
難しそう・・・今まで複合参照を使っていた人はそう感じる人もいると思います。
式が難しいのではなく、考え方が難しいという事でしょう。

でもこれは慣れの問題じゃないでしょうか。
最初から、このように教えられた人がどう感じるのか、なんとも言えない気もします。

B2=$A2*B$1 → 他のセルにコピー
B2=A2:A10*B1:J1

やはりここでも「難しい」という言葉はあまり適切な表現とはいえない気がします。
特に以下の関数については、使い方はとても簡単なので是非使いこなせるようになった方が良いです。
FILTER関数(範囲をフィルター処理)
FILTER関数は、定義した条件に基づいてデータ範囲をフィルター処理した結果を返します。FILTER関数はスピルで登場した新しい関数です。最後の方では、表示する列を選択する方法も掲載しています。FILTER関数の書式 =FILTER(配列,含む,[空の場合]) 配列 必須です。
SORT関数、SORTBY関数(範囲を並べ替え)
SORT関数は、範囲または配列の内容を並べ替えます。SORTBY関数は、範囲または配列を対応する範囲または配列の値に基づいて並べ替えます。SORT関数とSORTBY関数は範囲を並べ替える関数ですが、同じこともできますが、れぞれの関数でなければできないこともあります。
UNIQUE関数(一意の値)
UNIQUE関数は、範囲または配列から一意(ユニーク)な値を返します。範囲または配列から重複を削除して一意化した配列を返します。UNIQUE関数はスピルで登場した新しい関数です。UNIQUE関数の書式 =UNIQUE(配列,[列の比較],[回数指定]) 配列 必須です。
XLOOKUP関数(VLOOKUP関数を拡張した新関数)
XLOOKUP関数は、範囲または配列を検索し、見つかった最初の一致に対応する項目を返します。VLOOKUP関数とHLOOKUP関数の両方の機能を備え、さらに新しい機能まで追加された新関数です。VLOOKUP関数、HLOOKUP関数の引数は4個でしたが、XLOOKUP関数の引数はなんと6個もあります。


三角関数・行列関数は難しいか?

もう例を出す必要もないですよね。
これらはエクセルの数式が難しいのではなく、
三角関数が分からない、行列演算が分からない、と言う事ですよね。
もちろん易しくないし難しいです。

でも、これらの計算が必要なら難しかろうが大変だろうが使うしかないです。
難しい数式だからダメ?
そんなバカな事をいう人はいないと思います。


LAMBDA以降に出た新関数は難しいか?

難しい関数もあれば、割と簡単に使えてとても便利な関数もあります。

エクセル Excel 難しい数式

=TEXTSPLIT(A1,"(",")",TRUE)

これは見た通り、1セルに複数の情報が入ってしまっています。
これを各セルに良い具合に分割しています。
決して難しい数式ではないはずです。

新関数が出る前なら、これと同じことを数式でやるのはかなり大変でした。
VBAを使う場合も結構あるのではないでしょうか。
新しい関数は難しそうだから使わない・・・
そんな判断は愚かな判断ですよね。
もちろん、バージョン問題があるので、使える環境ならと言う事になります。
LAMBDA以降に出た新関数の中には割と簡単に使えてとても便利な関数は多くあります。
TEXTSPLIT関数(列と行の区切り記号で文字列を分割)
TEXTSPLIT関数は、列の区切り記号と行の区切り記号を使用して文字列を分割します。列の区切り(横に分割)を使った場合は「データ」タブの「区切り位置」と同じような処理ができる関数です。さらに、列(横)への分割だけではなく行(縦)に分割することもできます。
TEXTBEFORE関数(テキストの指定文字列より前の部分を返す)
TEXTBEFORE関数は、テキスト文字列から指定した区切り文字列の前に出現するテキストを返します。区切り文字列の前ではなく後ろを取得する場合はTEXTAFTER関数を使用します。TEXTBEFORE関数の構文 =TEXTBEFORE(text,delimiter,[instance_num],[match_mod…
TEXTAFTER関数(テキストの指定文字列より後ろの部分を返す)
TEXTAFTER関数は、テキスト文字列から指定した区切り文字列の後ろに出現するテキストを返します。区切り文字列の後ろではなく前を取得する場合はTEXTBEFORE関数を使用します。TEXTAFTER関数の構文 =TEXTAFTER(text,delimiter,[instance_num],[match_mode…
VSTACK関数(配列を縦方向に順に追加・結合)
配列を縦方向(垂直方向)に順番に追加し、1つの大きな配列を作成して返します。VSTACK関数は各配列引数を行単位で上から順に(つまり下へ下へ)追加して新しい配列を作成します。横方向(水平方向)に結合する場合はHSTACK関数を使用します。
HSTACK関数(配列を横方向に順に追加・結合)
配列を横方向(水平方向)に順番に追加し、1つの大きな配列を作成して返します。HSTACK関数は各配列引数を列単位で左から順に(つまり右へ右へ)追加して新しい配列を作成します。縦方向(垂直方向)に結合する場合はVSTACK関数を使用します。

これらの関数は、そもそも難しくないので是非覚えた方が良いと思います。
上記以外の関数でも、便利だと思ったら積極的に使ったらよいと思います。
ただし、やはりLAMBDAを使いこなすのは結構難しいと思います。
LAMBDA以降の新関数について
2022年2月頃にLAMBDA関数と関係するいくつかの新関数がMicrosoft365(Office365)で提供されました。これらはLAMBDA関数とLAMBDA関数を引数に指定できるヘルパー関数群になります。2022年3月頃には「OfficeInsiderProgram」でTEXTSPLITやVSTACKをはじ…

ここでいう難しさとは、式の難しさではなく、関数の難しさです。
行列演算の難しさだったりするので、これは個人差がかなりあります。
個人差が大きいという事は、一般的には難しいものに分類されると思います。


つまり難しい数式とは?

ここまでざっと見てきましたが、難しい数式とはどういう数式なのか・・・

✅Excelスキルが極端に低い場合の偏見
✅関数ネストにより式が複雑
✅数学知識が必要な関数
✅LAMBDAは一般的に難しい

ここまでは広く賛同してもらえるのではないかと思います。
私の考えとして、これに以下の場合を含めたい。
✅関数の本来の用途以外の使い方をしている。
関数の本来の用途とは、関数名から想像できる機能・用途。
分かり易いところでは、

SUMPRODUCT関数(配列の対応する要素の積の合計)
条件に一致するセルの平均値(算術平均)を返します。Excel2007以降に追加された関数です。AVERAGEIF関数の書式 AVERAGEIF(範囲,条件,[平均範囲]) 条件に一致するセルの平均値を返します。

この関数は、SUM+PRODUCT
つまり、加算+乗算
乗算した結果を加算する関数です。
ところが、この関数が配列を扱えることから加算や乗算とは関係ない使い方が広まってしまいました。
これはさすがに分かりづらい、つまり難しい使い方です。
(旧バージョンでは良い代替え手段が無くやむなく使用している場合も多い)
逆に言えば、関数本来の使い方をしているなら、難しいとかそういう判断基準はナンセンスでしょう。
PMT関数が難しい…そんな話は聞いていられないのですから。
数式が難しいという場合は、その数式のどこがどのように難しいと感じるのか、具体的な指摘をするべきですね。
そうでなければ、単なるいちゃもんといわれても仕方ないと思います。




同じテーマ「エクセル雑感」の記事

プログラミングとは
「ネ申Excel」問題 への同意と反論
「Excel3ステップ理論」3階層システムの応用
「ポケモンを確実に見つける方法」をExcelで数学してみた
エクセルで「もういくつ寝るとお正月」
エクセルで連立方程式を解く(MINVERSE,MMULT)
VBAが消えてしまった!マクロが壊れて動かない!
スピらない スピル数式 スピらせる
難しい数式とは何か?
いくつかの数式の計算中にリソース不足になりました。
無効な前方参照か、コンパイルされていない種類への参照です。


新着記事NEW ・・・新着記事一覧を見る

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ