このパターンは月次決算パックや粗利分析で頻繁に登場します。フラットな取引ログを持っていて、ヘルパー列を追加したりピボットに書き出したりせずに、カレンダー月単位で件数を集計したい場面です。
COUNTIFがMONTH()を直接受け付けない理由
COUNTIFの第1引数はC2:C3001のような具体的なセル範囲の参照を期待しています。ARRAYFORMULAなしにMONTH(C2:C3001)を渡した場合、Google SheetsはMONTHを範囲の先頭セルにのみ適用します。結果は配列ではなく単一の整数(2行目の日付の月)になるため、COUNTIFの戻り値はその1件が条件に一致するかどうかによって1か0になります。
ARRAYFORMULAを使うことで、COUNTIFが処理する前に範囲全体を評価させます。結果として1〜12の整数からなる実際のインメモリ配列が生成され、COUNTIFは通常どおりこの配列に対してマッチングを行います。Google公式ドキュメント「ARRAYFORMULAの使い方」では、この関数を「配列の計算結果を複数行・複数列に表示したり、非配列関数に配列処理をさせるために使う」と説明しています。
COUNTIF+ARRAYFORMULA(MONTH())で月別件数を集計する
単月の場合:
=COUNTIF(ARRAYFORMULA(MONTH(Transactions!C2:C3001)), 3)
経営報告資料のサマリー行でB4:M4に月番号1〜12が入っている場合:
=COUNTIF(ARRAYFORMULA(MONTH(Transactions!$C$2:$C$3001)), B4)
M4まで右にドラッグします。各セルがヘッダー行の月番号を参照し、対応する月の取引件数をカウントします。3,000行のデータでも、12ヶ月分すべてを1秒以内に再計算できます。
ドラッグなしで1つの数式から12ヶ月分を一括出力したい場合、COUNTIFは条件の配列をネイティブにはイテレートできません。そこでMAP+LAMBDA(Google Sheetsでは2023年後半から利用可能)を使います:
=MAP(ROW(INDIRECT("1:12")), LAMBDA(m,
COUNTIF(ARRAYFORMULA(MONTH(Transactions!$C$2:$C$3001)), m)
))
12個の値が縦方向にスピルされます。サマリー行が横方向の場合はTRANSPOSEで転置してください。MAP/LAMBDAが使えない環境では単月の数式をドラッグする方法が現実的です。見た目はシンプルではありませんが、経営企画の上長から「この数字はどうやって出したの?」と聞かれたときに説明しやすい構造です。
COUNTIF ARRAYFORMULA MONTH数式の空白セルバグを修正する
これは、オープンエンドの範囲を使うモデルでほぼ必ず発生し、1月の数値をサイレントに狂わせるバグです。
MONTH("")は1を返します。日付列の空白セルがすべて1月としてカウントされてしまいます。たとえば2026年度上期(4月〜9月期)の途中で、3,000行の範囲のうち実データが1,000行しかない場合、空白の2,000行すべてが1月(または4月相当)として加算されます。
COUNTIFSを使った修正方法:
=COUNTIFS(
ARRAYFORMULA(MONTH(Transactions!C2:C3001)), 3,
Transactions!C2:C3001, "<>"
)
2つ目の条件が月のマッチング前に空白の日付を除外します。12ヶ月分をドラッグする場合も同様に、範囲参照を固定してハードコードした3をヘッダーセルの参照に置き換えるだけです。Google公式ドキュメント「COUNTIFSの使い方」によると、COUNTIFSは複数の条件範囲と条件を組み合わせてカウントできるため、この用途に最適です。
ARRAYFORMULA内で空白を除外する方法もあります:
=COUNTIF(
ARRAYFORMULA(IF(Transactions!C2:C3001<>"", MONTH(Transactions!C2:C3001), "")),
3
)
どちらの方法も機能しますが、COUNTIFS版の方が空白除外のロジックが明示的で監査しやすいという利点があります。予実差異の原因追跡で1月の数値が問われたとき、数式の意図が一目でわかることは重要です。
SUMPRODUCTへの切り替えを検討するタイミング
SUMPRODUCTは空白セル問題と月抽出を1つのパスで処理でき、中間のARRAYFORMULAレイヤーが不要です:
=SUMPRODUCT(
(MONTH(Transactions!$C$2:$C$3001)=3) *
(Transactions!$C$2:$C$3001<>"")
)
10,000行以下のデータセットでは処理速度はほぼ同等です。50,000行を超える場合、SUMPRODUCTは中間配列のマテリアライズを省略できるため再計算が速い傾向があります。Google Sheetsのセル上限は1,000万セルで、大規模な取引ログではSUMPRODUCTがCOUNTIF+ARRAYFORMULAより2〜3倍高速になることがあります。
件数ではなく金額を集計したい場合(月別売上など):
=SUMPRODUCT(
(MONTH(Transactions!$C$2:$C$3001)=3) *
(Transactions!$C$2:$C$3001<>"") *
Transactions!$D$2:$D$3001
)
D列が取引金額です。財務企画(FP&A)の現場では、件数のカウントはあくまで金額集計のサニティチェックとして使われることがほとんどです。
| アプローチ | 空白セル対応 | 12ヶ月一括出力 | 推奨用途 |
|---|---|---|---|
COUNTIF(ARRAYFORMULA(MONTH())) | ×(COUNTIFSを使用) | MAP/LAMBDAで可能 | 取引件数集計、10,000行未満 |
COUNTIFS(ARRAYFORMULA(MONTH()), ..., range, "<>") | ○ | 不可(ドラッグかMAP) | 監査性の高い月別件数 |
SUMPRODUCT((MONTH()=m)*(range<>"")) | ○ | 不可(ドラッグ) | 件数・金額問わず、データ規模不問 |
MAP(ROW(INDIRECT("1:12")), LAMBDA(m, COUNTIF(...))) | 内側の数式に依存 | ○ | 経営報告資料の12ヶ月一括出力 |
複数タブのモデルに組み込む
四半期の経営報告パックでは、月別件数をサマリータブに集約し、他のタブがそこを参照する構成が一般的です。実用的なセットアップは次のとおりです。
Transactionsタブ(生データ):C列に日付、D列に金額、E列にSKUまたはカテゴリ。
Monthly Summaryタブ:B5:B16に月番号1〜12を配置し、以下の数式を設定:
=COUNTIFS(
ARRAYFORMULA(MONTH(Transactions!$C$2:$C$3001)), $B5,
Transactions!$C$2:$C$3001, "<>",
Transactions!$E$2:$E$3001, 'P&L'!$C$2
)
この数式は$B5の月かつP&L前提シートの勘定科目に一致する取引件数をカウントします。P&LタブはMonthly Summaryを参照:
=SUMIFS('Monthly Summary'!D:D, 'Monthly Summary'!B:B, ">=" & Assumptions!$B$3)
タブ間の参照は2層構造、すべての範囲はロック済み、ヘルパー列は不要です。取引日付を変更すればP&Lの数値も連動します。生データ→月次サマリー→P&Lという監査証跡が、ピボットキャッシュに何かを隠すことなく明確に辿れる構造です。
よくある質問
Q. COUNTIF(ARRAYFORMULA(MONTH(...)), m) と SUMPRODUCT((MONTH(...)=m)*1) はどちらが速いですか?
10,000行以下では体感差はほぼありません。それ以上のデータ規模では一般的にSUMPRODUCTが有利です。ただし、監査のしやすさを重視するなら、COUNTIFSで空白除外のロジックを明示した方が社内レビューに耐えやすい構造になります。
Q. MONTH()はテキスト形式の日付(例:「2026/03/15」)にも使えますか?
使えません。MONTH()はGoogle Sheetsのシリアル値として認識された日付を必要とします。テキスト形式の場合はDATEVALUE()でシリアル値に変換してから使ってください:MONTH(DATEVALUE(C2))。
Q. 年をまたぐデータで特定の月だけカウントするとき、2024年3月と2025年3月が混ざりませんか?
はい、混ざります。年ごとに絞り込む場合はCOUNTIFSにYEAR()条件を追加してください:
=COUNTIFS(
ARRAYFORMULA(MONTH(Transactions!$C$2:$C$3001)), 3,
ARRAYFORMULA(YEAR(Transactions!$C$2:$C$3001)), 2026,
Transactions!$C$2:$C$3001, "<>"
)
Q. MAP/LAMBDAが使えないバージョンのGoogle Sheetsを使っています。12ヶ月分を一括出力する方法はありますか?
MAP/LAMBDAは2023年後半以降の新機能のため、旧環境では利用できません。その場合は単月のCOUNTIFS数式をB4:M4に12回ドラッグする方法が最も実用的です。数式の保守性よりも確実な動作を優先してください。
Q. 月別件数ではなく、月別の売上合計を出したいときはどうすればいいですか?
COUNTIFをSUMIFSまたはSUMPRODUCTに置き換えてください。SUMPRODUCTの場合:
=SUMPRODUCT(
(MONTH(Transactions!$C$2:$C$3001)=3) *
(Transactions!$C$2:$C$3001<>"") *
Transactions!$D$2:$D$3001
)
D列が金額列です。件数集計と金額集計を並べておくと、単価の検証にも活用できます。
既存のモデルにこのパターンを組み込む際に、自分のタブ構成や列の配置に合わせたCOUNTIFSまたはSUMPRODUCTの数式を正確に生成したい場合は、ModelMonkeyが役に立ちます。シートの構造を読み取り、正しいセル参照が入った状態の数式を出力します。ModelMonkeyのプランを選ぶ。Google SheetsとExcelの両方に対応しています。