Excelで月別データをSUMIFSで集計していると、「今月はD列、来月はE列…」のように合計範囲だけ毎回書き換える作業が地味に面倒です。この記事では、月が変わっても数式を直さずに、1列だけの結果欄に“その月の合計”を自動(またはワンクリック級の操作)で切り替えて表示する実務的な方法を、具体例と落とし穴込みで解説します。
SUMIFSの「合計範囲」が固定だと、毎月の運用が破綻しやすい
月別の数値が横方向(列)に並ぶ表は、現場でよく見かけます。たとえば D列が1月、E列が2月…という形で、月が進むごとに「集計対象の列だけ」を変えたいケースです。
ところがSUMIFSは、典型的に次のような数式になりがちです。
=SUMIFS($D$6:$D$16, $C$6:$C$16, L6)
このままだと、月が変わるたびに合計範囲だけを手で D→E→F… と書き換える必要があります。数式が1個ならまだしも、集計行が何十行もあると、次のような事故が起きやすくなります。
- D列だけ直して、E列が残っていた(集計が月混在)
- $(絶対参照)の付け忘れで、どこかの行だけ範囲がズレた
- コピーで別の条件範囲も動いてしまい、原因不明のズレが発生
狙うべきは、「結果の表示列はそのまま」「集計する月だけを切り替える」運用です。ここを仕組み化すると、月次作業のストレスが一気に減ります。
結論:SUMIFSの合計範囲だけをINDEXで“月に応じて差し替える”
最も扱いやすい基本方針はこれです。
- 月別の全データをひとまとめの範囲(例:
$D$6:$J$16)として持つ - 「何月を集計するか」を示す番号(例:1=1月、2=2月…)をセルに入れる
- INDEXで、その月番号に一致する“1列ぶん”だけを取り出してSUMIFSへ渡す
これにより、SUMIFSの形はほぼ変えずに、合計範囲だけが自動で切り替わります。
まずはこれだけ:INDEX×SUMIFSの完成形(1列結果で月だけ切り替え)
前提を、質問内容に合わせて整理します。
- 月別データ範囲:
$D$6:$J$16(D=1月、E=2月…J=7月の例) - コードなどの条件範囲:
$C$6:$C$16 - 集計したいコード:
L6(結果行ごとに変わる想定) - 月番号を入力するセル:
$L$1(1,2,3…)
=SUMIFS(
INDEX($D$6:$J$16, 0, $L$1),
$C$6:$C$16, L6
)
この式のキモは、SUMIFSの「合計範囲」にINDEXを入れている点です。
なぜこれで“列だけ”切り替わるのか(噛み砕き)
INDEX($D$6:$J$16, 0, $L$1) は、次の意味になります。
$D$6:$J$16:月別データが全部入った「大きなひとかたまり」- 行番号に
0:その列の“全行”を返す(6〜16行ぶんを丸ごと返す) - 列番号に
$L$1:L1が1ならD列、2ならE列…というように列を選ぶ
つまり、L1を変えるだけで「SUMIFSが足し算する列」がD→E→F…と自動で切り替わります。結果の表示列はずっと同じ場所のままなので、運用も安定します。
月番号と列の対応表(例:D〜Jが1〜7月)
| 月番号(L1) | 集計対象の列 | 合計範囲の実体 |
|---|---|---|
| 1 | D列(1月) | D6:D16 |
| 2 | E列(2月) | E6:E16 |
| 3 | F列(3月) | F6:F16 |
| … | … | … |
| 7 | J列(7月) | J6:J16 |
もし12か月分あるなら、範囲を $D$6:$O$16 のように12列分に広げるだけで考え方は同じです。
実務で迷わない導入手順(そのまま真似できる)
手順1:月番号セル(L1)を用意する
まず、どこでもいいので「集計したい月番号」を置くセルを決めます。例としてL1にします。ここに 1,2,3… を入れると、集計対象が切り替わります。
おすすめは、入力ミスを防ぐためにデータの入力規則(プルダウン)を付けることです。
- L1を選択
- データ → データの入力規則
- 入力値の種類:リスト
- 元の値:
1,2,3,4,5,6,7(12か月なら1〜12)
これで「8を入れて#REF!」みたいな事故を減らせます。
手順2:月別データ範囲は“ひとかたまり”で固定する
合計範囲にする部分は、D〜J(例)をまとめた範囲にします。範囲の上下(6〜16行)も、条件範囲と揃えるのが重要です。
- 月別データ:
$D$6:$J$16 - 条件のコード列:
$C$6:$C$16
SUMIFSは「合計範囲」と「条件範囲」の行数が一致していないと正しく集計できません。INDEXで列を切り出す方式でも、ここは同じルールです。
手順3:結果列に式を入れて、下へコピーする
集計結果を出したい列(例:M6)に式を入れ、必要な行数ぶん下へコピーします。
=SUMIFS(
INDEX($D$6:$J$16, 0, $L$1),
$C$6:$C$16, L6
)
コピーに強くするコツは、範囲は$で固定し、条件セル(L6など)は相対参照のままにすることです。これで各行が自分のコードを見て集計してくれます。
条件が複数でも同じ:SUMIFSの条件を増やすだけ
現場では「コード一致だけ」より、担当者・部署・区分・ステータスなど複数条件が当たり前です。INDEXで可変にするのは合計範囲だけなので、条件はいつも通り増やせます。
例:コード(C列)に加えて、部署(B列)がM2と一致するものだけ集計したい場合
=SUMIFS(
INDEX($D$6:$J$16, 0, $L$1),
$C$6:$C$16, L6,
$B$6:$B$16, $M$2
)
ポイントは、どれだけ条件を足しても、可変なのは合計範囲(INDEX部分)だけということです。月別集計の自動切り替えが“崩れない”のがこの方式の強みです。
月の切り替えを“自動化”したい:MONTH(TODAY())の使いどころと注意点
「L1の数字を変えるのすら面倒」「常に今月だけ出ればいい」という運用なら、L1に次の式を入れる方法があります。
=MONTH(TODAY())
これでPCの日付に連動して、今月(1〜12)が自動で入ります。月次集計の更新漏れが起きにくくなるのがメリットです。
注意点:D〜Jが“7か月分”だと、8月以降に壊れる
もし月別データがD〜J(7列)しかないのに、L1が8〜12になると、INDEXが範囲外の列を指定してしまい #REF! になります。対策は2つあります。
- 12か月分ある範囲(例:
$D$6:$O$16)にしておく - 月番号を、範囲内に丸める(例:7で止める)
「今年は7月までしか入っていない」など部分期間の表なら、次のようにして範囲外を防ぐ方法が現実的です。
=MIN(MONTH(TODAY()), COLUMNS($D$6:$J$16))
これをL1に入れると、月が8月でも「今ある列数(7)」を超えないように自動調整できます。
注意点:年度(4月始まり)など“列の並びが1月起点でない”場合
もしD列が4月、E列が5月…のように年度起点で並んでいるなら、MONTH(TODAY())をそのまま使うとズレます。例えば4月始まり(D=4月)なら「今年の4月を1として扱う」変換が必要です。
例:D列=4月を「1」とする列番号(1〜12)を作る
=MOD(MONTH(TODAY())-4, 12)+1
この式は、4月→1、5月→2…、3月→12 のように年度並びに合わせて月番号を作れます。表が年度運用の会社だと、ここを合わせるだけで一気に現場で使いやすくなります。
月番号ではなく「1月」「2月」で選びたい:見出し行×MATCHでさらに堅牢に
月番号(1,2,3…)は軽くて便利ですが、「人が見る運用」だと “何が何月か分かりやすい” ことも大事です。そこでおすすめなのが、列見出し(D5:J5など)に「1月」「2月」…が入っている前提で、MATCHで列番号を求めるやり方です。
前提例:
- D5:J5 に
1月,2月,3月,...の見出し - L1 にも
3月のように月名を入力(プルダウン推奨)
=SUMIFS(
INDEX($D$6:$J$16, 0, MATCH($L$1, $D$5:$J$5, 0)),
$C$6:$C$16, L6
)
この方式の強みは、列の追加や並び替えが入っても「見出しを見て列を選ぶ」ため、ズレにくいことです。月別集計の自動切り替えを“より事故りにくく”したい場合に効きます。
見出し運用の小技:月選択をプルダウン化する
L1を手入力にすると「3月」「3月(全角)」「Mar」など表記ゆれが起きます。D5:J5と同じ値を選べるように、L1に入力規則(リスト)を設定して、元の値を $D$5:$J$5 にすると確実です。
“簡単な操作”で切り替えたいなら:スピンボタン(フォームコントロール)が便利
「L1を手で打ち替えるのではなく、上下ボタンで月を進めたい」という場合、Excelのフォームコントロール(スピンボタン)を使うと、かなり実務向きになります。
- 開発タブ → 挿入 → スピンボタン(フォームコントロール)
- シートに配置
- 右クリック → コントロールの書式設定
- 最小値:1、最大値:12(または列数)、増分:1
- リンクするセル:L1
これでL1がボタン操作で1→2→3…と変わり、SUMIFSの月別集計も即座に切り替わります。月次報告の確認や会議中の「先月は?」「今月は?」の切り替えが速くなるので、意外と喜ばれます。
Excelテーブル(ListObject)にしておくと、行追加に強くなる
元データが増えていく運用なら、範囲参照よりテーブル化がおすすめです。テーブルにすると、行追加しても参照が自動で伸びるため、月別集計の自動切り替えと相性が良いです。
例として、データ全体をテーブル化してテーブル名を tblData にし、列として「コード」「1月」「2月」…があるイメージです。
列番号(L1)で切り替えるなら、月列のまとまりをテーブル参照でまとめます。
=SUMIFS(
INDEX(tblData[[1月]:[7月]], 0, $L$1),
tblData[コード], L6
)
テーブル参照は見た目が少し長くなりますが、「どの列を見ているか」が明確で、後から修正する人にも優しいのが利点です。
Microsoft 365ならCHOOSECOLSも覚えておくと強い
環境がMicrosoft 365で使えるなら、列を取り出すのに CHOOSECOLS を使う選択肢もあります(考え方はINDEXと同じで、合計範囲を1列にする)。
=SUMIFS(
CHOOSECOLS($D$6:$J$16, $L$1),
$C$6:$C$16, L6
)
INDEXの「行番号0」仕様に馴染みがない人がいる場合、CHOOSECOLSのほうが意図が伝わりやすいことがあります。
よくあるエラーと原因:月別集計がズレる/#REF!になるときのチェック表
| 症状 | よくある原因 | 対策 |
|---|---|---|
| #REF! が出る | L1の月番号が、$D$6:$J$16 の列数を超えている | 範囲を12か月分に広げる/L1に入力規則を付ける/L1をMINで丸める |
| 集計が合わない | 合計範囲と条件範囲の行数が一致していない | $D$6:$J$16 と $C$6:$C$16 の行数を揃える(開始行・終了行も一致) |
| 一部の行だけズレる | $(絶対参照)の付け忘れで範囲がコピー時に動いている | 範囲参照は基本的に$で固定し、条件セルだけ相対参照にする |
| 結果が0になる | 条件(コード)が見た目は同じでも、空白や全角半角違いで一致していない | TRIM/CLEANで整形、または入力規則で表記ゆれを抑える |
| MATCHで#N/A | 見出し(D5:J5)と月選択セル(L1)の表記が一致していない | L1を見出し行からのプルダウンにする/表記統一(例:すべて「1月」) |
読みやすく保守しやすい形:LETで“数式を文章化”する(365向け)
INDEX×SUMIFSは強力ですが、数式が長くなると「何をしている式か」が伝わりにくくなります。Microsoft 365なら LET で変数化すると、同じ処理でも読みやすく保守しやすい式になります。
=LET(
m, $L$1,
months, $D$6:$J$16,
code_rng, $C$6:$C$16,
code, L6,
SUMIFS(INDEX(months, 0, m), code_rng, code)
)
「月別範囲」「月番号」「コード範囲」などが名前で見えるので、後任者が触るExcelでも事故が減ります。月別集計の自動切り替えをチーム運用するなら、LETはかなり効きます。
別解はあるが、INDEX方式が選ばれる理由(比較表)
「列を動的に切り替える」方法はINDEX以外にもあります。ただし、実務では安定性・速度・壊れにくさの観点でINDEXが第一候補になりやすいです。
| 方法 | 実現イメージ | メリット | 注意点 |
|---|---|---|---|
| INDEX(推奨) | 大きい範囲から列だけ取り出す | 高速で安定、参照が壊れにくい、保守しやすい | 「行番号0」の仕様を知らないと最初だけ戸惑う |
| CHOOSECOLS(365) | 列番号で列を選択 | 意図が直感的、動的配列と相性良い | 利用できない環境がある |
| OFFSET | 列をずらして参照 | 考え方はシンプル | 揮発関数で重くなりやすい(大量式だと顕著) |
| INDIRECT | 文字列から参照を作る | 柔軟に見える | 揮発関数で重い/参照先の列挿入に弱い/構造が壊れやすい |
月次で更新し続けるシートほど、「軽さ」と「壊れにくさ」が効いてきます。SUMIFSの月別集計を自動切り替えしたいなら、まずはINDEX(または365ならCHOOSECOLS)を選ぶのが堅実です。
そもそもの改善案:月別が列に並ぶより、縦持ちの方が強い場面もある
ここまでの方法は「月別がD〜Jの列に入っている」前提で、今ある表を活かして運用をラクにする解決策です。一方で、データが増えていく・年をまたぐ・月が12列を超える…という運用では、次のようにデータ構造を見直すと根本的に楽になることがあります。
- 列:コード/日付(または月)/値 の縦持ち(正規化)にする
- 集計はSUMIFSで日付条件(例:月初〜月末)を使う、またはピボットテーブルで月別集計する
- 既存の横持ち表はPower Queryで「列のピボット解除(アンピボット)」して縦持ちへ変換できる
ただ、すぐに表の形を変えられない現場も多いはずです。その場合は、まずINDEX×SUMIFSで「毎月の列書き換え」を無くし、時間ができたタイミングで縦持ち化やPower Query化を検討する、という進め方が現実的です。
まとめ:月別集計の自動切り替えは「合計範囲だけ可変」が最短で安全
- SUMIFSの形は崩さず、合計範囲だけをINDEXで差し替えると月別集計が自動切り替えできる
- 月番号をセル(L1)で管理すれば、結果列は1列のまま運用できる
- 月の指定は「番号」でも「1月」表記でもOK。現場の運用に合わせて選ぶ
- 入力規則やスピンボタンで、切り替え操作をさらに簡単にできる
- エラーの多くは「列番号の範囲外」か「範囲サイズ不一致」。チェック表で潰す
月次のたびにD6:D16をE6:E16へ…と書き換える作業は、仕組みに置き換えられます。INDEXを1回組み込むだけで、SUMIFSの月別集計は「更新が楽で、壊れにくい」形に変わります。

コメント