• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBA ループについて)

Excel VBAで要素を検索する方法

このQ&Aのポイント
  • Excel VBAで「一覧」シートのA列に入力されている特定の要素を検索する方法について説明します。
  • 現在のコードでは、指定した要素が複数回出現する場合に全ての位置を表示しています。修正することで、最初の出現箇所以外は表示しないようにできます。
  • 修正方法は、Findメソッドの後にFindNextメソッドを使って繰り返し検索することです。

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

  • ベストアンサー
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

fPlace = xRange.Address の下にある Msgbox xRange.Address を無くしたら問題は一応解決します。 また、Findをヘルプで検索してその様式を真似したほうがいいかなとも思えます。

mihimarumaru
質問者

お礼

最初に検索されるものが最後に検索され終了ということになるんですね。 驚きました。 Excelのリファレンス本をそのまま真似したものなんですが…本を替えた方がいいのかもしれません。

その他の回答 (4)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.5

ANo.1です 追加で今後のために 今回のように条件で分岐するようなところがあって、どうもおかしいと思える場合、変数の値などをウォッチ式を利用して見ていくとおかしいところが見えてくることがあります。 今回だと fPlace xRange.Address の二つをウォッチ式に入れて トレース(VBEの画面でF8を押してステップ実行)をしながら Loop Until fPlace = xRange.Address のところで各変数の値を見ると理由に気がついた可能性が大です。 参照 http://excelvba.pc-users.net/fol8/8_3.html

mihimarumaru
質問者

お礼

ステップ実行という手がありました。いつも気付かせて頂くことことばかりです。 ありがとうございます。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.4

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

mihimarumaru
質問者

お礼

とてもわかりやすいです。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

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とエクセルの勉強は平行してやるべきことです。

mihimarumaru
質問者

お礼

今回の場合、Findではなく、For~Nextの方を思いつかなくてはいけなかったんですね。 ここで質問させて頂くと、問題の解決だけではなく、いろんな方法を教えて頂けて勉強になります。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! せっかくコードをお考えですが↓のような感じではどうでしょうか? 一例です。 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

mihimarumaru
質問者

お礼

こういう場合、For~Nextステートメントの方が断然適しているんですね。 ひとつ引き出しが増やして頂いた感じがします。 ありがとうございます。

関連するQ&A