概要:Excel関数の常識を覆す、新時代の幕開け
長年ExcelとVBAを教えてきた経験から断言できます。Microsoft Excelは、LAMBDA関数の導入を皮切りに、まさに「関数革命」とも呼べる大きな変革期を迎えています。これまでVBAでしか実現できなかったような複雑なデータ処理や、配列操作が、もはや数式だけで、しかも簡潔に記述できるようになりました。LAMBDA関数自体が「カスタム関数をExcelシート上で定義できる」という画期的な機能であるだけでなく、これに続くMAP、REDUCE、SCAN、BYROW、BYCOL、MAKEARRAYといった「高階関数」や、VSTACK、HSTACK、TEXTSPLIT、TOROW、TOCOLなどの強力な「配列操作関数」群が、従来のExcelの限界を大きく広げています。
これらの新関数は、単なる機能追加ではありません。それは、Excelにおける「関数型プログラミング」という新たなパラダイムシフトを意味します。データ処理の記述スタイルが根本から変わり、より宣言的で、再利用性が高く、エラーの発生しにくいコード(数式)の記述が可能になります。本記事では、このエキサイティングな新関数群の全貌を明らかにし、その強力な機能と、実務での活用方法、そしてVBAユーザーがどのようにこれらを学び、自身のスキルセットに組み込んでいくべきかについて、ベテラン講師の視点から徹底的に解説していきます。
詳細解説:LAMBDAとその仲間たちがもたらす変革
LAMBDA関数:Excelにおけるカスタム関数の定義
LAMBDA関数は、Excelの計算エンジンに「その場で関数を定義する能力」を与えます。VBAでユーザー定義関数 (UDF) を作成するのと同様に、引数を取り、その引数を使った計算結果を返す関数を、セル内で直接、あるいは名前の定義として作成できるのです。
構文:`LAMBDA([パラメーター1, …], 計算式)`
例えば、ある数値を2倍する簡単な関数を定義するには、`LAMBDA(x, x*2)` と記述します。このLAMBDA関数を直接セルに入力しても機能しませんが、これを「数式マネージャー」で例えば「MyDouble」という名前で定義すれば、以降は `=MyDouble(A1)` のように、組み込み関数と同じように利用できるようになります。これは、特定の業務ロジックをExcelシート上にカプセル化し、再利用性を高める上で絶大な効果を発揮します。さらに、LAMBDA関数は自身を呼び出すことで再帰処理を記述することも可能であり、従来のExcel関数では不可能だった、より高度なアルゴリズムの実装を可能にします。
高階関数群:データ処理の抽象化と効率化
LAMBDAの真価は、その定義された関数を他の関数に「引数として渡せる」点にあります。これが「高階関数」と呼ばれる関数群の登場を促しました。
* **MAP関数:配列の各要素に一括処理**
`MAP(配列, LAMBDA(要素, 処理))`
MAP関数は、指定した配列の各要素に対して、LAMBDAで定義された処理を適用し、結果を新しい配列として返します。これは、従来のCSE(Ctrl+Shift+Enter)配列数式やVBAのループ処理を、より簡潔かつ宣言的に記述する強力な代替手段となります。例えば、ある数値リストの各要素が100より大きいか小さいかを判断するような処理を、一行の数式で実現できます。
* **REDUCE関数:配列を単一の値に集約**
`REDUCE(初期値, 配列, LAMBDA(アキュムレーター, 現在値))`
REDUCE関数は、配列の要素を順に処理し、それを累積(アキュムレート)していき、最終的に一つの結果値に集約します。アキュムレーターとは、前のステップの計算結果を保持する変数です。例えば、特定の条件を満たす文字列だけを結合したり、複雑な条件での合計値を算出したりする際に非常に強力です。
* **SCAN関数:REDUCEの途中経過を配列で出力**
`SCAN(初期値, 配列, LAMBDA(アキュムレーター, 現在値))`
SCAN関数はREDUCE関数と非常に似ていますが、異なるのは、各ステップの途中結果をすべて配列として返す点です。これにより、累積和の推移や在庫の変動、段階的な計算プロセスを視覚的に追跡するようなシナリオで威力を発揮します。
* **BYROW / BYCOL関数:行ごと、列ごとのカスタム処理**
`BYROW(配列, LAMBDA(行))`
`BYCOL(配列, LAMBDA(列))`
これらの関数は、指定された配列の各行(BYROW)または各列(BYCOL)に対して、LAMBDAで定義された処理を適用し、結果を配列として返します。表形式のデータに対して、行ごとの合計、平均、特定の条件に基づく変換などを、従来のSUMIFやAVERAGEIF、あるいはVBAのループを使わずに、動的に実現できるようになります。
* **MAKEARRAY関数:動的な配列生成**
`MAKEARRAY(行数, 列数, LAMBDA(行インデックス, 列インデックス))`
MAKEARRAY関数は、指定した行数と列数を持つ配列を、LAMBDAで定義したロジックに基づいて動的に生成します。行インデックスと列インデックスを引数として受け取るLAMBDAを利用することで、単位行列の生成、特定のパターンを持つ行列の作成、シミュレーション結果の表作成など、多岐にわたる応用が可能です。
新しい配列操作関数:データの前処理を革新
LAMBDAとその高階関数群をさらに強力にするのが、データの前処理や整形を劇的に効率化する新しい配列操作関数です。
* **VSTACK / HSTACK:配列の縦横結合**
`VSTACK(配列1, [配列2, …])`
`HSTACK(配列1, [配列2, …])`
複数の範囲や配列を縦方向(VSTACK)または横方向(HSTACK)に結合します。これにより、従来のコピー&ペーストやOFFSET関数を駆使した複雑なデータ統合作業が、一行の数式で可能になります。
* **TOROW / TOCOL:配列を1次元に変換**
`TOROW(配列, [ignore], [scan_by_column])`
`TOCOL(配列, [ignore], [scan_by_column])`
指定した配列を1行(TOROW)または1列(TOCOL)の配列に変換します。空のセルを無視するオプションや、列優先でスキャンするオプションも用意されており、データの整形作業が格段に容易になります。
* **TEXTSPLIT:区切り文字でテキストを分割**
`TEXTSPLIT(テキスト, col_delimiter, [row_delimiter], …)`
指定したテキストを、指定した区切り文字(複数指定可能)で分割し、配列として返します。CSVデータのインポート後の整形や、カンマ区切りの文字列から個々の要素を抽出する際に、従来のTEXT TO COLUMNS機能やVBAのSplit関数を置き換える強力な手段となります。
* **CHOOSEROWS / CHOOSECOLS:特定の行/列の選択**
`CHOOSEROWS(配列, row_num1, [row_num2, …])`
`CHOOSECOLS(配列, col_num1, [col_num2, …])`
配列から指定した行または列だけを抽出します。これは、特定のデータ範囲から必要な部分だけを取り出して、後続の処理に渡す際に非常に便利です。
* **EXPAND / WRAPROWS / WRAPCOLS:配列のサイズ変更と整形**
`EXPAND(配列, 行数, 列数, [pad_with])`
`WRAPROWS(ベクター, wrap_count, [pad_with])`
`WRAPCOLS(ベクター, wrap_count, [pad_with])`
これらの関数は、配列の形状を柔軟に操作します。EXPANDは配列を任意のサイズに拡張し、WRAPROWS/WRAPCOLSは1次元の配列(ベクター)を指定した数で折り返して、行または列に整形します。これにより、動的なレポート生成やデータの視覚化において、表現の幅が大きく広がります。
サンプルコード:実践で学ぶ新関数の威力
ここでは、LAMBDAとそれに付随する新関数を組み合わせた具体的な使用例をいくつか紹介します。
1. カスタム関数「税込み価格計算」の定義
消費税率が変動する可能性のある計算を、名前付きLAMBDAで定義します。
まず、数式マネージャーを開き、「新規作成」をクリックします。
名前: `CalcTaxInclusive`
参照範囲: `=LAMBDA(price, tax_rate, price * (1 + tax_rate))`
これで、セルに `=CalcTaxInclusive(A1, 0.1)` (A1の価格に10%の税率を適用) と入力できるようになります。
2. MAP関数とLAMBDAで条件付き変換
顧客リストの各年齢が「成人」か「未成年」かを判定する。
=MAP(B2:B10, LAMBDA(age, IF(age >= 20, "成人", "未成年")))
B2からB10の各セルに格納された年齢に対して、LAMBDA関数が20歳以上なら「成人」、それ以外なら「未成年」と判定し、結果をスピル(あふれ出し)させます。
3. REDUCE関数で特定の文字列を連結
ある列から、特定のキーワード「重要」を含むセルだけを抽出し、それらをカンマで連結する。
=REDUCE("", A1:A10,
