【VBAリファレンス|実務向け】実務で差がつく!「一行おき」のデータ集計を効率化するテクニック

スポンサーリンク

導入

実務の現場では、データが一行おきに記録されている表に出くわすことがよくあります。例えば、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関数で集計する方が処理速度が速くなる傾向があります。状況に応じて使い分けるのが「ベテランの技」です。

タイトルとURLをコピーしました