基礎から学ぶVBAプログラミング教室

もりさんのお題を解きながら楽しく勉強しよう

スポンサーリンク

【ExcelVBA】セル範囲に指定データがあるか検索したい(Findメソッド使用)

この記事では下記の2点を紹介します。

1.指定のセル範囲に指定のデータ(文字列や数値)が存在するか否かをFindメソッドで検索する処理

2.Findメソッドの返り値であるオブジェクト型変数の比較演算のイメージ


マクロ作成でかかせない検索処理をしっかり理解していきましょう!

f:id:excel-accounting:20180427210304p:plain:w400

Findメソッドとは

機能:指定のセル範囲を検索する
返り値:Rangeオブジェクト

※検索の結果、指定のデータが見つからなかった場合Nothingという値を返す


Findメソッドの機能詳細は他の書籍や記事にたくさん書かれているので、ここでは割愛します。

ノンプログラマーによるノンプログラマーのためのやさしい解説(図解付き)が当ブログの売りですので、ここから下をしっかり読んでいってくださいね。
f:id:excel-accounting:20180424115417p:plain:w150

具体例をみてみよう

【検索範囲と検索数値】
A1~C3のセル範囲に、数字の1~9が「あるかないか」をチェックします。

なお、この例では、それぞれの数字が「どのセルにあるか」までは特定せず、指定の範囲に「あるかないか」のみをチェックします。

f:id:excel-accounting:20180427144023p:plain:w200


【サンプルコード】

Sub findmacro()

    '検索範囲のセル(Range)を指定する
    Dim SearchArea As Range
    Set SearchArea = Range(Cells(1, 1), Cells(3, 3)) '(=A1:C3)
    
    For num = 1 To 9
    
        '指定の検索範囲を検索する
        Dim result As Range
        Set result = SearchArea.Find(what:=num, LookAt:=xlWhole)
        
        '①検索範囲にnumが見つからなかった場合
        If result Is Nothing Then
            Debug.Print num & "は見つかりませんでした"
        End If
        
        '②検索範囲にnumが見つかった場合
        If result Is Nothing = False Then
            Debug.Print num & "が見つかりました"
        End If
    
    Next num

End Sub

【結果】
1が見つかりました
2は見つかりませんでした
3が見つかりました
4は見つかりませんでした
5が見つかりました
6は見つかりませんでした
7が見つかりました
8は見つかりませんでした
9が見つかりました

やさしい解説

解説を読んでいただくにあたっての大前提を最初に書きますね。

オブジェクト型変数の比較演算子はIsです。


【データ型による比較演算子の違い】

・文字列(String)や数値(Long)の比較演算子 =(イコール)

・オブジェクト型変数の比較演算子 Is

プログラミングを勉強していると「比較」には=(イコール)を使うイメージが強いですよね。

なぜIsを使うのか、筆者なりのイメージをお伝えしますね。

【オブジェクト比較のイメージ図】
英語で「彼はTomです」をHe is Tomといいますよね。

彼は「人間」という「オブジェクト」だからです。

f:id:excel-accounting:20180428200355p:plain:w300

この前提を踏まえて、VBAコードを図解していきます。

検索範囲に指定データが見つからなかった場合の記述

【図解】

f:id:excel-accounting:20180427170134p:plain:w400

Findメソッドは「検索の結果、指定のデータが見つからなかった場合Nothingという値を返す」という性質でしたね。

なので、オブジェクト変数resultにNothingが格納されている、つまり「指定のデータが見つからなかった」ということです。

検索範囲に指定データが見つかった場合の記述①

さて、ここまではなんとなく理解できても、

If result Is Nothing = False Then

は、「If文の構造は理解してるけどこの記述がピンとこない」という方いますよね?

筆者も最初に見たときは、

(Is NothingがFalseってどういうこと?)
f:id:excel-accounting:20180424112139p:plain:w150

って思いました。

【図解】

f:id:excel-accounting:20180427193910p:plain

(参考)
見つからなかった場合は = False を書くのに、見つかった場合は何も書かないの?と思ったVBA入門者の方、鋭いです!


上述の「指定データが見つからなかった場合」の正確な記述は
If result Is Nothing = True Then
です。
意味:[ result Is Nothing ]がTrue(正しい)であるならば
=[ result Is Nothing ]であるならば


(= True) が省略されて、
If result Is Nothing Then
となっています。
(= Trueを省略すると、真の場合となります)

検索範囲に指定データが見つかった場合②

実はこのような書き方もあるんですよ。
If Not result Is Nothing Then

「Not」は論理否定といって、「~ではない」という意味です。

【Notのイメージ図】
f:id:excel-accounting:20180428200421p:plain:w350

本題のVBAコードです。

【図解】
f:id:excel-accounting:20180427182339p:plain:w500

NothingNotで打ち消すイメージです。

「否定の否定」は肯定ですよね。


さて、ここまでいかがでしたか?

どちらの書き方が正しい、というのはないと思います。

自分が「理解しやすいほう」「イメージしやすいほう」を使用してくださいね。

まとめ

・Findメソッドの返り値はRangeオブジェクト(オブジェクト型変数)である。

・Findメソッドで指定データが見つからなかった場合、Nothingという値が返る。

・オブジェクト型変数の比較演算子は「Is」である。

・論理否定Notをうまく使いこなそう。


さて、Findメソッドを使う「セル範囲のデータ検索」は、この連載企画で重要なポイントになってくるんですよ。

ぜひこちらもご覧くださいね!
www.excel-prog.com

スポンサーリンク