- ベストアンサー
Excel VBAで要素を検索する方法
- Excel VBAで「一覧」シートのA列に入力されている特定の要素を検索する方法について説明します。
- 現在のコードでは、指定した要素が複数回出現する場合に全ての位置を表示しています。修正することで、最初の出現箇所以外は表示しないようにできます。
- 修正方法は、Findメソッドの後にFindNextメソッドを使って繰り返し検索することです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
fPlace = xRange.Address の下にある Msgbox xRange.Address を無くしたら問題は一応解決します。 また、Findをヘルプで検索してその様式を真似したほうがいいかなとも思えます。
その他の回答 (4)
- kmetu
- ベストアンサー率41% (562/1346)
ANo.1です 追加で今後のために 今回のように条件で分岐するようなところがあって、どうもおかしいと思える場合、変数の値などをウォッチ式を利用して見ていくとおかしいところが見えてくることがあります。 今回だと fPlace xRange.Address の二つをウォッチ式に入れて トレース(VBEの画面でF8を押してステップ実行)をしながら Loop Until fPlace = xRange.Address のところで各変数の値を見ると理由に気がついた可能性が大です。 参照 http://excelvba.pc-users.net/fol8/8_3.html
お礼
ステップ実行という手がありました。いつも気付かせて頂くことことばかりです。 ありがとうございます。
- keithin
- ベストアンサー率66% (5278/7941)
findnextを置く場所を間違えています。 間違った原因となっている,doループに入る前にmsgboxを置いたのも失敗です。 ’一発目を検索,初期値の取得 set xrange = worksheets("シート名").range("A1:A100").find(what:=xMoji) if not xrange is nothing then fplace = xrange.address ’一発目をヒットしたら即座にdo loopに突入する do ’先に用事を済ませてから msgbox xrange.address ’次を検索する。「次」が最初に戻ったら脱出する set xrange = worksheets("シート名").range("A1:A100").findnext(after:=xrange) loop until xrange.address = fplace end if
お礼
とてもわかりやすいです。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
GoogleででもエクセルVBAのFindメソッドを「VBA Find」などで照会すれば記事が沢山(実例も)出てくる。ここへ質問するより、そういう情報源で勉強してください。 Range("A1:D5")の中でセルの値がbのCELLを探す例。 質問のような難しさがあるので、小生は、回答などで、初心者にはFindを使うことは勧めない Sub Macro1() Set 範囲 = Range("A1:D5") 検索情報 = "b" Set 変数 = 範囲.Find(検索情報, LookIn:=xlValues) If Not 変数 Is Nothing Then 変数2 = 変数.Address Do MsgBox 変数.Address Set 変数 = 範囲.FindNext(変数) If Not 変数 Is Nothing Then m = IIf(m < 変数.Row, 変数.Row, m) End If Loop While Not 変数 Is Nothing And 変数.Address <> 変数2 MsgBox m End If End Sub ーー こういう例が載っていて、 変数2 = 変数.Address And 変数.Address <> 変数2 の2行のこれらの部分の意味を考えて勉強すること。 その前に、イメージを掴むために、エクセルで検索操作をやってみましたか。VBAとエクセルの勉強は平行してやるべきことです。
お礼
今回の場合、Findではなく、For~Nextの方を思いつかなくてはいけなかったんですね。 ここで質問させて頂くと、問題の解決だけではなく、いろんな方法を教えて頂けて勉強になります。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! せっかくコードをお考えですが↓のような感じではどうでしょうか? 一例です。 Sub test2() Dim i As Long Dim ws As Worksheet Set ws = Worksheets("一覧") For i = 1 To 100 If ws.Cells(i, 1) = 1 Then MsgBox (ws.Cells(i, 1).Address) End If Next i End Sub
お礼
こういう場合、For~Nextステートメントの方が断然適しているんですね。 ひとつ引き出しが増やして頂いた感じがします。 ありがとうございます。
お礼
最初に検索されるものが最後に検索され終了ということになるんですね。 驚きました。 Excelのリファレンス本をそのまま真似したものなんですが…本を替えた方がいいのかもしれません。