VBAでセル範囲を検索する方法について、皆さんはご存知でしょうか?
今回の記事では、複数ある検索方法の中から、MATCH関数について解説していきたいと思います。
- MATCH関数とは?どうやって使うの?
- INDEX関数と組み合わせて使う応用テクニック
- 他の検索方法との使い分け方
といった、基礎的な内容から応用的な方法まで、詳しく紹介します!
MATCH関数とは?
MATCH関数とは、指定した範囲内での検索を行い、対象の値が上から何番目に位置するのかを求めることができる関数です。以下のように、「WorksheetFunction」というオブジェクトを使用することで、ワークシート関数が扱えるようになります。
WorksheetFunction.Match(検索値, 検索範囲, 検索方法)
また、検索方法には以下の3つのいずれかを入力して指定することができます。
- 0:検索値と完全一致するものを検索
- 1:検索値以下の値の中から最大値を検索
- -1:検索値以上の値の中から最小値を検索
こちらは省略が可能で、指定しなかった場合には1を入力したとみなされます。
ただし、1を指定する場合はデータを昇順に、-1を指定する場合は降順に、それぞれ事前に並べ替えておく必要があるので注意が必要です。
サンプルコードを交えて使い方を解説
実際のサンプルコードを元に、それぞれ動きを見てみましょう。
まずは、商品名を並べたシートを用意してみました。
【サンプル用シート】
この中から、指定した名前の商品が何番目にあるかを検索して、結果をダイアログに表示してみます。
【サンプルコード】
Sub sampleMatch1()
Dim index As Integer
index = WorksheetFunction.Match("いちご", Range("A2:A6"), 0)
MsgBox index & "番目にあります"
End Sub
【実行結果】
A2〜A6の中で、いちごは上から3番目に入力されているので、関数の結果で3が返却されているのが分かるかと思います。
次に、商品ごとの個数をシートに入力して、検索方法に1と-1を指定した場合の結果をそれぞれ見てみましょう。
まずは、1を指定した場合のサンプルです。シートの個数は、昇順になるように入力します。
【サンプル用シート】
【サンプルコード】
Sub sampleMatch2()
Dim index As Integer
index = WorksheetFunction.Match(55, Range("B2:B6"), 1)
MsgBox index & "番目が最大値です"
End Sub
【実行結果】
検索値に55を指定したので、検索対象は55以下の数値になります。その中で1番大きいのはバナナの50個になるので、関数の結果は4が返却されています。
次に、-1を指定した場合を見てみます。こちらは反対に、個数が降順になるように入力しなければいけません。
【サンプル用シート】
【サンプルコード】
Sub sampleMatch3()
Dim index As Integer
index = WorksheetFunction.Match(55, Range("B2:B6"), -1)
MsgBox index & "番目が最小値です"
End Sub
【実行結果】
検索値は同じ55ですが、この場合は55以上の数値が対象になります。最小値はりんごの60個なので、結果は1が返却されます。
INDEX関数と組み合わせてVLOOKUP関数のように使う方法を解説
MATCH関数の基本的な使い方はこれまで説明した通りですが、ExcelではINDEX関数とMATCH関数を組み合わせることでVLOOKUP関数のように使うこともできます。
何万、何十万とある膨大なデータを扱う場合、VLookup関数を使用すると処理に時間がかかりすぎてしまいますが、この方法を使うことで大幅に短縮することができるのです。
INDEX関数は、引数に入力したセル範囲の中から、指定された行と列が交差する位置にあるセルの参照を返します。
INDEX(範囲, 行番号[, 列番号])
この性質を利用して、行番号に数値を入れる代わりにMATCH関数を使用すると、VLOOKUP関数と同じような結果が得られます。
実際のサンプルコードを見てみましょう。
今回は、先ほど使用したサンプルシートの中から、検索した商品の個数を抜き出すコードを記述してみました。
【サンプル用シート】
【サンプルコード】
Sub sampleIndex_Match()
Range("E4").Formula = "=INDEX(A2:B6, MATCH(D4, A2:A6),2)"
End Sub
【実行結果】
このように、行番号にMATCH関数を使用することで、VLOOKUP関数と同じように検索内容に応じて自動で行番号が得られるようになります。
VLOOKUP関数の場合、検索値を参照する列を一番左側に配置する必要があり、その範囲より左側にあるセルの情報を取得することができないので、そうしたケースにもこの方法は役立ちます。是非とも覚えておくといいでしょう。
FINDメソッドとの使い分けはどうする?
指定したセル範囲から値を検索する方法の1つに、Findメソッドがあります。
それぞれの方法について、使い分けはどうすればいいの?と感じる方もいるかもしれません。
主なポイントは以下の3つです。
- 情報が行や列ごとに揃っているか
- 扱うデータに書式や数式などが含まれているか
- 扱うデータが多いか少ないか
MATCH関数やVLOOKUP関数は行や列ごとの検索を行うので、基本的に特定のジャンルごとにデータが揃えられていることを前提に使用をします。
値が無造作に置かれている状況ではうまく検索することができないので、そうした場合にはFindメソッドを使用するといいでしょう。
また、Findメソッドはセルの値だけでなく、書式や数式なども検索対象とすることができます。
Match関数はセルの値だけを検索するので、検索する内容によっては上手く機能しない可能性もあります。状況に合わせて使い分けをしましょう。
一方で、膨大な数のデータを扱う場合、Findメソッドは処理にかなりの時間を要してしまうので使用に向いていません。
例えば、とある数値を指定の範囲内から検索する作業を1万回繰り返したとします。環境などにもよりますが、Match関数の場合は遅くても数秒ほどで処理が終わるのに対し、Find関数は30秒近く時間がかかってしまいます。
そのため、大量のデータを扱う必要がある場合には、Findメソッドは使用を避けるのがベストです。
まとめ
いかがでしたでしょうか?
Match関数の他にも、似たような検索方法がたくさんあるので、初めのうちは関数の使い方やどれを使うべきかで迷ってしまうかもしれません。
そんな時はぜひ、今回の記事を見返して参考にしてみてください!
関連記事
- VBAとは
- Excelで覚えておくべき17の基本関数と目的別逆引き一覧
- オートフィルターの設定・解除方法
- メッセージボックスの設定方法
- セルの値を取得・上書きするValueプロパティの使い方を解説
- 【Excel VBA】Functionの使い方を解説(宣言・引数、戻り値の指定、応用法)
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。