Excel VBA を使用しているとき、WorksheetFunction で MATCH 関数を使って該当の行や列の番号を調べることがよくあります。
『*』(ワイルドカード)を使って調べる事もでき、とっても便利なのでよく使っています。
ただ先日、MATCH 関数で引っかからなかったケースがあって…。
=MATCH("あ*",A:A,0)
A列(1列目)には、確かに『あ』から始まっているセルが存在しているのに、なぜエラーになってしまったのか…?
確認したら、255文字の壁でした。
検索してほしいセルの内容が、
あああああああああああああああああああああああああああ…(合計256個以上の『あ』)
だったためです。
(実際は『あ』の羅列ではなく、セルの中に文章が入っています)
またお前か!
試しに
あああああああああああああああああああああああああああ…(合計255個まで減らした)
としたところ、ちゃんと行番号を返してくれました。
困りました。
どうしても行番号が知りたい…。
これは、上から順番に見ていって、合致したらその番号を返す、というのを『For ~ Next』と『Like 演算子』とかでやらなきゃいけないのか…?
と思いきや、調べてみたら『XMATCH 関数』というのがあるではありませんか!
『XMATCH 関数』は比較的最近追加された関数で、『MATCH 関数』の上位互換的な存在のようです。
MATCH(検索値, 検索範囲, 照合種類)
↓
XMATCH(検索値, 検索範囲, 一致モード, 検索モード)
XMATCH 関数は引数が1個増えていました。
その引数『一致モード』の中に『2 (ワイルドカードの文字と一致する)』というのがあり、これが今回役に立ったのです。
先ほど
=MATCH("あ*",A:A,0)
と書いていたものを、
=XMATCH("あ*",A:A,2)
と書き換えたところ、ちゃんと行番号を返してくれました!
わーい。
ここで
=XMATCH("あ*",A:A,0)
とした場合、やっぱりエラーになってしまったので、ワイルドカードを使うときはやっぱり3つ目の引数を『2』にしなきゃいけないようです。
『MATCH』の先頭に『X』を付けるだけの修正だとだめだ、ということですね。
4つ目の引数の『検索モード』も、一致文字を上から探していくのか下から探していくのかを指定できるようで、それも便利そうですね。
まだ使ってないけど。
『XLOOKUP 関数』はすごく便利で画期的でありがたく使わせてもらっていたんですが、『XMATCH 関数』は完全にノーマークだったので、嬉しい誤算でした。
ただ、先日の『チェックボックス』機能同様、Excel のバージョンによっては使えないこともあるので、人に渡すファイルなんかの場合は注意が必要ですね。
いやー、ちゃんと新しいことも知っておかないと損するなー、と改めて思った出来事でした。
コメント