VBAには独自の関数が多数用意されていますが、普段Excelのセルで使い慣れている便利なワークシート関数(SUM
, COUNTIF
, VLOOKUP
など)をマクロの中でも使いたい、と思う場面は非常に多いです。
VBAのWorksheetFunction
オブジェクトを使えば、これらのワークシート関数をVBAコードの中から直接呼び出すことができます。この記事では、その基本的な使い方と、特にVLOOKUP
などで重要になるエラー処理のテクニックを解説します。
基本的な使い方 (WorksheetFunction
オブジェクト)
VBAからワークシート関数を利用するには、WorksheetFunction
オブジェクトを介して呼び出します。
Application.WorksheetFunction.関数名(引数)
Application
は省略可能なため、多くの場合WorksheetFunction.関数名(引数)
と記述します。
コード例(SUM関数)
Sub UseSumFunction()
' 変数を宣言します
Dim targetRange As Range
Dim result As Double
' 合計したいセル範囲を設定
Set targetRange = ThisWorkbook.Worksheets("Sheet1").Range("C2:C10")
' WorksheetFunction.Sum を使って合計値を計算
result = WorksheetFunction.Sum(targetRange)
' 結果を表示
MsgBox "指定範囲の合計値は " & result & " です。"
End Sub
このように、SUM
やAVERAGE
、MAX
といった、引数が正しければ通常エラーにならない関数は非常に簡単に利用できます。
【最重要】エラー処理の違いについて (VLOOKUP, MATCHなど)
問題は、VLOOKUP
やMATCH
のように、検索値が見つからない場合にエラーを返す可能性がある関数の扱いです。
セル上でVLOOKUP
が見つからない場合は「#N/A」というエラー値が表示されますが、VBAのWorksheetFunction
で同じ状況になると、マクロが実行時エラーで停止してしまいます。 これを防ぐためには、エラー処理の方法を知っておく必要があります。
方法1:On Error を使ってエラーを回避する
伝統的なエラーハンドリングです。On Error Resume Next
でエラーを無視させ、エラーが発生したかどうかをErr.Number
で判定します。
Sub Vlookup_WithErrorHandling_OnError()
Dim result As Variant
Dim lookupValue As String
lookupValue = "商品C" ' 検索する値
On Error Resume Next ' エラーが発生しても次の行へ進む
result = WorksheetFunction.VLookup(lookupValue, Range("A1:B10"), 2, False)
On Error GoTo 0 ' エラー処理を元に戻す
If IsEmpty(result) Then ' エラーが発生した場合、resultはEmptyになる
MsgBox lookupValue & " は見つかりませんでした。"
Else
MsgBox "結果: " & result
End If
End Sub
方法2:Applicationオブジェクトで直接呼び出す(推奨)
よりスマートで推奨される方法が、WorksheetFunction
を介さず、Application
オブジェクトから直接関数を呼び出す方法です。
この方法の場合、関数がエラーになってもマクロは停止せず、戻り値としてエラー値(Variant/Error型)が返されます。 これをIsError
関数で判定するのが定石です。
Sub Vlookup_WithErrorHandling_IsError()
Dim result As Variant
Dim lookupValue As String
lookupValue = "商品D" ' 検索する値
' Applicationから直接VLookupを呼び出す
result = Application.VLookup(lookupValue, Range("A1:B10"), 2, False)
' IsError関数で、戻り値がエラー値かどうかを判定
If IsError(result) Then
MsgBox lookupValue & " は見つかりませんでした。(IsErrorで判定)"
Else
MsgBox "結果: " & result
End If
End Sub
この方法はコードがシンプルになり、意図も分かりやすいため、エラーが発生しうる関数を扱う際にはこちらの利用を強くお勧めします。
まとめ
VBAでワークシート関数を使う際のポイントは以下の通りです。
- 基本:
WorksheetFunction.関数名(引数)
の形で呼び出す。 - エラーの可能性がない関数 (
SUM
,MAX
など):WorksheetFunction
をそのまま使って問題ない。 - エラーの可能性がある関数 (
VLOOKUP
,MATCH
など):Application.関数名(引数)
の形で呼び出し、- 戻り値を**
IsError
関数で判定する**のが最も安全で推奨される。
ワークシート関数の強力な計算能力をVBAに取り入れることで、複雑なロジックを自分で組む必要がなくなり、コードを大幅に簡潔にすることができます。