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:A10 | Range("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つの大きな違いは、エラー時の挙動 です。
| 比較項目 | WorksheetFunction | Application |
|---|---|---|
| エラー時の動作 | 実行時エラー(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型で受けると、エラー値を格納できず実行時エラーになります。
よくあるエラーと対処法
エラー対処表
| エラー | 原因 | 対処法 |
|---|---|---|
| 実行時エラー 1004 | VLOOKUPや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の勉強と合わせて、ワークシート関数の使い方も覚えておくと効率的ですよ。
