【VBAリファレンス|実務向け】【実務効率化】巨大な表でも一瞬!「一行おき」に合計値を算出するテクニック

スポンサーリンク

導入:なぜ「一行おき」の集計が課題なのか

実務の現場では、売上データや在庫一覧などで「見出し行」と「データ行」が交互に並んでいたり、あるいは「予算」と「実績」が一行ずつ交互に配置されていたりするケースに遭遇します。このような場合、通常のSUM関数では範囲を一つずつCtrlキーを押しながらクリックする手間が発生し、データ量が増えるほどヒューマンエラーのリスクも高まります。今回は、関数を組み合わせて、どんなに大きなデータでもミスなく一瞬で集計する方法を解説します。

基礎知識:キーとなる3つの関数

今回使用する数式は、以下の3つの関数の組み合わせです。

ROW関数:指定したセルの行番号を返します。
MOD関数:数値を割り算した「余り」を返します。例えば、行番号を2で割った余りを見ることで、その行が「偶数行」か「奇数行」かを判定できます。
IF関数:条件に合致したセルだけを抽出するフィルターの役割を果たします。

これらを組み合わせることで、「行番号が偶数(または奇数)のセルだけを抽出して合計する」という論理を実現します。

実装:数式の組み立て方

以下の数式を、集計したいセルに入力してください。

=SUM(IF(MOD(ROW(データ範囲),2)=余り, データ範囲, 0))

ポイント:
・「余り」の部分には、奇数行を合計したいなら「1」、偶数行なら「0」を指定します。
・入力後、必ず Ctrl + Shift + Enter を同時に押して確定してください。これにより「配列数式」として処理され、範囲全体を一度に判定できるようになります。

サンプルプログラム:そのまま使える実用コード

以下は、A1からA10までのセル範囲で、奇数行(1, 3, 5…行目)のみを合計する数式をExcelのセルに書き込むVBAコードです。実務で定型業務化したい場合に活用してください。

Sub SumOddRows()
‘ A1:A10の奇数行を合計してB1セルに出力する
‘ 配列数式(FormulaArray)を使用します
Dim targetRange As String
targetRange = “A1:A10”

‘ 数式:MOD(ROW(), 2) = 1 が奇数行の条件
‘ FormulaArrayを使うことで、Ctrl+Shift+Enterと同等の動作を自動化します
Range(“B1”).FormulaArray = “=SUM(IF(MOD(ROW(” & targetRange & “),2)=1,” & targetRange & “,0))”

MsgBox “奇数行の合計を算出しました。”
End Sub

応用・注意点:現場で陥りやすい罠

1. 範囲の指定:ROW関数の中に入れる範囲は、必ず行全体として整合性が取れているか確認してください。途中で行を挿入・削除しても自動追従しますが、範囲指定がずれていないか注意が必要です。
2. 列おき集計への応用:行ではなく「一列おき」に集計したい場合は、ROW関数をCOLUMN関数に置き換えるだけで解決します。
3. 配列数式の負荷:非常に広大な範囲(数万行など)に対して配列数式を多用すると、Excelの動作が重くなることがあります。その場合は、作業列に「=MOD(ROW(),2)」などの判定フラグを立てて、SUMIF関数で集計する方がパフォーマンス面で有利になる場合もあります。

現場の状況に合わせて、数式とVBAを使い分けてみてください。

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