• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Find2重使用後のFindNextの使用について)

FindNextの使用でNothingになる原因と対策方法

このQ&Aのポイント
  • Excel2003にて、シート2に記載されている表のD列の中から条件に該当する値を検索し、その行のE列の値を取り出し、それを条件にしてシート3のL列を検索するVBAプログラムを組んでいます。
  • しかし、FindNextを使用して繰り返し検索する部分で検索結果がNothingになってしまう問題が発生しています。
  • この原因は、Findを2回使用していることによるものです。

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

>Findを2回使用しているのが原因なんでしょうかね Findを何回使ってもいいのですが、FindNextの使い方に間違いがあります。 というより、今回は、FindNextは使えません。 また、他の部分にも若干おかしいところがありますのでちょっこと修正したコードをアップしてみます。 '----------------------------------------------  Sub add()  Dim class(1 To 10) As String  class(1) = "2-1"  class(2) = "2-2"  class(3) = "end"  i = 1  Do Until class(i) = "end"    Set objFind = Worksheets(2).Range("D:D").Find(class(i), LookIn:=xlValues)    If Not objFind Is Nothing Then      OldAddress = objFind.Row      Do        class_sh2_YLine = objFind.Row        class_nm = Cells(class_sh2_YLine, "E")        Set objFind2 = Worksheets(3).Columns("L").Find(class_nm, LookIn:=xlValues)        If Not objFind2 Is Nothing Then          class_sh3_YLine = objFind2.Row          class_add = Worksheets(3).Range("Q" & class_sh3_YLine)          'Worksheets(3).Rows(class_sh3_YLine).Delete          Worksheets(2).Cells(class_sh2_YLine, "H") = class_add        Else          MsgBox "該当する住所がありません"        End If        Set objFind = Worksheets(2).Range("D:D").Find(class(i), objFind)      Loop While OldAddress <> objFind.Row    End If   i = i + 1  Loop End Sub '--------------------------------------------- (確認事項) 提示のシート2のデータ、D列には、2-1が2つありますが、それでいいのですね。 ま、FindNextを使っていることから判断すればそれは分かることですが。 さらに言うと、 シート3のL列名前には同じ名前はないのでしょうか。 もし、あったらどう処理されるのでしょうか いまのシート3のレイアウトでは、どちらの名前の県名を取得すればいいのか分かりませんが。 それから、なぜ今回は、FindNextが使えないのかちょと考えてみてください。 詳しくはヘルプ参照のこと。  

kuma-ch
質問者

お礼

すばやい回答ありがとうございました。myRangeさん記載のコードで無事動作しました。 VBは独学&周りに聞ける人がいないので助かりました。 確認事項について 御察しの通りD列に複数の同一データがあるためにFindNextを使おうと思っていました。 シート3には同一の名前が複数あります。しかし実際のシート3とシート2のデータの順番は同じなので、単純に上から検索しヒットした物を当てはめ、一度検索した行は削除するという方法でやっています。(例では順番はばらばらになっていますが・・・) FindNextが使用できなかったのは、2回目のFindの検索条件を引きずっているからなのでしょうか?

その他の回答 (1)

  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

上手くいったようで、何より。 >FindNextが使用できなかったのは、2回目のFindの検索条件を引きずっているからなのでしょうか? そうです。 Set objFind2 = Worksheets(3).Columns("L").Find(class_nm, LookIn:=xlValues) この2つ目の検査値class_nmでFind(Next)してることになります。 それから、今回のFindメッソドは質問者のコードをそのまま使いましたが、 実際は、引数LookAtもセットしておかないと思わぬ結果になることがあります。 そこらもヘルプに書いてありますのでじっくりと眺めてみてください。   尚、お気づきでしょうが、当方がアップしたコードでは  'Worksheets(3).Rows(class_sh3_YLine).Delete これをコメントアウトしてますので、’を削除願います。    

kuma-ch
質問者

お礼

了解です。色々丁寧に回答&アドバイスしていただき、ありがとうございました。