VBAのCurrentRegion.Findで検索結果が異なる値になる問題について

このQ&Aのポイント
  • VBAのCurrentRegion.Findを使用して、指定した検索ワードが入力されているセルを抽出しています。
  • しかし、一部の検索結果には実際と異なる値が入る現象が発生しています。
  • 検索ワードや検索結果の値には規則性がなく、原因がわかりません。検索範囲内に存在する検索ワードを並び替えると正常にヒットすることもあります。
回答を見る
  • ベストアンサー

VBA/ CurrentRegion.Find

以下の様なVBAで"検索ワード"が入力されているセルを抽出しています。 Set 検索結果 = 検索範囲.CurrentRegion.Find(what:="検索ワード") 検索ワードは"01000"といった感じの5桁の数字(テキストタイプ)です。 7000行くらいの検索範囲の中から、2500回くらいの"検索ワード"を変更しながら検索するものです。 概ねうまくいくのですが、10件くらい、検索結果に実際と異なる値が入ります。 デバッグしていくとうまくいくものは例えば検索ワードが"02020"だった場合、検索結果も"02020"となりますが、うまくいかない場合には、検索ワードが"03000"のときに検索結果に"F003000"といった値が入り、検索結果.rowには全く関係のない"01750"が入力されているセルの行番号が入ったりします。 10個くらいそういう現象が起きる"検索ワード"には全く規則性はなく("03000"とか"10233"とか先頭が"0"のものに限られる、といったこともなく)、検索結果に入る値も"F003000"や"A1023300"など、検索ワードを含んでいるようなのですが、前後につく文字はよくわかりません。 しかも、実際には検索範囲の中に検索ワードは存在し、例えば"03000"の行を検索範囲の一番上に並び替えた場合は、ちゃんとヒットします。 非常に分かりにくい質問で恐縮ですが、何か考えられる要因があるようでしたら、可能性だけでも結構ですので、ご意見いただければと思います。 ※"検索結果"とか"検索ワード"とかは実際のVBAの中では半角アルファベットで定義されています。 ※ほとんどがうまくいっているので定義の方は問題無いものと思われます。

  • yama_x
  • お礼率35% (308/875)

質問者が選んだベストアンサー

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

LookIn LookAt を設定してやれば Set 検索結果 = 検索範囲.Find(what:="検索ワード", LookIn:=xlValues, LookAt:=xlWhole)

yama_x
質問者

お礼

なるほど! あらためて調べてみたら、LookInで検索対象をValueに限定し、LookAtで完全一致にする、ということですね。 無事解決できました。 ありがとうございました。

その他の回答 (1)

回答No.1

>Set 検索結果 = 検索範囲.CurrentRegion.Find(what:="検索ワード") 実際の検索範囲は、検索範囲+その範囲に続くデータのある領域(CurrentRegion)となりますが、それでいいのでしょうか?「検索範囲」に限定で探して欲しいなら、CurrentRegionは不要です。

yama_x
質問者

お礼

ネットで拾ってきた構文だったので、ちゃんと理解せずに使用していました。 たしかにCurrentRegionなしでも、自分が意図したことはできました。 勉強になりました。 ありがとうございました。

