
まず30秒で判定|あなたの「合計範囲を可変にしたい」はどっち?
SUMIFの合計範囲(3番目の引数)を可変にしたいケースは、大きく2つに分かれます。やりたいことを先に決めると、迷わず最短の数式にたどり着けます。
| やりたいこと(症状) | パターン | 最短の答え |
|---|---|---|
| 選んだ項目に応じて、合計する「列」を切り替えたい(例:「売上個数」「金額」をドロップダウンで選ぶ) | パターンA(横方向) | INDEX+MATCHで合計範囲の列を可変にする → パターンAへ |
| データを追加するたびに、合計する「行」を自動で増やしたい(毎回数式を直したくない) | パターンB(縦方向) | テーブルまたは列全体参照で行を可変にする → パターンBへ |
どちらの場合も、つまずきの正体は同じ1点に集約されます。SUMIFの合計範囲は「左上のセル」を起点に自動調整されるという仕様です。これを知らずに可変化すると、エラーすら出ずに金額が静かにズレます。先に答えを出してから、この仕組みをつまずきポイントで押さえます。

実際に動かしながら確認したい方のために、この記事で使用したサンプルExcelファイルを無料でダウンロードできます。INDEX+MATCH版・OFFSET版の両方を収録しているので、そのまま数式を書き換えながら試せます → sumif-可変 sampleファイル
パターンA|合計する「列」を切り替える(横方向に可変)
次のような表で考えます。A列に商品、B〜D列に「売上個数・売上件数・金額」が並んでいます。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 商品 | 売上個数 | 売上件数 | 金額 |
| 2 | りんご | 10 | 3 | 1500 |
| 3 | みかん | 20 | 5 | 3000 |
| 4 | りんご | 15 | 4 | 2250 |
ここで「F2に商品名(条件)」「G1に合計したい列の見出し(金額など)」を入れると、選んだ列だけを合計したい——というのがパターンAです。
推奨:INDEX+MATCHで合計範囲の列を可変にする
もっとも軽くて壊れにくいのが、INDEXとMATCHの組み合わせです。結果セルに次の数式を入れます。
=SUMIF($A$2:$A$100, $F$2, INDEX($B$2:$D$100, 0, MATCH($G$1, $B$1:$D$1, 0)))分解するとこうなります。
MATCH($G$1, $B$1:$D$1, 0)=見出し行から「G1で選んだ列が左から何番目か」を返す(金額なら3)。INDEX($B$2:$D$100, 0, 3)=行番号に0を指定するとその列全体(この場合D2:D100)を合計範囲として返す。- 結果として、F2の条件に一致する行だけ、選んだ列を合計します。
INDEXとMATCHはどのバージョンのExcelでも使え、後述のOFFSETと違って揮発性関数ではないため、表が大きくても動作が重くなりにくいのが利点です。
別解:OFFSET+MATCHでも可変にできる(揮発性に注意)
検索すると多く出てくるのがOFFSETを使う方法です。考え方は同じですが、OFFSETの起点を「条件範囲そのもの」に合わせるのがコツです。
=SUMIF($A$2:$A$100, $F$2, OFFSET($A$2:$A$100, 0, MATCH($G$1, $B$1:$D$1, 0)))- OFFSETの基準を
$A$2:$A$100(=条件範囲)にすることで、起点の行と高さが条件範囲と必ず一致します。後述の「起点ズレ」事故を防げます。 - 列方向に
MATCH(...)列ぶんずらすことで、合計する列を切り替えます(A列から3列右=D列)。
ただしOFFSETは揮発性関数で、ブック内のどこかを変更するたびに再計算されます。数式が増えると重くなりやすいので、上のINDEX+MATCHを基本にし、OFFSETは既存ファイルの修正など限定的に使うのがおすすめです。
なぜ列をずらしてもズレないのか(SUMIFの「左上基準」仕様)
ここがこの記事の肝です。SUMIFの合計範囲は、指定した範囲をそのまま使っているわけではありません。Microsoftの公式ヘルプは、合計対象範囲は条件の範囲と同じサイズ・形状にすべきで、そうでない場合は合計対象範囲の「最初のセル(左上)」を起点に、条件の範囲と同じ大きさのセル範囲を合計すると説明しています(SUMIF 関数|Microsoft サポート)。
つまりSUMIFが本当に見ているのは、合計範囲の左上セルの位置と、条件範囲の大きさだけです。だから上の数式では「列を切り替える=左上セルを別の列に移す」だけでよく、高さは条件範囲側が決めてくれるため自動でそろうのです。
パターンB|データが増えても自動で合計する(縦方向に可変)
「行を追加するたびにSUMIFの範囲を直すのが面倒」という場合は、こちらです。行方向に自動で伸びる仕組みを使います。
推奨:テーブルにして構造化参照で可変にする
もっとも管理が楽で壊れにくいのがテーブル機能です。データ範囲を選び、Ctrl + Tでテーブルに変換します(または[挿入]→[テーブル])。テーブル名を「売上」とすると、数式はこうなります。
=SUMIF(売上[商品], "りんご", 売上[金額])- テーブルの最終行のすぐ下にデータを追加すると、テーブルが自動拡張し、SUMIFの範囲も自動で伸びます。数式の修正は不要です。
- 列名(構造化参照)で書けるので、列の挿入・並べ替えにも強く、数式が読みやすくなります。
- 揮発性関数を使わないため、動作も軽快です。
手軽:列全体を参照して可変にする
「とりあえず一番簡単に済ませたい」なら、列全体を参照する方法があります。
=SUMIF(A:A, "りんご", D:D)- A列・D列まるごとを参照するため、下に行を追加すれば自動で合計に含まれます。
- 条件範囲も合計範囲も同じ「列全体」なので、サイズ・形状が一致し、前述の起点ズレも起きません。
- 見出し(A1の「商品」)は条件に一致しないため合計に影響せず、D1の文字列も数値以外として無視されます。
注意点として、列全体参照は1列まるごとを評価対象にするため、SUMIFを大量に並べる超大規模シートでは速度面で不利になることがあります。その場合はテーブルか、行数を見込んだ範囲指定(例:A2:A100000)に切り替えてください。
旧ファイル向け:OFFSET+COUNTAで可変の名前を作る
テーブルにできない事情がある古いブックでは、名前の定義で可変範囲を作る方法もあります。[数式]→[名前の定義]で次のように設定します。
合計範囲 = OFFSET($D$2, 0, 0, COUNTA($A:$A)-1, 1)そのうえで、=SUMIF($A$2:$A$100, "りんご", 合計範囲)のように使います。COUNTAで実データの行数を数え、その高さぶんだけ範囲を伸ばす仕組みです。ただしOFFSETは揮発性で、空白セルが混ざると行数がズレやすいので、可能ならテーブルを優先してください。
つまずきポイントと回避策(公開前チェックリスト)
① 合計範囲の「起点ズレ」でこっそり誤集計する(最重要)
前述のとおり、SUMIFは合計範囲の左上セルの位置を起点に、条件範囲と同じ大きさを合計します。可変化のときにOFFSETやINDEXの起点を1行ずらしてしまうと、たとえば条件範囲がA2始まりなのに合計範囲がD3始まりになり、合計が1行分ずれます。このとき数式はエラーを出しません。値だけが静かに狂うので、最も危険です。回避策はシンプルで、合計範囲の起点(左上)の行を、条件範囲の起点とそろえること。パターンAでOFFSETの基準を条件範囲そのものにしたのは、このためです。
② SUMIFSは大きさ不一致だと#VALUE!で止まる(使い分け)
同じ可変化でも、複数条件のSUMIFSは挙動が異なります。SUMIFSはすべての範囲の行数・列数が一致していないと#VALUE!エラーになります(SUMIF/SUMIFS関数の#VALUE!エラー|Microsoft サポート)。エラーで止まる方が誤集計より気づきやすいともいえます。可変範囲を使うときは、SUMIF=静かにズレる/SUMIFS=はっきりエラー、と覚えておくと事故を防げます。
③ OFFSETの多用で重くなる
OFFSETは揮発性関数で、再計算のたびに評価されます。可変範囲を多数のセルでOFFSETで作ると、ブック全体が重くなります。列の切り替えはINDEX+MATCH、行の自動拡張はテーブルへ寄せると軽くなります。
④ バージョンによる使用可否
| 方法 | 使えるバージョン |
|---|---|
| SUMIF / INDEX / MATCH / OFFSET / テーブル | Excel 2016・2019・2021・2024・Microsoft 365 いずれも可 |
| FILTERなどスピル系での代替(後述のFAQ参照) | Microsoft 365・Excel 2021・2024 のみ(2019以前は不可) |
数式チェックに使うキー(補足リファレンス)
| キー | 用途 |
|---|---|
| F9(数式内で範囲を選択して押す) | その部分の計算結果を一時表示。INDEXやOFFSETが返している範囲を確認できる |
| F4 | 参照の絶対/相対を切り替え($の付け外し) |
| Ctrl + T | 選択範囲をテーブルに変換 |
よくある質問(FAQ)
Q. SUMIFSで合計範囲を可変にするには?
考え方はSUMIFと同じで、INDEX+MATCHやOFFSETで合計対象範囲を作って渡します。ただしSUMIFSは全範囲の大きさが一致しないと#VALUE!になるため、可変にした合計対象範囲の行数を条件範囲とぴったりそろえる必要があります。INDEXで列全体を返す場合は、条件範囲も同じ行範囲で指定してください。
Q. 列を選ぶドロップダウンはどう作る?
合計列を選ぶセル(例:G1)を選択し、[データ]→[データの入力規則]→「リスト」で、見出し行=$B$1:$D$1を指定します。これで「売上個数/売上件数/金額」から選べるようになります。
Q. 合計範囲だけ可変にして、条件範囲は固定でいい?
問題ありません。むしろ推奨です。SUMIFは条件範囲の大きさに合わせて合計範囲を評価するため、条件範囲を固定しておけば、合計範囲の起点だけを正しく指定すればズレを防げます。
Q. スピルで関数を使わずに代替できる?
Microsoft 365・Excel 2021/2024なら、FILTERで条件抽出してからSUMする書き方(例:=SUM(FILTER(D2:D100, A2:A100="りんご")))でも可変集計ができます。可変の列はFILTERの対象列をCHOOSECOLSなどで切り替えます。ただし2019以前では使えないため、互換性を重視するなら本文のINDEX+MATCHやテーブルが無難です。
まとめ|最短の選び方
- 合計する列を切り替えたい →
SUMIF(条件範囲, 条件, INDEX(データ範囲, 0, MATCH(選んだ見出し, 見出し行, 0))) - データ追加で行を自動拡張したい → テーブルにして
SUMIF(テーブル[条件列], 条件, テーブル[合計列])、手軽に済ませるならSUMIF(A:A, 条件, D:D) - 可変化で一番怖いのは起点(左上)の行ズレによる静かな誤集計。合計範囲の起点を条件範囲とそろえれば防げます。
列の可変はINDEX+MATCH、行の可変はテーブル。この2つを押さえておけば、合計範囲が動く表でも数式を直し続ける作業から解放されます。












コメント