【VBA】WorksheetFunctionの使い方|Excel関数をマクロで活用する方法

スポンサーリンク

VBAでマクロを書いていると「この処理、ワークシート関数を使えばすぐなのに…」と思う場面がありますよね。

VLOOKUPで別シートから値を引っ張ってきたり、COUNTIFで条件に合うデータを数えたり。これをVBAだけで書こうとすると、ループ処理が何行にもなってしまいます。

そんなときに使えるのが WorksheetFunction です。Excel関数をVBAのコード内でそのまま呼び出せるので、処理がシンプルになりますよ。

この記事では、WorksheetFunctionの基本的な書き方から実務で使えるパターン、エラー対処法まで解説します。

WorksheetFunctionとは?

WorksheetFunctionは、Excelのワークシート関数をVBAのコード内で使うためのオブジェクトです。

ふだんセルに =VLOOKUP(...)=SUM(...) と書いている関数を、VBAから呼び出せます。たとえば100行のデータから条件に合う値を探す処理を考えてみてください。ループで1行ずつ見ていくより、VLOOKUPを1回呼ぶほうがシンプルです。

WorksheetFunctionでできること

できること具体例
検索・参照VLOOKUP、MATCH、INDEXで値を取得
集計SUM、AVERAGE、COUNTIFで範囲を計算
文字列操作の一部SUBSTITUTE、TRIMなど
数学・統計ROUND、MAX、MIN、RANKなど
条件付き集計SUMIFS、COUNTIFSで複数条件の集計

NOTE

すべてのワークシート関数がVBAで使えるわけではありません。VBAに同じ機能がある関数(LEFT、RIGHT、MIDなど)は対象外です。使える関数の確認方法は後述します。

VBEの起動とコードの書き方

VBE(Visual Basic Editor)の開き方

VBAコードを書くにはVBEを開きます。一番かんたんなのはショートカットキーです。

Alt + F11 を押すとVBEが起動します。

リボンから開く場合は「開発」タブ →「Visual Basic」をクリックします。

TIP

「開発」タブが表示されていない場合は、「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」にチェックを入れてください。

標準モジュールの挿入

VBEのメニューから「挿入」→「標準モジュール」を選びます。表示されたコードウィンドウにVBAコードを書いていきます。

WorksheetFunctionの基本コード

まずは一番シンプルな例から見てみましょう。SUM関数をVBAで呼び出すコードです。

Sub SumExample()
    Dim total As Double
    total = WorksheetFunction.Sum(Range("A1:A10"))
    MsgBox "合計は " & total & " です"
End Sub

このコードは、A1からA10の合計を求めてメッセージボックスに表示します。

基本の書き方

WorksheetFunction.関数名(引数1, 引数2, ...)

ポイントはたった2つです。

  • WorksheetFunction. のあとに関数名を書く
  • 引数にはRange(セル範囲)やセルの値を渡す

実行するには、VBEでコード内にカーソルを置いて F5キー を押します。マクロダイアログから選んで実行してもOKです。

WorksheetFunctionの仕組みを理解する

セルに書く数式との違い

ワークシート上で =SUM(A1:A10) と書く場合とVBAで呼ぶ場合では、引数の渡し方が異なります。

比較項目ワークシート上VBA(WorksheetFunction)
セル範囲A1:A10Range("A1:A10")
文字列条件"東京""東京"
条件式">100"">100"
戻り値セルに表示変数に格納

引数がArg1, Arg2…で表示される理由

VBEで関数を入力すると、引数名が Arg1, Arg2, Arg3 のように表示されます。「何を渡せばいいの?」と戸惑う方が多いポイントです。

これは、VBA側では引数名を汎用的な名前にしているためです。実際に何を渡すかは、ワークシート関数の仕様に従います。

たとえば WorksheetFunction.VLookup(Arg1, Arg2, Arg3, Arg4) なら:

VBEの表示実際の意味
Arg1検索値
Arg2検索範囲(Range)
Arg3列番号
Arg4検索方法(True/False)

TIP

