ワークシート関数による合計処理

このページでは合計処理に関係する Sum、SumIf、SumIfs 関数について説明します。

スポンサーリンク

Sum関数

Sum 関数は引数に指定した範囲の数値を合計します。指定した範囲内に文字列があった場合は無視され、エラーとはなりません。

構文
WorksheetFunction.Sum(範囲1 [, 範囲2…])

【戻り値】 倍精度浮動小数点型 (Double)
引数名 省略 説明
範囲 合計するべき数値を含むセル範囲(レンジオブジェクト)または配列を指定します。
※…1つ目は省略不可。2つ目以降は任意。

Sum関数の使用例

以下のマクロはアクティブシートに売上表があるという前提で、売上表における1月分と1~3月分売上の全店舗合計を求める例です。

Sub sample_wf012_01()
    Dim s As Double

    '1月分の全店舗合計
    s = WorksheetFunction.Sum(Range("B4:B13"))
    Debug.Print "1月分合計", s

    '1~3月分の全店舗合計
    s = WorksheetFunction.sum(Range("B4:D13"))
    Debug.Print "1~3月分合計", s
End Sub

下図はテスト用の売上表です。テスト時はこのシートをアクティブにしておいて下さい。

全店舗1~3月分売上表
全店舗1~3月分売上表

SumIf 関数

SumIf 関数は引数に指定したセル範囲の数値を1つの条件判定付きで合計します。条件を指定するセル範囲と合計するセル範囲は別々に指定することができます。Sum 関数と同じく合計対象のセル範囲に文字列があった場合は無視され、エラーとはなりません。

構文
WorksheetFunction.SumIf(範囲, 条件, [合計範囲])

【戻り値】 倍精度浮動小数点型 (Double)
引数名 省略 説明
範囲 × セル範囲(レンジオブジェクト)を指定します。 第3引数”合計範囲”を省略した場合、この範囲は条件範囲および合計範囲となります。 省略しなかった場合は条件範囲となります。
条件 × 合計する際の条件を指定します。 条件の中には < > などの記号や、 ?(任意の一文字) や *(任意の文字列) などのワイルドカードを使うことができます。 詳細はこのページ下の条件文の書き方をご覧ください。
合計範囲 合計対象の数値を含むセル範囲を指定します。 この引数を省略した場合は、上記の”範囲”が合計範囲となります。

第3引数 “合計範囲” を省略した使用例

Sub sample_wf012_02()
    Dim s As Double

    '1月分100万未満の合計
    s = WorksheetFunction.SumIf(Range("B4:B13"), "<100")
    Debug.Print "合計 " & s
End Sub

下図の赤枠点線内が条件合致、合計対象箇所

全店舗1~3月分売上表
全店舗1~3月分売上表

第3引数 “合計範囲” を省略しない使用例

以下のマクロは条件内にワイルドカードを使用して、各グループ(A~C) 002 番店舗の1月分合計を求める例です。

Sub sample_wf012_03()
    Dim s As Double

    '各グループ毎002番店舗の合計
    s = WorksheetFunction.SumIf(Range("A4:A13"), "*002*", Range("B4:B13"))
    Debug.Print "合計 " & s
End Sub

下図の青枠点線内が条件合致、赤枠点線内が合計対象箇所

全店舗1~3月分売上表
全店舗1~3月分売上表

SumIfs関数

SumIfs 関数は引数に指定したセル範囲の数値を複数の条件判定付きで合計します。Sum 関数とは違い、条件を指定するセル範囲と合計するセル範囲は別々に指定する必要があります。条件を複数指定するとAND条件となり、すべての条件を満たすものが合計対象となります。合計対象のセル範囲に文字列があった場合は無視され、エラーとはなりません。

構文
WorksheetFunction.SumIfs(合計範囲, 条件範囲1, 条件1 [, 条件範囲2, 条件2 …])

