先日、セミナーを受講された方から「最近、LAMBDA関数のコンテンツが多いですね~」と言われました。ですね!自分でも分かっています。理由はいくつかあって。とにかくLAMBDA関数って難しいので、自分で理解するために、たくさんの事例を検証しているってことと、あと、LAMBDA関数を"実務で"有効活用する場面を模索しているとか。まぁ、でも一番の理由は「なんか楽しくなってきた」って感じですかねw LAMBDA関数を使った数式って、もうガチガチの高難易度プログラミングです。新しいオモチャを与えられた子供の感覚で、とにかく楽しいです。先日も、"ウルトラE難度"の数式を成功しましたが、難しすぎて解説する勇気がありません。そんなわけで、LAMBDA関数のコンテンツが多いのは、ある意味で"私の趣味"みたいなものです。ご了承くださいませ。
さて「今ならもっと簡単にできるよな~」シリーズです。以前解説した「100円+200円を計算するには」ですが、調べたところ、これを書いたのは2021年でした。この時期は、LAMBDA関数の"ヘルパー関数群"が追加される2022年2月より前です。さらに、正規表現系の関数もありませんでした。こちらは2024年の5月登場ですから。なので、今だったら「LAMBDA関数+正規表現」で簡単に計算できます。今回は、そんなネタです。
今回は、下図のようなデータを扱います。例によって、元データはテーブルにしてあります。名前は「Data」です。
まずは"行ごとの合計"を計算してみましょう。使うのはBYROW関数です。BYROW関数は「LAMBDAのヘルパー関数群」のひとつで、LAMBDA関数に引数を渡せるという特別な関数です。ちなみに、2025年1月現在「LAMBDAのヘルパー関数群」として、次の関数が実装されています。
BYROW関数とは、引数に指定したセル範囲(一般的には、複数行×複数列)から、"行ごと"に抽出する関数です。簡単なケースでご紹介します。
「LAMBDA関数を使ってねーじゃねーか!」なんて慌てないでくださいね。こういう簡易な使い方もできるんです。脳に余裕がある方に向けて補足すると、BYROW関数の結果は、"行数分"だけスピります。つまり、結果は配列になります。また、BYROW関数が抽出する各行も、配列として渡されます。
さて、もうひとつの登場人物である"正規表現"についても、簡単なケースで解説します。
"正規表現"というのは、ワイルドカードの高機能版みたいな仕組みです。正規表現では、さまざまな記号を使えますが、その中で「\d」は"任意の数値(0から9まで)"を表します。そして、上図で使用している「\D」は"\dではないもの"つまり"数値ではないもの"という意味です。数値ではないものって、それって文字列ですよね。今回使っているREGEXREPLACE関数は、名前に"REPLACE"が含まれているように、指定したタイプの文字(今回は任意の文字列)を、指定した文字(今回は空欄)に置換する関数です。「空欄に置換する」ってことは、つまり"除去する"とか"取り除く"ということです。
REGEXREPLACE関数の詳しい解説は、下記のページをご覧ください。
また、今回使用した「\D」など、正規表現で使える記号などについては、下記のページで詳しく解説しています。
なお、上図の結果を見てお分かりのように、REGEXREPLACE関数の結果は"文字列形式"になります。"500"が左寄せで表示されていますよね。この文字列形式の"500"を、SUM関数などで計算できる"数値形式"に変換するには、下図のように「1」を掛け算します。Excelでは、掛け算など何らかの計算を行うと、その結果は"数値"になります。これ、後で使いますので、覚えておいてください。
では、実際にやってみましょう。まずは、BYROW関数が行ごとに抽出するイメージを確認します。
まだ計算ができませんので、とりあえずARRAYTOTEXT関数を指定しました。ここは「ARRAYTOTEXT関数ってナニ?」と深く考えないでください。重要なのは"行ごと"に処理されているというイメージです。ちなみに、ARRAYTOTEXT関数については、GROUPBY関数のページで触れていますので、そちらをご覧ください。
さて、BYROW関数が抽出する"1行ごと"をLAMBDA関数の引数に渡します。下図では、LAMBDA関数の「引数a」に、1行のデータが渡されます。
「引数a」に受け取った"1行ごと"のデータを、上述した"正規表現"を使って「文字列を除去」します。
文字列を除去した結果を、SUM関数で合計します。
ありゃ、すべて0になってしまいました。理由は、SUM関数の仕様です。SUM関数は、引数に指定した中の「文字列は無視する」という特性があります。REGEXREPLACE関数の結果は"文字列"になります。上述しましたが、覚えていますか?なので、文字列形式の"100"などを数値に変換しなければSUM関数で計算できません。
以上です。参考までに、"列ごと"に合計するケースもご紹介します。考え方は一緒です。ただし、指定した範囲内から"列ごと"に抽出するときは、BYCOL関数を使います。