「複数商品の価格×数量の合計を店舗ごとに一括で計算したい」「連立方程式をExcelで解きたい」――行列計算が必要な場面で活躍するのが MMULT関数 です。
MMULT関数は2つの配列(行列)の積を計算します。手計算では面倒な行列の掛け算を一瞬で処理でき、MINVERSE・MDETERM関数と組み合わせれば連立方程式も解けます。一見むずかしそうですが、「複数の掛け算の合計を一括で求める」という使い方から始めると、意外と手軽に使えます。
「行列という言葉だけで敬遠していた」という方も、この記事で具体的な数式と実例を見れば、自分のシートに取り入れるイメージが持てるはずです。
この記事では行列計算の基礎から、スピル対応の使い方、SUMPRODUCT関数との違い、実務での活用例まで丁寧に解説します。
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)
人事部や管理職の方が評価集計シートを作るときに、このパターンを使うと一括更新できてメンテナンスが楽になりますよ。
よくある疑問(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関数のポイントをまとめます。
- 構文:
=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の数式があれば、スピル全体を参照する
スピル展開先のセルを誤って上書きすることを防ぐには、スピル元のセルだけを編集可能にして残りをロックする方法が有効です。シートを他の人と共有する場合に設定しておくと安心です。
