皆さん、こんにちは。Excel VBA講師の「VBA道場」へようこそ。
前回はVBAの基本中の基本、セルへの値の代入や基本的なループ処理についてお話ししましたが、いよいよ今回は「実務で最も差がつく」データ集計のテクニックに踏み込んでいきます。
皆さんは普段、Excelで特定の条件に一致するデータを数える際、どの機能を使っていますか? おそらくほとんどの方が「COUNTIF関数」と答えるでしょう。しかし、VBAを書く際に「ワークシート関数をわざわざ呼び出すのは遅いのでは?」と考えて、わざわざ自分で複雑なループ処理を書いていませんか?
実は、VBAにおいて「ワークシート関数(WorksheetFunction)」を適切に使いこなすことは、コードの可読性を高め、かつ処理速度を最適化するための極めて重要なスキルなのです。本日から全6回にわたり、COUNTIF関数をVBAで自在に操るための活用技を徹底解説していきます。
なぜVBAでCOUNTIF関数を使うのか?
VBAを書く上で、初心者が陥りがちな罠があります。それは「何でもかんでもループ(For EachやFor Next)で処理しようとする」ことです。
例えば、1万行あるデータの中から、「A列にある『完了』という文字の数を数えたい」というケースを考えてみましょう。ループを使って実装すると、以下のようになります。
Dim count As Long
Dim i As Long
For i = 1 To 10000
If Cells(i, 1).Value = “完了” Then
count = count + 1
End If
Next i
確かにこれでも動きます。しかし、VBAのループ処理は、データ量が増えれば増えるほど実行時間が長くなります。一方で、Excelの組み込み関数である「COUNTIF」は、C++等の低レイヤー言語で最適化されており、圧倒的に高速です。
VBAからこの関数を呼び出すことで、コードはたった1行に短縮され、処理速度も向上します。これが、プロのVBAエンジニアが「ワークシート関数」を愛用する理由です。
VBAからCOUNTIFを呼び出す基本構文
VBAでワークシート関数を使うには、`Application.WorksheetFunction` オブジェクトを使用します。
Dim result As Long
result = Application.WorksheetFunction.CountIf(Range(“A:A”), “完了”)
この一行だけで、A列全体から「完了」という文字が含まれるセルを瞬時にカウントできます。ポイントは以下の3点です。
1. **範囲指定の柔軟性**: `Range(“A:A”)`だけでなく、`Range(“A1:A100”)`や、`Range(Cells(1,1), Cells(100, 1))`といった動的な指定も可能です。
2. **条件式の指定**: 第二引数には文字列だけでなく、比較演算子を含めることができます。例えば `”>100″` と指定すれば、100より大きい数値をカウントできます。
3. **エラーハンドリング**: もし関数が計算できない場合(例えば範囲が不正など)、この書き方だとVBA自体がエラーで停止します。実務では `Application.CountIf`(WorksheetFunctionを省略)を使うと、エラー時に値を返してくれるため、安全に処理を継続できるテクニックもあります。
業務改善の現場でよくある活用例:重複チェック
COUNTIFの最も強力な使い道の一つが「重複チェック」です。例えば、顧客リストに同じ名前が二重登録されていないかを確認したい場合、VBAで以下のように書くことができます。
Sub CheckDuplicates()
Dim r As Range
For Each r In Range(“A1:A100”)
If Application.WorksheetFunction.CountIf(Range(“A1:A100”), r.Value) > 1 Then
r.Interior.Color = vbYellow ‘ 重複していたら黄色くハイライト
End If
Next r
End Sub
このコードは、「自分自身が範囲内に何個存在するか」を数えています。もし結果が1より大きければ、それは「重複している」と判断できるわけです。このように、COUNTIF関数を条件判定に組み込むことで、複雑なロジックをわずか数行で実装できます。
次のステップへ向けて
今回は、COUNTIF関数をVBAで呼び出すメリットと、その基本的な使い方について解説しました。単に「数を数える」だけの関数と思われがちですが、VBAと組み合わせることで、データのクレンジングや重複排除、条件付きの集計など、活用の幅は無限に広がります。
次回(第2回)は、「可変範囲をどう扱うか?」というテーマに焦点を当てます。データ量が増減する実務ファイルにおいて、どのようにCOUNTIFの範囲を自動で取得するか、そのテクニックを伝授します。
VBAの学習は「知っているか、知らないか」の差が非常に大きい世界です。ぜひ、今日学んだコードを自分のエディタに書き写し、実際に動かしてみてください。エラーが出たら、それは成長のチャンスです。
それでは、次回の講義でお会いしましょう。皆さんの業務効率が、VBAによって劇的に改善されることを願っています!
—
(※本記事は全6回の連載の第1回目です。次回以降、より高度な動的範囲指定や、複数条件のCOUNTIFS関数、さらには配列を組み合わせた爆速集計テクニックへと進んでいきます。)
