← 記事一覧へ戻る

ExcelのSUMIFは複数シートをまたげない|それでも条件集計する方法

SUMIFで複数シートを横断集計しようとするとエラーになります。シートが毎日増える管理表でも、各シートに集計用ブロックを仕込んで串刺しSUMする回避ワザを実例で解説。

日付ごと・案件ごとにシートを分けて経費を記録している管理表、ありますよね。あの管理表の月末の集計、どうしてますか?

シートを1枚ずつ開いて、電卓を叩いて、メモして、転記して……。時間はかかるし、シートが20枚もあればどこかで必ず集計ミスが起きます

実はExcelには、複数のシートをまとめて集計する方法があります。ただ、「種類ごとに分けて集計したい」のように条件をつけようとすると、とたんにややこしくなるんです(SUMIFで書くとエラーになります)。

僕も本業で「日付ごとにシートが増えていく経費記録」を月末にまとめる作業があって、この壁にぶつかりました。この記事では、僕が実際に組み込んだ 「各シートに答えを書かせて、串刺しで集める」回避ワザ を、手順つきで解説します。

一度仕組みを作れば、シートが増えても何もしなくていい集計表になりますよ🌱


この記事でわかること

  • なぜSUMIFは複数シートをまたげないのか(仕様の話)
  • 回避ワザ:「各シートに答えを書かせる」発想の転換
  • シートが増えても自動で集計に入る作り方(3ステップ)
  • 雛形シートに仕込んだ=TODAY()が引き起こす時限バグ(実体験)

まず知ってほしい:「串刺し計算」というワザ

月末にシートを1枚ずつ電卓で……をやっている人に、まず知ってほしいのがこれ。Excelには 「串刺し計算(3-D集計)」 という機能があります。複数のシートを 串でブスッと貫くように まとめて計算するイメージで、こう書きます。

=SUM('1日:31日'!B4)

たったこれだけで、「1日」シートから「31日」シートまでの全シートのB4をまとめて合計してくれます。シートを1枚ずつ開く作業から解放される、知る人ぞ知る機能です。

ただし:条件をつけると、とたんに無理になる

「じゃあ、種類ごとの集計もいけるでしょ」と思って SUMIF で書くと——

=SUMIF('1日:31日'!B3, "切手代", '1日:31日'!B4)   ← #VALUE! エラー

ダメなんです。串刺しに対応しているのは SUMCOUNTAVERAGE などの単純な集計だけで、SUMIF・COUNTIF・SUMIFSなどの「条件付き」は串刺し非対応。これはExcelの仕様で、書き方の工夫では突破できません。

「全部まとめての合計」はできるのに、「切手代だけの合計」はできない。ここで挫折する人が多いポイントです。でも、ちゃんと回避ワザがあります👇


発想の逆転:「各シートに、自分の答えを書かせる」

じゃあどうするか。考え方をひっくり返します。

集計シート側で条件判定するのが無理なら、各シートが「自分の分の答え」をあらかじめ書いておけばいい

発想の逆転:各シートが自分の答えを書き、集計シートは串刺しSUMで集めるだけ

各シートの隅っこに、こんな小さな表(集計用ブロック)を作っておきます。

  • 「このシートの日付が1日で、種類が切手代なら金額、違えば0」
  • 「このシートの日付が1日で、種類が宅配便なら金額、違えば0」
  • …(日付31日分 × 種類の数だけ)

すると、どのシートも該当する1マスにだけ金額が入り、残りは全部0になります。あとは集計シートから、そのマスを串刺しSUMするだけ。条件判定は各シートが済ませているので、集計側は単純なSUMで済む——これがこのワザの全貌です。


作り方(3ステップ)

例として、こんな管理表で説明します。

  • 日付ごとに記録シートを作る運用(実績がある日だけ。同じ日に2案件あれば2シート)
  • 各記録シートは B2に日付・B3に経費の種類・B4に金額
  • 「集計」シートに、B列=1日〜31日、3行目=経費の種類(切手代・宅配便・レターパック)のクロス表

Step1:記録シートの隅に「集計用ブロック」を作る

記録シートの右の方(例:G〜J列)に、こんなブロックを作ります。

  • H1:J1 に経費の種類(切手代・宅配便・レターパック)※集計シートの見出しと完全に同じ文字
  • G2:G32 に日にち(1〜31)
  • H2 に次の式を入れて、ブロック全体(H2:J32)にコピー
=IF(AND(DAY($B$2)=$G2, $B$3=H$1), $B$4, 0)

