エクセルのワークシート上にある文字列や数値を検索したいときってありますよね。
Ctrl + Fの検索機能やソート機能、フィルタ機能を使う方法の他、ワークシート関数のVLOOKUP関数、VBAでのFINDメソッドを使う方法など、いろいろな解決法が考えられます。
オススメはMATCH関数を使う方法です。
MATCH関数はワークシート関数ですが、ワークシートファンクションを使うとVBAでも使うことができます。
この記事では、『VBAでも使えるMATCH関数で、任意の文字列を検索する方法』について解説します。
1. MATCH関数をオススメする理由
こんにちは。エクセルマン・ブリーダーのしもむぎ(@re_znd13)です。
MATCH関数はあるセル範囲にある文字列や数値を検索して、それがどの位置にあるかを返すシンプルな関数です。
このシンプルさが一番のメリット!
VLOOKUP関数やFINDメソッドは単体で複雑な検索も可能ですが、多くのデータを扱う場合には時間がかかってしまうデメリットもあるんです。
MATCH関数はシンプルな分、処理時間がそれほどかかりません。
その上、他の関数とも組み合わせやすいのでオススメなんです。
2. MATCH関数の使い方
MATCH関数の基本的な使い方について見ていきましょう。
書式としては『MATCH(検査値,検査範囲,[照合の型])』となります。
検査値には数値、文字列、論理値を指定します。セル参照も可能です。
検査範囲には検索するセル範囲を指定します。
照合の型には1、0、-1の引数を指定します。引数の意味は以下の通りです。
・1:検査値以下の最大値を検索。昇順である必要があります。
・0:検査値と等しい最初の値を検索。
・-1:検査値以上の最小値を検索。降順である必要があります。
省略する場合、1となるので注意が必要です。
0を指定したとき検査値としてワイルドカード文字(?や*)を使用することもできます。
そして、MATCH関数が返すのは検査値の相対位置となります。
検査範囲に行を指定したら検査範囲内で何列目に検査値があるか、
検査範囲に列を指定したら検査範囲内で何行目に検査値があるか、が返ってくるわけです。
3. INDEX関数と組み合わせて威力を発揮
MATCH関数でわかるのは検査値の相対位置なので、多くの場合、他の関数と組み合わせて使用します。
相性がよいのはINDEX関数です。
INDEX関数は、行と列を指定することでそのセルの値を返してくれる関数です。
例えば、『INDEX(A3:G3,3)』とすればA~G列の3行目の中で3列目のセルの値を返してくれます。
『INDEX(B12:B18,6)』とすればB列の12~18行の中で6行目のセルの値を返してくれます。
この3や6という数値(相対位置)はMATCH関数で求められるのですから、INDEX関数とMATCH関数の組み合わせで任意のセルの参照が可能となる、というわけです。
4. VBAでMATCH関数を使う方法
ここまで、ワークシート上でのMATCH関数の使い方を見てきました。
次に、VBAでMATCH関数を使うことを考えてみましょう。
図のような表があります。ある機器の電気的な入力と出力を測定したものです。これらの測定値から入力力率というものを求めてみます。
※入力力率は入力電力 / (入力電圧 * 入力電流)という簡単な式で求められます。
MATCH関数やINDEX関数はワークシート関数なので、ワークシートファンクションを使って記述します。
記述例は以下の通りです。
Sub 力率を求める例()
Dim pi, vi, ii, pf As String
Dim x, y, z As String
x = WorksheetFunction.Match("入力電力", Range("A:A"), 0)
pi = WorksheetFunction.Index(Range("B:B"), x)
y = WorksheetFunction.Match("入力電圧", Range("A:A"), 0)
vi = WorksheetFunction.Index(Range("B:B"), y)
z = WorksheetFunction.Match("入力電流", Range("A:A"), 0)
ii = WorksheetFunction.Index(Range("B:B"), z)
pf = pi / (vi * ii)
Cells(11, 2).Value = pf
End Sub
5. まとめ
この記事では『MATCH関数を使って任意の文字列を検索する方法』を解説しましたが、いかがでしたか?
シンプルな関数だからこそ、使い方も多様です。使いこなしていきたいですね。