特定の情報を検索してマークを付ける (Findメソッドの使い方 2)

Question 49.7 Previous Next
7列目のセルにいろんな地名があるとします。東京都・名古屋市・大阪市・京都市のように。
2行目からデータのある行まで検索して、もし京都市があれば、となりのセルに印(●)を入れるというマクロを教えて下さい。
下のように考えましたが、全然ダメです。簡単すぎるのでしょうか?
For i = 2 To y
    If Cells(i, 7).Find(what:="京都市") Then
        Cells(i, 8).Value = "●"
    End If
Next
Answer   Copyright (C) 2001.10.27 永井善王
7列目にある地名には、同じものはないのでしょうか?
もしも 1つだけしかないのであれば、
特定の情報が含まれている最初のセル番号を取得するには? ( Findメソッドの使い方・その1 ) のページを参考にしてください。
質問文には、For...Nextで「2行目からデータのある行まで検索して」とありますので、同じ地名が複数あれば、それぞれに●印を付けたいと解釈して回答します。

school Findメソッド(Rangeオブジェクトの場合)
指定されたセル範囲の中で特定の情報を検索して、見つかった最初のセル(Rangeオブジェクト)を返してくれます。見つからなかった場合は、Nothing が返ります。

構文
expression .Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

引数 What は、検索するデータを文字列などで指定します。あなたのコードでは "京都市"となっています。全部で 9個の引数がありますが、詳しく知りたければ
Findメソッドの引数一覧表 のページで見ていただくことにして、1つだけ重要な注意点を解説しておきます。

引数を省略した場合の注意事項
What以外の引数は省略可能ですが、省略すると既定値が使われるものと、直前で使用されたときの値が使われるものとがあります。そのため LookIn, LookAt, SearchOrder, MatchByte は明示的に指定したほうが安全です。

サンプルマクロ
いろいろな組み方があるかと思いますが、下記に例示します。
'------------------------------------------------------------------------------
Sub 特定の情報を検索してマークを付ける_複数ある場合()
12  Worksheets("Sheet1").Activate               'シートをアクティブにする
13  検索範囲 = "G2:G8"                          '検索するセル範囲を指定する
14  検索文字 = "京都市"                         '検索する情報を指定する
15  置換列 = 8                                  'マークを付ける列番号を指定する
16  置換文字 = "●"                             'マークを指定する
17  With Range(検索範囲)              'このオブジェクトに対して以下のステートメントを実行
18      Set 結果セル = .Find(検索文字, LookIn:=xlValues, SearchOrder:=xlByRows)
19                                           '検索して見つかった場合は最初のセルを返す
20      If Not 結果セル Is Nothing Then         'もし1つ目が見つかった場合は
21          最初アドレス = 結果セル.Address       '最初のセルのアドレスを取得しておく
22          Do                                  '以下のステートメントを繰り返す
23              Cells(結果セル.Row, 置換列).Value = 置換文字 'マークを付ける
24              Set 結果セル = .FindNext(結果セル) '見つかったセルの次から検索を続行する
25          Loop While Not 結果セル Is Nothing And 結果セル.Address <> 最初アドレス
26                                           '最初と違うアドレスで見つかったら繰り返す
27      End If
28  End With
End Sub
'------------------------------------------------------------------------------
ポイント
各コードにコメントを付けておきましたので大体は分かるかと思いますが、ポイントをまとめておきます。
 ・17行目の
With Range(検索範囲)  質問のコードの2行目の Cells(i, 7)を修正
 ・18行目の
Set 結果セル = .Find  検索結果を一旦、変数「結果セル」に取り出すように修正
 ・20行目の
結果セル Is Nothing  検索して1つも見つからなかった場合の処理を追加
 ・24行目の
FindNext(結果セル)  見つかったセルの次から検索を続行する
 ・21、24、25行目  FindNextメソッドがエンドレスで検索するので、最初に見つかったセルで終わるようにする
 ・13行目  データの最後の行を取得する方法は、
指定条件を満たすセルを選択する を参考にしてください。

サンプルブック
ダウンロードは ここをクリック
Internet Explorer 4.0以上と、Excel 97以上がインストールされたパソコンでは、サンプルブックを直接、開くことも可能です。しかし、そのまま試すとエラーが出る場合があるので、一旦、ハードディスクに保存してください。

Excel VBA Macro