引数がわからないときは、ワークシートに関数を入力してみるのが一番です。セルに =VLOOKUP( と入力すると引数のヒントが表示されますよ。

使える関数の確認方法

VBEのコード画面で WorksheetFunction. と入力すると、使える関数の候補一覧が表示されます。最後のピリオドを入力した時点で候補が出るので、そこから探してください。

関数名の途中まで入力すれば候補が絞り込まれます。使いたい関数にカーソルを合わせて Tabキー を押すと、コードに反映されます。

候補に表示されない関数は、VBAでは使えません。LEFT、RIGHT、MIDなど、VBAに同名の関数があるものは候補に出ません。

WorksheetFunctionの実践コード

VLOOKUP:別シートから値を検索する

商品コードをもとに、別シートの商品マスタから商品名を取得するコードです。

Sub VlookupExample()
    Dim wsData As Worksheet '--- データシート ---
    Dim wsMaster As Worksheet '--- マスタシート ---
    Dim productName As String '--- 商品名の格納先 ---
    Dim searchCode As String '--- 検索する商品コード ---

    Set wsData = Sheets("データ")
    Set wsMaster = Sheets("マスタ")

    searchCode = wsData.Range("A2").Value

    '--- マスタシートのA:C列からVLOOKUPで検索 ---
    productName = WorksheetFunction.VLookup( _
        searchCode, _
        wsMaster.Range("A:C"), _
        2, _
        False)

    wsData.Range("B2").Value = productName
    MsgBox searchCode & " の商品名は「" & productName & "」です"
End Sub

False を指定して完全一致で検索しています。検索値が見つからない場合は実行時エラーが発生するため、後述のエラー対処法を参考にしてください。

COUNTIF:条件に合うデータを数える

指定した範囲から、特定の条件に一致するセルの個数を数えます。

Sub CountifExample()
    Dim ws As Worksheet '--- 対象シート ---
    Dim cnt As Long '--- カウント結果 ---

    Set ws = ActiveSheet

    '--- B列から"東京"に一致するセルを数える ---
    cnt = WorksheetFunction.CountIf( _
        ws.Range("B2:B100"), _
        "東京")

    MsgBox "東京のデータは " & cnt & " 件です"
End Sub

SUMIFS:複数条件で合計する

部署が「営業」かつ月が「4月」の売上合計を求めるコードです。

Sub SumifsExample()
    Dim ws As Worksheet '--- 対象シート ---
    Dim total As Double '--- 合計金額 ---

    Set ws = ActiveSheet

    '--- 複数条件で売上を合計する ---
    total = WorksheetFunction.SumIfs( _
        ws.Range("D2:D100"), _
        ws.Range("B2:B100"), "営業", _
        ws.Range("C2:C100"), "4月")

    MsgBox "営業部の4月売上: " & Format(total, "#,##0") & " 円"
End Sub

SUMIFS関数の引数の並びはワークシートと同じです。合計範囲が最初で、そのあとに「条件範囲, 条件」のペアを続けます。

複数の関数を組み合わせる

INDEX + MATCHの組み合わせも使えます。VLOOKUPでは検索列より左の値を取得できませんが、この方法なら自由な位置の値を取れます。

Sub IndexMatchExample()
    Dim ws As Worksheet '--- 対象シート ---
    Dim result As Variant '--- 検索結果 ---
    Dim matchRow As Long '--- MATCHの行位置 ---

    Set ws = ActiveSheet

    '--- MATCHで行位置を取得 ---
    matchRow = WorksheetFunction.Match( _
        "商品A", _
        ws.Range("B2:B100"), _
        0)

    '--- INDEXで値を取得 ---
    result = WorksheetFunction.Index( _
        ws.Range("A2:A100"), _
        matchRow)

    MsgBox "商品Aの結果: " & result
End Sub

WorksheetFunctionとApplicationの違い

ワークシート関数をVBAで呼ぶ方法は、実は2つあります。

'--- 方法1: WorksheetFunction経由 ---
result = WorksheetFunction.VLookup(searchVal, rng, 2, False)

'--- 方法2: Application経由 ---
result = Application.VLookup(searchVal, rng, 2, False)

この2つの大きな違いは、エラー時の挙動 です。

比較項目WorksheetFunctionApplication
エラー時の動作実行時エラー(VBAが停止)エラー値を返す(CVErrなど)
エラー対処On Error文が必要IsError関数で判定
コード量やや多いシンプル
処理速度ほぼ同じほぼ同じ
'--- Application経由のエラー処理パターン ---
Dim result As Variant '--- Variantで受ける ---
result = Application.VLookup("検索値", Range("A:C"), 2, False)

If IsError(result) Then
    MsgBox "見つかりませんでした"
Else
    MsgBox "結果: " & result
End If

NOTE

Application経由の場合、戻り値の変数は必ず Variant 型で宣言します。String型やLong型で受けると、エラー値を格納できず実行時エラーになります。

よくあるエラーと対処法

エラー対処表

エラー原因対処法
実行時エラー 1004VLOOKUPやMATCHで検索値が見つからないOn Error文でエラーを捕捉する
実行時エラー 1004引数の数や型が正しくないワークシートで同じ関数を試して引数を確認する
実行時エラー 438使用できない関数を呼び出したVBEの候補一覧で使える関数か確認する
コンパイルエラーWorksheetFunctionのスペルミスWorksheetFunction の綴りを確認する
意図しない結果範囲指定の間違いRange(“A1:A10”)のようにダブルクォーテーションで囲む

検索系関数のエラー対処コード

VLOOKUPやMATCHは検索値が見つからないとエラーになります。On Error で対処しましょう。

Sub SafeVlookup()
    Dim result As Variant '--- 検索結果 ---

    On Error Resume Next
    result = WorksheetFunction.VLookup( _
        "検索値", Range("A:C"), 2, False)
    On Error GoTo 0

    If IsEmpty(result) Then
        MsgBox "データが見つかりませんでした"
    Else
        MsgBox "結果: " & result
    End If
End Sub

On Error Resume Next でエラーを無視します。直後に On Error GoTo 0 で通常モードに戻します。検索が失敗した場合、resultは空のままです。IsEmpty で判定できます。

マクロ有効ブック(.xlsm)での保存

WorksheetFunctionを含むマクロは、通常の .xlsx 形式では保存できません。「ファイル」→「名前を付けて保存」で「Excelマクロ有効ブック(.xlsm)」を選んでください。

.xlsx で保存するとマクロが削除されるため注意が必要です。

TIP

マクロの記録では自動生成されるコードにWorksheetFunctionは含まれません。WorksheetFunctionを使うコードは、手書きで作る必要があります。

まとめ

VBAのWorksheetFunctionを使えば、Excel関数の機能をマクロ内でそのまま活用できます。

ポイントをおさらいしましょう。

  • 基本の書き方: WorksheetFunction.関数名(引数) で呼び出す
  • 引数の渡し方: セル範囲は Range("A1:A10") で指定する
  • エラー対処: VLOOKUPやMATCHは検索失敗でエラーになるため、On Error で備える
  • Applicationとの違い: Application経由ならエラー値で返る。Variant型で受けること
  • 使える関数の確認: VBEで WorksheetFunction. と入力して候補を確認する

関数の知識があるほど、WorksheetFunctionで書けるコードの幅が広がります。VBAの勉強と合わせて、ワークシート関数の使い方も覚えておくと効率的ですよ。


関連記事

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