[ 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

これでようやくエラーが出ずに処理をすることができます。

前の記事:
管理しないというパスワード管理
次の記事:
はてブいじりをリニューアルしました!