特定の情報が含まれている最初のセル番号を取得するには? (Findメソッドの使い方・その1)
Question 23.1   Previous Next
今日始めてホームページに、アクセスさせていただきました。とても為になるホームページで、感動いたしました。
じつは、現在マクロを勉強したくて、まず、住所録から勉強しようと思い、名簿マクロをダウンロードさせていただき、参考にさせていただいてます。
今、アドレス帳を作成しているところなのですが、検索のマクロのところでつまずいています。
Sub 検索マクロ()
1   Range("A1:B1").Select
2   Sheets("アドレス帳").Select
3   MOJI = InputBox("検索文字の入力", "検索文字入力")
4   Cells.Find(What:="MOJI", After:=ActiveCell, LookIn:=xlValues, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False).Activate
End Sub
実行しようとすると4行目の部分がエラーになり、「オブジェクト変数またはWITH変数が設定されていません」というメッセージが出ます。よろしかったら何が足りないのか、アドバイスをいただけたらうれしいです。よろしくお願いいたします。
Answer   Copyright (C) 1999.11.30 永井善王
サンプルマクロ 「名簿管理」をダウンロード していただいたのですね。 そこで使われているマクロコードは、「検索して別のシートに貼り付ける」として こちらから も 見れますが、オートフィルターで検索しています。
あなたのマクロコードを見ると、Findメソッドを使って検索していますので、本題に入る前に両者の違いを、簡単に押さえておきましょう。
まず、オートフィルターによる検索は、検索範囲内に同一項目が複数個あると、すべて抜き出すことが可能です。

一方、Findメソッドによる検索は、検索範囲内で最初に見つかったセル番号を取得できます。よって、同一項目がないか、最初のデータだけ分かればよい場合には、Findメソッドで簡単に検索できます。
Findメソッドでも次々と同一項目を検索することは可能ですが、マクロが難しくなります。逆に、項目の一部分を指定して検索する場合は、Findメソッドなら簡単です。
名簿
以後の説明を理解しやすくするために、前述の「名簿管理」で使っているシートを左に転載しておきます。

このシートの B列の名前を検索することにして、進みましょう。

回答に入ります。マクロコードの4行目で出るエラーは、オブジェクトの指定に問題があるからだと思います。
次の例を見習って書きかえてみてください。
    Set セル番号 = Columns("B").Find(MOJI)
Columns("B") で B列をオブジェクトとして指定し、Set セル番号 = で Findメソッドで取得したセル番号を格納します。
あなたのコーディングの 4行目に Cells… 、 1行目に Range("A1:B1").Select と書いている主旨が、A1セルから B1セルの範囲で検索したかったからでしたら、
    Set セル番号 = Range("A1:B1").Find(MOJI)
と、Range オブジェクトを使います。

なお、4行目の Cells.Find(… に、引数をズラッと書いてありますが、必要なもの以外は省略できます。くわしく知りたければ こちらから 「Findメソッドの引数一覧表」を見ることができます。
サンプルブックを作っておきましたので、マクロコードを見て研究してみてください。

ダウンロードは ここをクリック  (YNxv98c_find.xls 35KB)
※ 一旦、ブックをハードディスクに保存し、後で改めて開いてから実行してください。

 

Excel VBA Macro