[ VBA ] セルの検索で見つからなかったときに起こるエラーの回避策
以前にも書きましたが、今、ココナラというサイトで、エクセルマクロやエクセルのことでの相談を500円で受け付けているんですね。大体月一くらいのペースで売れているんですけれども、先日また売れまして、そのときに作ったプログラムの中で、他の場合でも参考になりそうなことを書いてみたいと思います。
セルの検索での微妙な罠
VBAで、セルの検索をすることってよくあるんですが、実はここには微妙な罠が仕掛けられているんですね。マクロの記録を使うとですね、こういう内容のプログラムが記録されます。
Cells.Find(What:="aaa", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ , MatchByte:=False, SearchFormat:=False).Activate
「aaa」で検索するという内容です。検索ワードがWhatのあとに来るわけですね。他の項目は、エクセルで検索した時のオプションを見れば大体わかるかな、と思います。もし、単にあるかないかだけ調べたいのであれば、他のオプションは全部捨てて、これだけで十分かと思います。
Cells.Find(What:="aaa").Activate
で、ここで使っている「Find」っていうメソッドなんですが、返り値がRangeオブジェクトなんですね。検索して見つかれば、そのセルがアクティブになる、と。
しかし、問題は検索して見つからなかった時です。このとき、Findメソッドは、「Nothing」っていうのを返すんですね。このNothingってのは、Activateできないんで、上のプログラムを実行したら、「オブジェクト変数またはWithブロック変数が設定されていません。」というエラーが出ます。
検索して見つからなかったらエラーっていうのは不便です。なので、少し改造してやらないといけません。記録マクロをそのまま使えないんですね。
セルの検索での微妙な罠を回避する方法
まぁ、改造といってもやることは簡単で、返り値がNothingかどうか調べてやればいいだけです。しかし、下のようにやるとエラーが出てしまいます。
foundCell = Cells.Find(What:="aaa")
上でも書いたように、返り値はRangeオブジェクトなので、Setステートメントを使わないといけません。これらを踏まえると、次のように書く必要があります。
Dim foundCell As Range Set foundCell = Cells.Find(What:="aaa") If foundCell Is Nothing Then '見つからなかった時の処理 Else '見つかった時の処理 End If
これでようやくエラーが出ずに処理をすることができます。
- 前の記事:
- 管理しないというパスワード管理
- 次の記事:
- はてブいじりをリニューアルしました!