Excelのワークシート関数(VLOOKUP、SUMIFS、COUNTIFSなど)は、実はVBAのマクロの中からもそのまま呼び出せることをご存じでしょうか。VBAには同じ機能を持つ命令が用意されていない場合も多く、複雑な集計や検索処理をゼロから書こうとすると手間がかかります。そんなときに役立つのがApplication.WorksheetFunctionです。
この記事では、Application.WorksheetFunctionの基本的な使い方から、VLookup・SumIfs・CountIfsといった代表的な関数の実践的な呼び出し方、そしてエラーが発生したときの正しい対処法まで、コピペしてすぐ使えるサンプルコード付きで解説します。
Application.WorksheetFunctionとは
Application.WorksheetFunctionは、Excelのワークシート関数をVBAのコードの中から直接実行するためのオブジェクトです。セルに数式を入力する代わりに、マクロの処理中に計算結果だけを変数に取得したいときに使います。
例えば「ある範囲の合計をセルに表示せず、変数に入れて条件分岐に使いたい」といった場面で威力を発揮します。VBA単体では実装が面倒な検索・集計処理も、ワークシート関数の力を借りることで数行で書けるようになります。
基本の書き方は以下の通りです。
Dim 結果 As Variant
結果 = Application.WorksheetFunction.関数名(引数)
Application.は省略してWorksheetFunction.関数名と書くこともできますが、可読性のためフルで書くことをおすすめします。
基本構文と対応関数の考え方
すべてのワークシート関数がVBAから呼べるわけではありません。IF関数やVLOOKUP、SUM、COUNTIFSのような「計算・検索系」の関数はほぼそのまま使えますが、CELLやINDIRECTのような「セル情報を参照する系」の関数の一部は対応していません。
対応しているかどうかは、VBEの画面でWorksheetFunction.と入力した直後に表示される候補一覧(インテリセンス)で確認できます。
Sub 対応関数の確認例()
Dim wf As WorksheetFunction
Set wf = Application.WorksheetFunction
' ここで wf. と入力すると候補が一覧表示される
End Sub
具体例1:VLookupで表から値を検索する
VLOOKUP関数は、指定した値を表の1列目から検索し、対応する列の値を取得する関数です。マクロ内で「ある社員番号に対応する氏名を取得する」といった処理によく使われます。
Sub VLookupの例()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("社員名簿")
Dim 検索値 As String
検索値 = "A1002"
Dim 検索範囲 As Range
Set 検索範囲 = ws.Range("A2:C100")
Dim 氏名 As Variant
氏名 = Application.WorksheetFunction.VLookup(検索値, 検索範囲, 2, False)
MsgBox 検索値 & "さんの氏名は「" & 氏名 & "」です"
End Sub
第4引数にFalseを指定することで完全一致検索になります。あいまい検索が必要な場合を除き、基本的にはFalseを指定しましょう。
具体例2:SumIfsで複数条件の合計を求める
SUMIFS関数は、複数の条件をすべて満たす行だけを対象に合計を計算します。売上データから「特定の担当者かつ特定の商品カテゴリ」の売上合計を求める、といった集計処理に便利です。
Sub SumIfsの例()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("売上データ")
Dim 合計範囲 As Range, 条件範囲1 As Range, 条件範囲2 As Range
Set 合計範囲 = ws.Range("D2:D1000")
Set 条件範囲1 = ws.Range("B2:B1000")
Set 条件範囲2 = ws.Range("C2:C1000")
Dim 合計金額 As Double
合計金額 = Application.WorksheetFunction.SumIfs(合計範囲, 条件範囲1, "山田太郎", 条件範囲2, "文房具")
MsgBox "山田太郎さんの文房具カテゴリの売上合計は " & Format(合計金額, "#,##0") & " 円です"
End Sub
条件は必要な数だけ「範囲、条件」のペアを追加していくだけなので、条件が3つ以上になっても書き方は同じです。なお、日付を条件にする場合は"2026/7"のような文字列を直接指定すると一致しないことがあるため、">=2026/7/1"と"<2026/8/1"のように比較演算子付きの範囲条件を2つ組み合わせて指定してください。
具体例3:CountIfsで複数条件に合う件数を数える
COUNTIFS関数は、複数条件をすべて満たすデータの件数をカウントします。「特定のステータスかつ特定の担当者の件数」を求めたいときなどに使います。
Sub CountIfsの例()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("タスク一覧")
Dim 条件範囲1 As Range, 条件範囲2 As Range
Set 条件範囲1 = ws.Range("B2:B500")
Set 条件範囲2 = ws.Range("C2:C500")
Dim 件数 As Long
件数 = Application.WorksheetFunction.CountIfs(条件範囲1, "未対応", 条件範囲2, "田中")
MsgBox "田中さん担当の未対応タスクは " & 件数 & " 件です"
End Sub
エラー処理:値が見つからない場合の対処法
WorksheetFunction経由でVLookupなどを実行し、該当する値が見つからなかった場合、VBAは通常のワークシート上のように#N/Aエラー値を返すのではなく、実行時エラーを発生させてマクロが停止してしまいます。これはWorksheetFunctionを使ううえで最も注意すべき点です。
対処法として、On Errorステートメントでエラーを捕捉する方法が確実です。
Sub VLookupのエラー処理例()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("社員名簿")
Dim 検索値 As String
検索値 = "存在しない番号"
Dim 氏名 As Variant
On Error Resume Next
氏名 = Application.WorksheetFunction.VLookup(検索値, ws.Range("A2:C100"), 2, False)
On Error GoTo 0
If IsEmpty(氏名) Then
MsgBox "該当するデータが見つかりませんでした"
Else
MsgBox "氏名は「" & 氏名 & "」です"
End If
End Sub
On Error Resume Nextでエラーを無視した直後にOn Error GoTo 0でエラー処理を元に戻し、変数が空のままかどうかで判定するのがポイントです。エラー処理を挟まずに使うと、想定外のデータが来た瞬間にマクロが停止してしまうので、実務で使うコードには必ず組み込んでおきましょう。
WorksheetFunctionを使う際の注意点
WorksheetFunctionはセル範囲を直接引数として渡せるため直感的に書けますが、いくつか注意点があります。
- IFやAND・ORなど、VBAに同等の命令がある関数はVBA標準の構文を使う方がシンプルです。無理に
WorksheetFunction.Ifなどを使う必要はありません。 - 配列数式を前提とする関数(一部の集計関数など)は、VBAから呼び出すと期待通りに動かないことがあります。動作が怪しいと感じたら、まず小さい範囲でテストしましょう。
- 似た仕組みに
Application.Evaluate(Application.Runとは別物)がありますが、Evaluateは数式文字列をそのまま評価する方式のため、書き方や挙動が異なります。基本的にはWorksheetFunctionを使う方が可読性が高くおすすめです。
まとめ
Application.WorksheetFunctionを使うと、VLOOKUPやSUMIFS、COUNTIFSといったおなじみのワークシート関数を、マクロの処理の中でそのまま活用できます。集計や検索のロジックを自前で書く手間が省け、コードもシンプルになります。
ポイントをまとめると以下の通りです。
Application.WorksheetFunction.関数名(引数)の形で呼び出す- 対応していない関数もあるため、VBEの候補一覧で確認する
- 値が見つからない場合はエラーが発生するため、
On Errorで必ず処理する
普段セルで使っている関数の知識をそのままVBAに活かせるので、ぜひ実務のマクロに取り入れてみてください。


コメント