条件付きで数値を集計する際に便利なSUMIF関数ですが、式としてだけでなくマクロを組むときにも使えたら集計のプログラムがシンプルになりそうですよね。
この記事では、Excel VBAでSUMIF関数を使う方法を解説していきます。参照したい表が別のシートやブックに存在するケースでの使い方も併せて紹介します。
VBA上でのSUMIF関数の構文
Excel VBAでのSUMIF関数の構文は以下のようになります。数式として利用する場合と同様です。
WorksheetFunction.SumIf(条件範囲,検索条件,合計範囲)
具体的な使い方について、まずは参照する表と集計マクロが同一のシートにあるケースから見ていきます。
SUMIF関数の使用例
次の売上表で売上金額をVBAのSUMIF関数で算出する方法を例として解説します。
店舗番号列(C5~C14)セルから「A005」を検索し、売上金額(E5~E14)セルを合計するには、VBAでSUMIFメソッドを以下のように記述します。
WorksheetFunction.SumIf(Range("C5:C14")), "A005", Range("E5:E14"))
VBAのコード全体は以下のようになります。SumIfメソッドの中に直接セル等を入れると長くなるので集計前に変数に代入しています。
Sub Aggregate()
Dim result As Long
Dim shopNumber As Range
Dim sales As Range
Dim searchKey As String
Set shopNumber = Range("C5:C14") '店舗番号の列を代入
Set sales = Range("E5:E14") '売上金額の列を代入
searchKey = "A005"
result = WorksheetFunction.SumIf(shopNumber, searchKey, sales) '集計
Range("C2").Value = result
End Sub
上記のコードをマクロとして登録し、「集計」ボタンをクリックすると起動するように設定します。
ボタンをクリックすると、店舗「A005」の売上金額を集計することができました。
参照する表が別シートにある場合
次に参照される表が別シートにあるケースについて解説します。
別シートからマクロを実行する場合、参照範囲や合計範囲を指定する際に「Worksheets(シート名)」を用いてシートを指定する必要があります。
例では、「売上表」シートを参照できるマクロを「集計」シートに次のコードを記述します。
Worksheets("売上表").Range("C3:C12")
サンプルのVBAのコードは以下のとおりです。
Sub Aggregate()
Dim result As Long
Dim shopNumber As Range
Dim sales As Range
Dim searchKey As String
Set shopNumber = Worksheets("売上表").Range("C3:C12") '店舗番号の列を代入
Set sales = Worksheets("売上表").Range("E3:E12") '売上金額の列を代入
searchKey = "A005"
result = WorksheetFunction.SumIf(shopNumber, searchKey, sales) '集計
Range("C2").Value = result
End Sub
同一シートのコードに比べて、shopNumbers, sales変数へ代入する箇所が変わっています。
マクロを実行すると、次のように別シートからSUMIF関数を利用して表のデータを集計できるようになります。
参照する表が別ブックにある場合
最後に別ブックにあるケースを解説します。例では「SUMIF売上表」ブックの「売上表」シートのデータを別のマクロ用ブックから参照します。
別ブックに存在する参照範囲や合計範囲は、「Workbooks(ブック名).WorkSheets(シート名)」を用いて指定します。
Workbooks("SUMIF売上表.xlsx").Worksheets("売上表").Range("C3:C12")
ブック名は拡張子「.xlsx」まで必要なので注意してください。
サンプルのVBAコードは次のとおりです。
Sub Aggregate()
Dim result As Long
Dim shopNumber As Range
Dim sales As Range
Dim searchKey As String
Dim wb As Workbook
Set wb = Workbooks("SUMIF売上表.xlsx")
Set shopNumber = wb.Worksheets("売上表").Range("C3:C12") '店舗番号の列を代入
Set sales = wb.Worksheets("売上表").Range("E3:E12") '売上金額の列を代入
searchKey = "A005"
result = WorksheetFunction.SumIf(shopNumber, searchKey, sales) '集計
Range("C2").Value = result
End Sub
上記のマクロを別のマクロ用ブックから実行します。
次のキャプチャーのように「SUMIF売上表」ブックの集計結果を取得できます。
エラーが出る場合
上の例では、参照するブックを開いていないとVBAの実行時にエラーが表示されてしまいます。
そこで最後に、Workbooksの「Open」「Close」メソッドを利用して、「SUMIF売上表」ブックが閉じていても参照できるマクロに書き換えてみます。
書き換えたVBAのコードは次の通りです。
Sub Aggregate()
Dim result As Long
Dim shopNumber As Range
Dim sales As Range
Dim searchKey As String
Dim wb As Workbook
' 閉じたブックから値を取得
Set wb = Workbooks.Open("C:\Users\sk\Documents\SUMIF売上表.xlsx")
ActiveWindow.Visible = False
Set shopNumber = wb.Worksheets("売上表").Range("C3:C12") '店舗番号の列を代入
Set sales = wb.Worksheets("売上表").Range("E3:E12") '売上金額の列を代入
searchKey = "A005"
result = WorksheetFunction.SumIf(shopNumber, searchKey, sales) '集計
Range("C2").Value = result
wb.Close (False)
End Sub
上記のコードを使えば、参照先のブックが閉じていてもマクロを実行することができ便利です。
以上、Excel VBAでSUMIF関数を使う方法でした。
コメント