導入
実務の現場では、データが一行おきに記録されている表に出くわすことがよくあります。例えば、1行目に「売上」、2行目に「原価」といった交互のデータが並んでいる場合、単純なSUM関数ではすべての数値を合計してしまい、特定の項目だけを抽出して計算するのは非常に手間がかかります。
手動でセルを選択するのはミスの原因になりますし、表の規模が大きくなればなるほど現実的ではありません。今回は、Excelの関数を組み合わせて、「一行おき」という条件付きで自動集計する方法を解説します。
基礎知識
このテクニックの鍵となるのは、以下の3つの関数です。
ROW関数:指定したセルの「行番号」を返す関数です。
MOD関数:数値を指定した数で割った「余り」を返す関数です。これを使うことで、奇数行(2で割ると余り1)か偶数行(2で割ると余り0)かを判別できます。
IF関数:条件に応じて、値を返すか計算対象から外すかを制御します。
これらを組み合わせることで、「行番号を2で割った余りが1(奇数)のセルだけを合計する」といった柔軟な集計が可能になります。
実装/解決策
基本的な考え方は、データの範囲全体に対して「行番号が奇数か偶数か」という条件判定を行い、条件に合致するデータだけをSUM関数に渡すという手法です。
手順は以下の通りです。
1. 合計を表示したいセルを選択します。
2. 以下の数式を入力します。
=SUM(IF(MOD(ROW(データ範囲),2)=余り,データ範囲,0))
※「データ範囲」には集計したい範囲を指定します。
※「余り」には、奇数行を合計したい場合は「1」、偶数行なら「0」を指定します。
3. 数式を入力後、Ctrl + Shift + Enter を同時に押して確定させます(古いバージョンのExcelでは配列数式として認識させる必要があります)。
サンプルプログラム
VBAで同様の処理を行いたい場合、ループ処理を使って判定する方法が最も確実で可読性が高いです。以下に、指定した範囲内の奇数行だけを合計するプロシージャを紹介します。
Sub SumEveryOtherRow()
Dim rng As Range
Dim cell As Range
Dim total As Double
' 合計したい範囲を指定
Set rng = Range("C1:C10")
' 範囲内のセルを一つずつ確認
For Each cell In rng
' 行番号が奇数の場合のみ合計(2で割って余りが1)
If cell.Row Mod 2 = 1 Then
total = total + cell.Value
End If
Next cell
' 結果をメッセージボックスで表示
MsgBox "奇数行の合計は: " & total
End Sub
応用・注意点
列単位での応用
ROW関数の代わりにCOLUMN関数を使うと、一行おきではなく「一列おき」の合計も簡単に計算できます。
パフォーマンスの注意点
非常に広範囲(数万行など)に対して配列数式を使用すると、ファイルの動作が重くなることがあります。その場合は、一度作業列を作って「=MOD(ROW(),2)」といったフラグを立ててから、SUMIF関数で集計する方が処理速度が速くなる傾向があります。状況に応じて使い分けるのが「ベテランの技」です。