関連するQ&A

  • VBAでのセル範囲指定について

    お世話になります。 私が分からないのは、VBAでのセル範囲指定なのですが、 例えば、シートにデータが有、そのデータの1行目は見出しなので 2行目からデータが入っているセルまでの範囲を指定、コピーして 隣のシートに貼付したいのですが、そのデータの入力される範囲が 毎回違います。「CurrentRegion.Select」としてしまうと、1行目 の見出しまでも範囲指定されてしますので、どうやったら良いのか どなたかお教え頂きたく宜しくお願い申し上げます。

  • vbaでvlookup

    エクセルのVBAについて。 指定した範囲の中から検索条件に一致したデータを検索し、取り出してくれる関数vlookup をVBAで実現したいのですが、 目標として、エクセルのセル(列)に、値を入力されているとします。 VBAを実行するボタンをクリックすると、、、 その値に対応する文字列(事前に用意)をその値の右のセルに自動で入力させたいです。 このVBAを作ることが目標です。 vbaでvlookupを実現でなくても、それよりも簡単な方法があれば教えていただきたいです。 お手数ですが、よろしくお願いします。

  • excel2003の vbaの名前定義について

    excel2003の vbaで、名前定義した範囲から、任意のセルの値を抜き出したいです。 例えば、Aという名前定義した範囲があるとします。 AはA1セル~A10セルの範囲です。 そして、たとえいばA3セルの値を取得したい場合。 名前定義した範囲を使ってどのように表現すればよいでしょうか?

  • Excel VBAのFindメソッドについて

    Excel VBAを勉強中の者です。 Findメソッドで、数字の入ったF5セルからF28セルの範囲から、 1という数字の入ったセルを検索したいと思い Sub test() Dim xRange As Range Set xRange = Range("F5:F20").Find(What:=1, LookIn:=xlValues)   xRange.Select End sub としました。 しかし、このまま検索するとF6セルの12が検索されてしまいます。 他の数字では問題なく、対象の数字の先頭の数字が選択されます。 どうしてでしょうか? よろしくお願いします。

  • vba

    vbaについて 下記のプログラム教えてほしいです。 F5からL20に、1~30までの数字がランダムに入力されています。 空欄もあります。 クリックしたセルが空欄の場合と、値が30の場合は何もしない。 クリックしたセルに値がある場合、その値をコピーし、 F21に値を+1して貼り付ける。 わかりますかね?;; なるべく省略された簡潔なプログラム教えてほしいです。

  • VBAで

    VBAで モジュールAで定義された変数を、モジュールBに引継ぐ事はできますか? モジュールAである値の入っているセルを検索し、その行番号を変数 HitRowNo に入れます。 この変数 HitRowNo をモジュールBでも使いたいんですが、変数(の値?)を引継ぐことは可能ですか? 質問の意味がわかりずらいかもしれませんが、よろしくお願いします。

  • エクセルVBA データの追加

    VBA初心者です。いろいろ検索したのですが、うまく見つかりませんでした。 B2からF2までのデータを、B列の空欄セル(値が入っている最終行の次)に貼り付ける場合にはどうすればいいでしょうか。 例えば、B6までデータが入っていてる場合は、B7からF7までにB2からF2までのデータが値のみ入るという感じです。 よろしくお願い致します。

  • VBAで特定のセルに値を入力したい

    VBAについて教えてください. (当方初心者です) VBAでユーザー定義関数で 計算しているセルから相対的な位置に値を入力したいのです. より具体的に言うと、例えば B3のセルでユーザー定義関数を用いて計算します。 その関数で計算した結果である一定の条件を満たした時にだけ その関数で計算しているセルから2行2列隣のセルに 特定の値を入力したい場合にはどうすればよいのでしょうか? 試しに簡単に書いてみたのが以下です。 ------------------------------------------- Sub test1() ActiveCell.Offset(2, 2).Value = 100 End Sub Function test2() test1 End Function ------------------------------------------- これだとtest1を単体で実行した場合は上手く動作するのですが test2でtest1を呼び出した場合はエラーになります。 これをどう直せばtest2内でtest1の動作を実行できるのでしょうか? ご教授のほどよろしくお願いいたします。

  • 最終行/処理対象のデータまでを表すVBA

    こんばんは、データの最終行/処理する対象のセルまで処理する場合のVBAの記述について質問させてください!VBAの最終行/処理する対象のセルまで選択するために使用する記述方法が何種類かありますが、そのうち、書籍やネットで検索しても出てこない記述方法について今一つ理解ができていません(T_T) 本屋で売っている書籍やネットで検索すると出てくる記述方法 Range~.End(xlUp).Row Range~.CurrentRegion Range~.SpecialCells(xlLastCell) Range~.Cells(Rows.Count, 1).End(xlUp).Row 上記のようなVBAは書籍やネットで検索すると説明や違いについても出てくるので、説明を読めば理解ができるのですが、 Sheets("テスト").Range("A1:C" & Sheets("テスト").Cells _(1).CurrentRegion.Rows.Count) Range("A1").CurrentRegion.Cells(Range _("A1").CurrentRegion.Cells.Count).Row 上記のようなVBAについては検索しても説明など出てこないうえに、 なぜ上記のような記述になるのかあまり理解できていません(>_<) 書籍やネットで検索すると出てくる「Range~.CurrentRegion」などの記述方法から何となく、CurrentRegionやCells.Countを使わないといけないというのは理解できますが、なぜ「~CurrentRegion.Rows.Count)」はRowsがカッコの中に入っていて、「~CurrentRegion.Cells.Count).Row」はカッコの外に出ているのか??といった細かいことが分からずにいます。。。 半ば丸暗記のようにして使ってしまっているのですが、もし上記のようなVBAについてわかるかたがいらっしゃれば、ご教授いただけるととても嬉しいです! また、上記以外にもまだ検索しても出てこないようなVBAがあるのでしょうか?? 頭が混乱しそうです!(゜Д゜;)

  • エクセル 検索のVBAの参考プログラム

    エクセルでVBAを使って、検索キーワードの有る「行」のみ表示するVBAを作りたいです。 イメージとしては、1文字入力するたびに検索が実行され、その文字の有る「行」だけが表示されるイメージです。 実行の順番として考えるのは、 10 検索用のセルにキーワードが入力される 20 一文字入力されるたびに検索を実行する 30 検索ワードの有る行を表示し、無い行を非表示にする です。 補足 BASICの基礎知識はあります。 VBAの参考書を読み始めましたが、分かりません。。。 参考プログラム教えてもらえないでしょうか。 よろしくお願いします。

専門家に質問してみよう