「複数商品の価格×数量の合計を店舗ごとに一括で計算したい」「連立方程式をExcelで解きたい」――行列計算が必要な場面で活躍するのが MMULT関数 です。
MMULT関数は2つの配列(行列)の積を計算します。手計算では面倒な行列の掛け算を一瞬で処理でき、MINVERSE・MDETERM関数と組み合わせれば連立方程式も解けます。一見むずかしそうですが、「複数の掛け算の合計を一括で求める」という使い方から始めると、意外と手軽に使えます。
「行列という言葉だけで敬遠していた」という方も、この記事で具体的な数式と実例を見れば、自分のシートに取り入れるイメージが持てるはずです。
この記事では行列計算の基礎から、スピル対応の使い方、SUMPRODUCT関数との違い、実務での活用例まで丁寧に解説します。
- MMULT関数とは?
- MMULT関数の書き方
- 基本的な使い方
- スピルとCSE配列数式
- MINVERSE関数との組み合わせ:連立方程式を解く
- MDETERM・MINVERSEとの使い分け
- TRANSPOSE関数との組み合わせ
- SUMPRODUCT関数との違い
- 重み付き平均への応用
- 構造化テーブルでMMULTを自動拡張する
- 在庫評価・原価計算への応用
- よくある疑問(FAQ)
- よくあるエラーと対処法
- 最小二乗法(線形回帰)への応用
- SEQUENCE関数で単位行列を作成・逆行列を検証する
- BYROW・MAKEARRAY との組み合わせ(Microsoft 365 専用)
- FILTER 関数と組み合わせた条件付き行列計算(Microsoft 365)
- Power Query / Power Pivot とMMULTの使い分け
- まとめ
- 注意事項と使い上のポイント
MMULT関数とは?
読み方と語源
「エム マルト」と読みます。「Matrix Multiplication(行列乗算)」の略で、2つの行列を掛け合わせる関数です。
できること
2つの行列(配列)の 行列積 を計算し、新しい行列を返します。
- 複数商品×複数店舗の売上を一括計算する
- 連立方程式をMINVERSEと組み合わせて解く
- 重み付き平均・加重スコアを一括算出する
行列積の条件:
- 配列1の 列数 と 配列2の 行数 が一致している必要があります
(m×n) × (n×p) = (m×p)の形で計算されます
つまり「左の行列の横のサイズ」と「右の行列の縦のサイズ」が同じでなければいけません。この条件を確認してから数式を組む習慣をつけると、エラーを防ぎやすくなります。
MMULT関数の書き方
基本構文
=MMULT( 配列1, 配列2 )
引数の説明
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 配列1 | 必須 | 掛け合わせる1つ目の行列(セル範囲または配列定数) |
| 配列2 | 必須 | 掛け合わせる2つ目の行列(配列1の列数 = 配列2の行数であること) |
注意点:
- 配列に文字列・論理値・空白が含まれていると
#VALUE!エラー - 配列1の列数と配列2の行数が一致しないと
#VALUE!エラー - 結果は複数セルに展開されるため、スピル(自動展開)が動作します
基本的な使い方
例1:1行×N列 と N行×1列 の行列積(内積)
3種類の商品の単価が1行に、売上数量が1列にある場合:
単価(B2:D2)
| 商品A | 商品B | 商品C |
|---|---|---|
| 500 | 800 | 1200 |
数量(F2:F4)
| 数量 |
|---|
| 10 |
| 5 |
| 3 |
=MMULT(B2:D2, F2:F4)
結果:500×10 + 800×5 + 1200×3 = 14600
SUMPRODUCT関数と同じ計算ですが、行列の形式でまとめて処理できます。
例2:複数店舗×複数商品の売上合計
3商品×3店舗のデータがある場合、1回のMMULTで各店舗の売上合計を一括計算できます。
単価(B1:D1)
| 商品A | 商品B | 商品C |
|---|---|---|
| 500 | 800 | 1200 |
各店舗の販売数量(B2:D4)
| 商品A | 商品B | 商品C | 店舗 |
|---|---|---|---|
| 10 | 5 | 3 | 店舗A |
| 8 | 6 | 4 | 店舗B |
| 12 | 3 | 2 | 店舗C |
=MMULT(B2:D4, TRANSPOSE(B1:D1))
各行(店舗)の売上合計が一列で返されます。
| 店舗 | 売上合計 |
|---|---|
| 店舗A | 500×10+800×5+1200×3 = 14,600 |
| 店舗B | 500×8+800×6+1200×4 = 13,600 |
| 店舗C | 500×12+800×3+1200×2 = 11,400 |
TRANSPOSE関数で単価を1行から1列に変換することで、行列の次元が合います(3×3 × 3×1 = 3×1)。
例3:2×2行列 × 2×2行列
A1:B2に2×2行列、D1:E2に別の2×2行列がある場合:
=MMULT(A1:B2, D1:E2)
結果として2×2の行列がスピルで展開されます。
スピルとCSE配列数式
スピル対応(Excel 2019以降・Microsoft 365)
Excel 2019・Microsoft 365では、MMULTの結果は スピル(自動展開)されます。結果の左上セルに数式を1つ入力するだけで、必要な範囲に自動的に展開されます。
C1: =MMULT(A1:B2, D1:E2) ← C1だけに入力。結果がC1:D2に展開される
スピルが展開される範囲(「スピル範囲」)に既存のデータがあると、スピルエラー(#SPILL!)が発生します。展開先のセルを空にしてから数式を入力してください。
旧CSE配列数式(Excel 2016以前)
旧バージョンのExcelでは、Ctrl+Shift+Enter で確定する CSE配列数式 として入力する必要がありました。
{=MMULT(A1:B2, D1:E2)} ← {} は Ctrl+Shift+Enter で入力
現行のExcelでは通常のEnterで入力できます。古いファイルにCSE形式があった場合も、通常の数式として書き直せます。
MINVERSE関数との組み合わせ:連立方程式を解く
MMULT関数の最も強力な応用が、MINVERSE(逆行列)との組み合わせによる 連立方程式の解法 です。
連立方程式 AX = B の解法
問題:次の連立方程式を解く
2x + y = 8
x + 3y = 9
手順
- 係数行列A(B1:C2)に以下を入力する
| 列B | 列C |
|---|---|
| 2 | 1 |
| 1 | 3 |
- 右辺ベクトルB(E1:E2)に以下を入力する
| 列E |
|---|
| 8 |
| 9 |
- 解の数式を入力する
=MMULT(MINVERSE(B1:C2), E1:E2)
結果:x=3, y=2 がスピルで返されます。
連立方程式の数が増えても、行列の範囲を広げるだけで同じ数式のパターンで対応できます。ただしMINVERSEを使う前に、係数行列の行列式が0でないことを確認しておくと安心です。
3変数の連立方程式の例(パターン確認)
2x + y + z = 9
x + 3y + z = 12
x + y + 4z = 14
係数行列A(3×3)と右辺ベクトルB(3×1)を用意して、同じ数式で解けます。
=MMULT(MINVERSE(A), B) ← 範囲が変わるだけで数式は同じ
方程式の数が変わっても数式の形が変わらないのがMMULT+MINVERSEの強みです。財務モデリングや原価計算で変数の多い連立方程式を扱う場面で重宝します。
MDETERM関数で事前チェック
=MDETERM(B1:C2)
この結果が0だと逆行列が存在せず、MINVERSEを使うと#NUM!エラーになります。連立方程式に解が存在しない(または一意に定まらない)サインです。
MDETERM・MINVERSEとの使い分け
| 関数 | 返すもの | 用途 |
|---|---|---|
| MMULT | 行列積(配列) | 2つの行列を掛け合わせる |
| MINVERSE | 逆行列(配列) | 連立方程式の解法でMMULTと組み合わせる |
| MDETERM | 行列式(スカラー) | 逆行列が存在するか確認する(0なら逆行列なし) |
3つの関数をセットで覚えておくと、行列計算が必要なシートを一から組み立てるときに迷わなくなります。
TRANSPOSE関数との組み合わせ
行列の転置(行と列の入れ替え)が必要な場合はTRANSPOSE関数を使います。
=MMULT(A1:C3, TRANSPOSE(A1:C3))
行ベクトルを列ベクトルに変換してMMULTと組み合わせるパターンが特に多く使われます。
具体的な場面:
- 単価が横1行で入力されているのに数量が縦1列の場合、TRANSPOSEで単価を縦に変換してからMMULTに渡す
- データの形式が固定されていてレイアウトを変更できないときに重宝する
SUMPRODUCT関数との違い
「MMULT関数とSUMPRODUCT関数は何が違うのか」と思う方も多いでしょう。簡単に整理すると次のようになります。
| 観点 | MMULT | SUMPRODUCT |
|---|---|---|
| 計算の対象 | 行列全体 | 配列の要素ごとの積の合計 |
| 複数行への一括処理 | 得意(全行の結果を一度に返す) | 1条件ずつ個別に書く必要あり |
| 戻り値の形 | 行列(複数セルに展開) | スカラー(単一値) |
| 難易度 | やや高い(次元合わせが必要) | 直感的でわかりやすい |
「商品ごとの売上を1つだけ求めたい」ならSUMPRODUCTが手軽です。一方「複数店舗や複数期間の結果をまとめて出したい」ならMMULTが圧倒的に効率的です。
' SUMPRODUCT(1店舗の売上だけ求める)
=SUMPRODUCT(B1:D1, B2:D2)
' MMULT(全店舗の売上を一括で求める)
=MMULT(B2:D4, TRANSPOSE(B1:D1))
データ規模が大きいほど、MMULTを使う恩恵が大きくなります。
重み付き平均への応用
テストの点数や評価スコアに重みをかけて合計する「重み付き平均」も、MMULTで一括計算できます。
例:3科目のテスト点数と重みから加重合計を計算する
| 科目 | 重み(B列) | 生徒A(C列) | 生徒B(D列) | 生徒C(E列) |
|---|---|---|---|---|
| 国語 | 0.30 | 80 | 70 | 90 |
| 数学 | 0.40 | 60 | 85 | 75 |
| 英語 | 0.30 | 75 | 80 | 65 |
=MMULT(TRANSPOSE(B2:B4), C2:E4)
各生徒の加重合計が1行(水平方向)で返されます。
| 生徒A | 生徒B | 生徒C |
|---|---|---|
| 70.5 | 79.5 | 76.5 |
SUMPRODUCT関数で1人ずつ計算するより、MMULTなら全生徒の結果を1回の数式で出せるので、人数が多いほど効果を発揮します。
人事評価への応用
業績・スキル・行動指針など複数の評価項目に重みをかけて総合スコアを出す場合も同じパターンが使えます。評価対象者が増えても数式を書き直す必要がなく、範囲を広げるだけで対応できます。
評価項目(B2:B4): 重み0.5, 0.3, 0.2
社員別スコア(C2:E4): 各社員の評価点
=MMULT(TRANSPOSE(B2:B4), C2:E4)
人事部や管理職の方が評価集計シートを作るときに、このパターンを使うと一括更新できてメンテナンスが楽になりますよ。
構造化テーブルでMMULTを自動拡張する
ここまでの例ではセル範囲を B2:D4 のように直接書いてきましたが、データ行が増えるたびに数式を直すのは面倒です。Excelの 構造化テーブル(「ホーム」→「テーブルとして書式設定」、またはCtrl+T)と組み合わせると、行を追加するだけで数式が自動拡張されてくれます。
たとえば次のように2つのテーブルを用意します。
テーブル名:単価マスタ(B列:商品ID、C列:単価)
| 商品ID | 単価 |
|---|---|
| A001 | 500 |
| A002 | 800 |
| A003 | 1200 |
テーブル名:販売実績(B列:店舗、C〜E列:A001 / A002 / A003 の販売数量)
| 店舗 | A001 | A002 | A003 |
|---|---|---|---|
| 店舗A | 10 | 5 | 3 |
| 店舗B | 8 | 6 | 4 |
| 店舗C | 12 | 3 | 2 |
各店舗の売上合計は、構造化テーブル参照を使って次のように書けます。
=MMULT(販売実績[[A001]:[A003]], 単価マスタ[単価])
販売実績[[A001]:[A003]] で3×3の数量行列、単価マスタ[単価] で3×1の単価ベクトルを表しています。販売実績テーブルに「店舗D」の行を追加すると、MMULTの結果も自動で4行にスピル拡張されます。
範囲を直書きする方式と違って、商品が増えたときも [[A001]:[A003]] を [[A001]:[A004]] に伸ばすだけで済むため、メンテナンスがかなり楽になります。複数人で共有するシートでは、構造化テーブル参照をぜひ使ってみてください。
スピル参照(#)との合わせ技
MMULTの結果をさらに別の計算に渡したいときは、スピル参照(数式の入ったセル番地 + #)が便利です。
H2: =MMULT(販売実績[[A001]:[A003]], 単価マスタ[単価]) ← 売上ベクトル
I2: =SUM(H2#) ← 全店舗の総売上
J2: =H2# / SUM(H2#) ← 店舗別の構成比
H2# と書くだけで売上ベクトル全体を再利用できます。中間計算用のセルを別途用意せずに済むので、シート全体がすっきりします。
在庫評価・原価計算への応用
MMULT関数は売上集計だけでなく、在庫評価や原価計算でも力を発揮します。基本パターンは 「単価マスタ × 数量行列 = 金額の行列」 という形です。
倉庫別の在庫評価額を一括計算する
商品×倉庫の在庫数量と、商品別の単価マスタがあるとします。
単価マスタ(B2:B4、3×1)
| 商品 | 単価 |
|---|---|
| 商品A | 500 |
| 商品B | 800 |
| 商品C | 1200 |
倉庫別在庫数量(D2:F4、3商品×3倉庫)
| 商品 | 倉庫1 | 倉庫2 | 倉庫3 |
|---|---|---|---|
| 商品A | 100 | 80 | 50 |
| 商品B | 60 | 70 | 40 |
| 商品C | 30 | 20 | 25 |
倉庫別の在庫評価額を求めるには、単価ベクトルを転置して掛けます。
=MMULT(TRANSPOSE(B2:B4), D2:F4)
1×3 × 3×3 = 1×3 となり、横方向に3倉庫分の在庫評価額がスピルで返ります。倉庫が増えたら数量行列の右に列を足すだけで対応できます。
月別売上を時系列でまとめて出す
時系列の売上集計も同じパターンです。月別販売数量と単価マスタを用意します。
月別販売数量(A2:C7、6か月 × 3商品)
| 月 | 商品A | 商品B | 商品C |
|---|---|---|---|
| 1月 | 10 | 5 | 3 |
| 2月 | 12 | 4 | 4 |
| 3月 | 8 | 6 | 2 |
| 4月 | 15 | 3 | 5 |
| 5月 | 11 | 5 | 3 |
| 6月 | 14 | 7 | 4 |
=MMULT(A2:C7, 単価マスタ[単価])
6か月分の売上合計が縦方向にスピルします。月次レポートで「先月の数字を入れただけで全体が更新される」状態を作れるので、毎月の集計作業を一気にラクにできますよ。
期間×単価変動を組み合わせるときの注意
商品の単価が月によって変動する場合は、単価表も「商品×月」の2次元になります。同じ「商品×月」の販売数量行列と組み合わせて売上を出したいとき、行列積では次元が合わないため、要素ごとの積を合計するほうが素直です。
=SUMPRODUCT(単価行列, 数量行列)
このケースは SUMPRODUCT関数 のほうが直感的に書けます。「次元が合うときはMMULT、要素ごとに対応する単価がある場合はSUMPRODUCT」と覚えておくと迷いません。
よくある疑問(FAQ)
Q. MMULT関数はExcelのどのバージョンから使えますか?
MMULT関数は旧バージョンのExcelから使える古くからある関数です。Excel 2007、2010、2013、2016でも使えます。スピル(自動展開)はExcel 2019・Microsoft 365からの機能ですが、CSE配列数式(Ctrl+Shift+Enter)でExcel 2016以前でも同等の結果が得られます。
Q. 配列定数でもMMULTは使えますか?
はい。セル範囲だけでなく、{1,2,3;4,5,6} のような配列定数を直接引数に渡すこともできます。
=MMULT({1,2;3,4}, {5,6;7,8})
ただし、数式が読みにくくなるためセル範囲を使うほうが管理しやすいです。
Q. 行列が正方形でなくてもMMULTは使えますか?
はい。「配列1の列数 = 配列2の行数」であれば、正方行列(m×m)でなくても使えます。たとえば3×2の行列と2×4の行列は3×4の結果を返します。正方形でないケースのほうが実務では多いので、「列数と行数が合っているか」だけを確認する習慣をつけておきましょう。
よくあるエラーと対処法
| エラー | 原因 | 対処法 |
|---|---|---|
#VALUE! | 配列1の列数と配列2の行数が一致しない | 行列の次元を確認する(m×n と n×p の形) |
#VALUE! | 配列に文字列・論理値・空白が含まれている | 範囲内のセルが全て数値か確認する |
#NUM! | MINVERSEで行列式が0の逆行列を計算しようとした | 事前にMDETERM関数で0でないことを確認する |
#SPILL! | スピル展開先のセルにデータがある | 展開先の範囲を空にしてから再実行する |
#VALUE!が出たときの確認手順
- 配列1のサイズ(行数×列数)を確認する(
=ROWS(配列1)と=COLUMNS(配列1)を使うと簡単) - 配列2のサイズを確認する(
=ROWS(配列2)と=COLUMNS(配列2)) - 配列1の列数 = 配列2の行数になっているか確認する
- 範囲内に数値以外が混入していないか確認する(ISNUMBER関数で一括チェックできる)
=SUMPRODUCT(1-ISNUMBER(B2:D4)) → 0なら全て数値、1以上なら非数値が混在
このチェック数式で非数値の混入を事前に確認してからMMULTを実行すると、エラーの原因を素早く特定できます。
最小二乗法(線形回帰)への応用
MMULTとMINVERSE・TRANSPOSEを組み合わせると、回帰分析の核である 最小二乗法(OLS) をExcelの数式だけで実装できます。OLS推定量は β = (X’X)⁻¹X’y という行列式で表され、これをそのまま数式に置き換えるだけです。
たとえば売上(目的変数 y)を広告費と価格(説明変数)から予測したいとします。設計行列 X は「切片用の1の列・広告費の列・価格の列」の3列で作ります。サンプルが5件なら 5×3 の行列になります。
| 切片 | 広告費 | 価格 |
|---|---|---|
| 1 | 50 | 300 |
| 1 | 80 | 280 |
| 1 | 60 | 310 |
| 1 | 100 | 260 |
| 1 | 70 | 290 |
切片の列を必ず先頭に置くのがポイントです。これを忘れると回帰直線が原点を通る前提になり、係数がずれます。設計行列 X を A2:C6、売上 y を E2:E6 とすると、回帰係数は次の1本で求まります。
=MMULT(MMULT(MINVERSE(MMULT(TRANSPOSE(X), X)), TRANSPOSE(X)), y)
実際の範囲を当てはめると次のようになります。
=MMULT(MMULT(MINVERSE(MMULT(TRANSPOSE(A2:C6), A2:C6)), TRANSPOSE(A2:C6)), E2:E6)
結果は3行のスピルで、上から「切片・広告費の係数・価格の係数」が返されます。
同じ係数は LINEST関数 でも一発で取得できます。実務で結果だけ欲しいならLINESTが手軽です。一方MMULT版は X’X(情報行列)やその逆行列といった中間行列を別セルに展開して確認できるため、計算過程を理解したいときや独自にカスタマイズしたいときに向いています。
' 中間行列を確認する例
G1: =MMULT(TRANSPOSE(A2:C6), A2:C6) ← X'X(3×3)
G5: =MINVERSE(G1#) ← (X'X)⁻¹
LINESTがブラックボックスなのに対し、MMULT版は各ステップが見える「ガラス張りの回帰」と言えます。
SEQUENCE関数で単位行列を作成・逆行列を検証する
Microsoft 365 の SEQUENCE関数 を使うと、任意サイズの 単位行列(対角成分が1、それ以外が0の正方行列)を数式1本で作れます。
=IF(SEQUENCE(n,,1,0)=TRANSPOSE(SEQUENCE(n,,1,0)), 1, 0)
縦方向の連番と横方向の連番が一致するセル(=対角線)だけ1になる仕組みです。n に3を入れると次の3×3単位行列がスピルします。
| 1 | 0 | 0 |
|---|---|---|
| 0 | 1 | 0 |
| 0 | 0 | 1 |
これはMINVERSEの検証に役立ちます。理論上、行列とその逆行列の積は単位行列になるため、次の数式で逆行列が正しく求まっているか確認できます。
=MMULT(A1:C3, MINVERSE(A1:C3)) ← 単位行列に近づけば逆行列は正常
ただし結果は浮動小数点演算のため、対角成分が「0.9999999」、非対角成分が「1.2E-16」のようにわずかな誤差を含むことがあります。完全な0・1にならなくても計算は正常なので、=ROUND(結果, 10) で丸めて確認すると判断しやすくなります。
BYROW・MAKEARRAY との組み合わせ(Microsoft 365 専用)
Microsoft 365 のラムダ系関数 BYROW関数 や MAKEARRAY関数 とMMULTを組み合わせると、より柔軟な行列処理が書けます。
BYROWは各行に同じ処理を適用する関数です。各行と固定の重みベクトル weights(縦ベクトル)の内積を行ごとに計算するなら、次のように書けます。
=BYROW(B2:D10, LAMBDA(row, MMULT(row, weights)))
ただしこの計算は =MMULT(B2:D10, weights) という1本のMMULTでも同じ結果が得られ、しかもこちらの方が高速です。BYROWは「行ごとに条件分岐したい」など内積以外の処理を挟むときに価値が出ます。
MAKEARRAYは行番号・列番号から要素を生成する関数で、テスト用の行列をその場で作るのに便利です。たとえば数値計算で逆行列が不安定になる例として有名なヒルベルト行列(要素が 1/(r+c-1))は次のように生成できます。
=MAKEARRAY(3, 3, LAMBDA(r,c, 1/(r+c-1)))
生成したヒルベルト行列をMMULTやMINVERSEに渡せば、悪条件行列での誤差の出方を手軽に検証できます。
FILTER 関数と組み合わせた条件付き行列計算(Microsoft 365)
Microsoft 365 の FILTER関数 を使うと、条件に合う行だけを抽出してから MMULT に渡すことができます。「特定の部署・商品カテゴリ・期間だけを対象に行列計算したい」というときに役立ちます。
例:特定部署の社員だけ加重評価スコアを算出する
A列に部署名、C〜E列に評価スコア(業績・スキル・行動指針)、G2:G4 に縦ベクトルの重み(0.5 / 0.3 / 0.2)が入っているとします。「営業部門だけ」の加重スコアを求めるには次のように書きます。
=MMULT(FILTER(C2:E10, A2:A10="営業"), G2:G4)
FILTER で抽出した「営業部門の社員×3列」の部分行列にそのまま MMULT を掛けるだけで、営業部門の全社員の加重スコアが縦方向にスピルします。部署名を変えれば別部門に即対応でき、対象人数が増えても数式を書き直す必要がありません。
対象者が0人のときの #CALC! エラーを防ぎたい場合は IFERROR でラップします。
=IFERROR(MMULT(FILTER(C2:E10, A2:A10="営業"), G2:G4), "対象者なし")
同じパターンは「特定の商品カテゴリだけ売上集計したい」「選択した期間だけ原価計算したい」など、フィルター後の部分行列に対して行列演算したい場面全般に応用できます。
Power Query / Power Pivot とMMULTの使い分け
データが数千行を超えてくると「MMULTのままでいいのか、Power QueryやPower Pivotに移したほうがいいのか」と迷う場面が出てきます。実務で迷ったときの判断軸を整理しておきます。
判断のものさし
| 観点 | MMULT が向いている | Power Query / Power Pivot が向いている |
|---|---|---|
| 必要な計算 | 行列の積そのもの(連立方程式・回帰係数・加重スコア) | SUM・AVERAGE・COUNTで分解できるピボット型集計 |
| データ件数 | 数十〜数百行が中心 | 数千〜数百万行 |
| 集計の更新頻度 | シートを開いたら即時計算したい | 元データ更新後に「更新ボタン」で取り込む運用でOK |
| シートの共有相手 | Excelに慣れた担当者・自分専用 | 非エンジニアでも触れるダッシュボードにしたい |
「商品×店舗の売上合計を一覧で出すだけ」なら、Power Queryでクエリを作っておいたほうが保守しやすいケースが多いです。一方で「重み付き評価」「連立方程式の解」「最小二乗法の係数」など、行列演算そのものが目的なら、MMULTのままが最速・最短です。
MMULTからPower Queryに移すサイン
次のような兆候が出てきたら、Power Query や Power Pivot への切り替えを検討してみてください。
- MMULTを含むシートを開くだけで体感で重い(再計算に数秒以上かかる)
- 元データが別ファイル・別システムからの取り込みで、毎回コピペしている
- 計算式が10段以上ネストして、誰も触れなくなりつつある
- 集計の単位(店舗別・月別・カテゴリ別)を頻繁に切り替えたい
逆に、上記が無ければMMULTで戦い続けるほうがメンテも軽く、シート1枚で完結する分かりやすさがあります。「MMULTで限界を感じてから移行する」くらいの感覚でちょうどよいでしょう。
まとめ
MMULT関数のポイントをまとめます。
- 構文:
=MMULT(配列1, 配列2)で行列の積を計算する - 条件: 配列1の列数と配列2の行数が一致していること(m×n と n×p の形)
- スピル: Excel 2019以降はスピルで自動展開。旧Excelで使っていたCSE配列数式(Ctrl+Shift+Enter)からの移行も容易
- 連立方程式:
=MMULT(MINVERSE(係数行列), 右辺ベクトル)で解ける - 実務活用: 複数商品×複数店舗の売上合計、重み付き平均、加重スコア算出などに使える
- エラー: 次元の不一致と非数値の混入が主な原因
MMULT関数は少し数学的な背景が必要ですが、「複数の掛け算の合計を一括で求める」というシンプルな使い方から始めると理解しやすいです。慣れてくると、SUMPRODUCT関数よりもすっきりした数式で複雑な集計を組めるようになりますよ。
注意事項と使い上のポイント
大きな行列では処理速度に注意
MMULT関数は行列全体を一括計算するため、非常に大きな配列(数百行×数百列)を扱うと計算に時間がかかることがあります。通常の業務データなら問題になりません(数十〜百行程度なら即時計算)が、数千行以上のデータを何十回もMMULTに渡すようなシートでは、揮発性の関数(TODAY、INDIRECT、OFFSETなど)の使用を避けて再計算を最小限に抑えるとパフォーマンスが改善します。
数式を保護する場合はセルのロックを活用する
スピルで展開された結果セルは「スピル参照(#演算子)」でアクセスできます。
=C1# ← C1にMMULTの数式があれば、スピル全体を参照する
スピル展開先のセルを誤って上書きすることを防ぐには、スピル元のセルだけを編集可能にして残りをロックする方法が有効です。シートを他の人と共有する場合に設定しておくと安心です。