SUMIFS関数で月別集計を自動切り替えする方法|INDEXで合計範囲を可変にするExcel実務術

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)集計対象の列合計範囲の実体
1D列(1月)D6:D16
2E列(2月)E6:E16
3F列(3月)F6:F16
………
7J列(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の月別集計は「更新が楽で、壊れにくい」形に変わります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次