「このシートのB2の日付が左の日にちと一致して、B3の種類が上の見出しと一致したら、B4の金額。違えば0」という意味です。

記録シートの右側に作った集計用ブロックの例

作ったら、G〜J列ごと非表示にしておけば見た目もスッキリ。印刷範囲にも入りません。

Step2:集計シートから串刺しSUMする

集計対象のシートを、「開始」「終了」という空シートで挟みます(シートの並び順で挟むのがポイント)。集計シートの「1日×切手代」のマスにはこう書くだけ。

=SUM('開始:終了'!H2)

「2日×切手代」なら H3、「1日×宅配便」なら I2……と、対応する1マスを串刺しSUMするだけ。条件はもう各シートが判定済みなので、これで日付×種類のクロス集計が完成します。

Step3:雛形シートに仕込む(ここが一番おいしい)

新しい記録シートは、毎回ゼロから作らず雛形(テンプレ)シートをコピーして作りますよね。その雛形に集計用ブロックを仕込んでおくんです。

すると、新しいシートはコピーした瞬間から集計対応済み。さらに「開始」と「終了」の間に置きさえすれば、串刺しSUMが自動で拾ってくれます

シートが増えるたびに数式を直す必要、ゼロ。「仕組みは雛形に入れて、人は何も覚えなくていい」のがこの設計の一番の強みです。


【実体験】雛形の=TODAY()は時限バグになる

僕が実際にやらかしかけた話をひとつ。

雛形シートの日付欄に =TODAY()(今日の日付を自動表示する関数)が入っていました。新しいシートを作った日に見ると正しい日付なので、一見何も問題ない

でも =TODAY() は「開いた日」に変わり続けます。つまり、日付を手入力に直し忘れたシートは——

  • 6月5日に作ったシートなのに、6月11日に開くと「6月11日の経費」として集計される
  • 開く日によって、集計結果が毎日変わる

実際、僕のファイルでも数枚が =TODAY() のまま残っていて、集計がしれっとズレていました。怖いのはエラーが出ないこと。静かに、間違った場所に集計され続けます。

対策はシンプル👇

  • 雛形の日付欄は 空欄にしておく=TODAY()を入れない)
  • 集計用ブロックの式を「日付か金額が空なら0」にしておく(入れ忘れたら集計に出ないので、見れば気づける)
=IF(COUNT($B$2,$B$4)<2, 0, IF(AND(DAY($B$2)=$G2, $B$3=H$1), $B$4, 0))

「間違った場所に出る」より「出ないから気づける」方が、ずっと安全です。


よくある質問(FAQ)

Q1:INDIRECT関数でシート名のリストから集計する方法と何が違う?

その方法(シート名一覧を作ってINDIRECTで参照)もありますが、シートを作るたびに名前リストの更新が必要で、更新を忘れるとそのシートだけ集計から漏れます。本記事の方式は雛形に仕込むのでメンテナンスがゼロ。シートが増える運用なら串刺し方式が楽です。

Q2:新しいシートを追加したら何かやることは?

「開始」と「終了」の間に置く、それだけです。雛形をコピーして作れば集計用ブロックも付いてきます。

Q3:最新のExcel(Microsoft 365)なら他の方法もある?

365なら VSTACK という新関数で複数シートのデータを縦に積んでから集計する方法もあります。ただし古いExcelでは動かないので、職場のバージョンが揃っていない場合は本記事の方式が確実です(串刺しSUMはほぼ全バージョンで動きます)。


まとめ

  • SUMIFは複数シートをまたげない(Excelの仕様。書き方では突破不可)
  • 回避ワザ=各シートに「自分の答え」を書かせて、集計側は串刺しSUMだけ
  • 雛形に仕込めば、シートが増えてもメンテゼロ
  • 雛形の=TODAY()は時限バグ。日付欄は空欄+手入力が安全

今日のアクション:シートが増えていく管理表を持っていたら、雛形シートがあるか確認してみてください。雛形があるなら、この仕組みはそのまま載せられます。


もし詰まったら教えてください

「うちの表はこういう形なんだけど応用できる?」など、気軽に教えてください。次の記事のネタにさせてもらいます🌱

連絡手段:

  • 📝 記事下の コメント欄 にどうぞ
  • 🐦 X(旧Twitter)の @miyamon_ai にリプライ・DMでもOK

会社員の僕が業務効率化するためのノウハウを定期的に発信しています。


関連記事: