VBAでワークシート関数を使う

VBAの中でもExcelワークシート関数が使えます。
書式は次の通りです。

WorksheetFunction.関数名(値、または、Range(範囲の文字列))

関数名の前に「WorksheetFunction.」、セル範囲はRangeで囲みます。
それぞれの関数をこのようなワークシートで説明していきます。

COUNT関数

セルC1にA列のデータ個数を求めるには次のように考えます。
VBAの中でCOUNT関数を使えば、ループの回数を決めることができます。

Sub jikken()
Range(“C1”) = WorksheetFunction.Count(Range(“A:A”))
End Sub

この結果は、5です。

COUNTA関数

COUNT関数は数値の個数しか数えませんので、数えるものが商品名の場合は文字列でも数えるCOUNTA関数を使います。

Sub jikken()
Range(“C1”) = WorksheetFunction.Count(Range(“B:B”))
End Sub

この結果は、5です。

VLOOKUP関数

VLOOKUP関数もVBAで使えます。

Sub jikken()
Range(“C1”) = WorksheetFunction.VLookup(3, Range(“A:B”), 2, False)
End Sub

この結果は、Cです。
次のようにセルの値を検索してそのVLOOKUP関数を求めることもできます。

Sub jikken()Range(“C1”) = WorksheetFunction.VLookup(Range(“A1”).Value, Range(“A:B”), 2, False)
End Sub

この結果は、Aです。
セルA1のValueを求めているのは、検索するのはA1の「値」を使うからです。Rangeだけの場合は、そのセル自体として検索するので、VLOOKUP関数の動作としては正確ではありません。ただし、動作は正常にします。あくまで値と明記するかどうかの違いですが、このVBAを見た人に対して、このVBAを作った人は動作を理解して作成していることをアピールできます。

関数の組み合わせ

関数の組み合わせもできます。
INDEX関数とMATCH関数の組み合わせでVLOOKUP関数の代替えとすることができますが、それを再現し、セルC1にB1からB5の範囲の中からBを求めてA列の同じ行の値を求めるには次の数式です。

Range(“C1”) = WorksheetFunction.Index(Range(“A1:A5”), WorksheetFunction.Match(“B”, Range(“B1:B5”), 0))

この結果は、2です。
関数ごとに関数名の前には「WorksheetFunction.」、Rangeを指定するので面倒ですが仕方ありません。
ただし、エラー回避の関数の組み合わせでは注意が必要です。

Range(“C1”) = WorksheetFunction.IfError(WorksheetFunction.VLookup(7, Range(“A:B”), 2, False), “エラー”)

このVLOOKUP関数の結果、エラーとなった場合、Excelのワークシート関数ではエラーと判定し、「エラー」の文字を出せます。しかし、VBAは計算式が間違ってエラーが出た場合、動作が止まり、エラーメッセージが出るようになります。

もしこの動作をさせたいときは、OnErrorなどのエラー処理が別途必要になります。

まとめ

VBAでは値を集計するのに様々な手段を使うことができますが、今回紹介したVBA内でExcelワークシート関数を使う方法と、Excel関数をワークシート上で使って求めた値のValueで取り込む方法もあります。また、自分でオリジナルの処理ルーチンを作ることもできます。

それぞれ合った方法で利用しましょう。

コメント

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