【戻り値】 倍精度浮動小数点型 (Double)
引数名 省略 説明
合計範囲 × 合計するべき数値を含むセル範囲(レンジオブジェクト)を指定します。
条件範囲 合計する際の条件を指定します。 条件の中には < > などの記号や、? や * などのワイルドカードを使うことができます。 詳細はこのページ下の条件文の書き方をご覧ください。
条件 合計対象の数値を含むセル範囲を指定します。
※…1つ目の条件は省略不可。2つ目以降は任意。

SumIf 関数とは引数の指定場所が異なることに注意してください。

複数の条件を指定した使用例

以下のマクロはワークシート上にある売上表において、各グループ(A~C) 002 番店舗のうち、1月分が150万を超える店舗の2月分合計を求める例です。

Sub sample_wf012_04()
    Dim s As Double

    s = WorksheetFunction.SumIfs(Range("C4:C13"), _
                                 Range("A4:A13"), "*002*", _
                                 Range("B4:B13"), ">150")

    Debug.Print "合計 " & s
End Sub

下図の青枠点線内が条件合致、赤枠点線内が合計対象箇所になります。

全店舗1~3月分売上表
全店舗1~3月分売上表

条件文の書き方

条件は、SumIf や SumIfs 関数だけでなく、CountIf や AverageIf 関数など指定できる関数は多くあります。ここではこれらの関数に指定する条件文の書き方について簡単にまとめたいと思います。

※例文では CountIf 関数を使用します。第2引数が条件になります。

ワークシート関数の条件判定では文字列の大文字・小文字は区別されず、同じものとみなされますので注意してください。

∼に等しい

条件文に比較する値をそのまま指定します。等号(=)につづけて値を指定してもかまいません。比較する値が数値のときはダブルクォーテーションは不要です。

'文字列"abc"に等しい("ABC"、"Abc"などにも等しい)
CountIf(Range("A1:A100"), "abc")
CountIf(Range("A1:A100"), "=abc")

'数値"0.5"に等しい
CountIf(Range("A1:A100"), "0.5")
CountIf(Range("A1:A100"), "=0.5")
CountIf(Range("A1:A100"), 0.5)

∼に等しくない

記号(<>)につづけて値を指定します。文字列、数値にかかわらずダブルクォーテーションで括る必要があります。

'文字列"abc"に等しくない("ABC"、"Abc"などにも等しくない)
CountIf(Range("A1:A100"), "<>abc")

'数値"0.5"に等しくない
CountIf(Range("A1:A100"), "<>0.5")

大なり・小なり・以上・以下

記号(>, <, >=, <=)につづけて値を指定します。文字列、数値にかかわらずダブルクォーテーションで括る必要があります。

'文字列"abc"("ABC"、"Abc"など)より大きい
CountIf(Range("A1:A100"), ">abc")

'文字列"abc"より小さい
CountIf(Range("A1:A100"), "<abc")

'数値"0.5"以上
CountIf(Range("A1:A100"), ">=0.5")

'数値"0.5"以下
CountIf(Range("A1:A100"), "<=0.5")

∼を含む

ワイルドカード(*)は任意の文字列にマッチするので、これを定数の前後につけます。

'文字列"abc"("ABC"、"Abc"など)を含む
CountIf(Range("A1:A100"), "*abc*")

∼から始まる

ワイルドカード(*)を定数の後につけます。ワイルドカード(?)は任意の1文字にマッチするので、文字数も同時に判定したいときに使用します。

'文字列"abc"("ABC"、"Abc"など)から始まる
CountIf(Range("A1:A100"), "abc*")

'文字列"abc"("ABC"、"Abc"など)から始まる5文字
CountIf(Range("A1:A100"), "abc??")

∼で終わる

ワイルドカード(*)を定数の前につけます。ワイルドカード(?)は任意の1文字にマッチするので、文字数も同時に判定したいときに使用します。

'文字列"abc"("ABC"、"Abc"など)で終わる
CountIf(Range("A1:A100"), "*abc")

'文字列"abc"("ABC"、"Abc"など)で終わる5文字
CountIf(Range("A1:A100"), "??abc")

 ワークシート関数を使用するメリット

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