- ベストアンサー
FindNextの使用でNothingになる原因と対策方法
- Excel2003にて、シート2に記載されている表のD列の中から条件に該当する値を検索し、その行のE列の値を取り出し、それを条件にしてシート3のL列を検索するVBAプログラムを組んでいます。
- しかし、FindNextを使用して繰り返し検索する部分で検索結果がNothingになってしまう問題が発生しています。
- この原因は、Findを2回使用していることによるものです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>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が使えないのかちょと考えてみてください。 詳しくはヘルプ参照のこと。
その他の回答 (1)
- myRange
- ベストアンサー率71% (339/472)
上手くいったようで、何より。 >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 これをコメントアウトしてますので、’を削除願います。
お礼
了解です。色々丁寧に回答&アドバイスしていただき、ありがとうございました。
お礼
すばやい回答ありがとうございました。myRangeさん記載のコードで無事動作しました。 VBは独学&周りに聞ける人がいないので助かりました。 確認事項について 御察しの通りD列に複数の同一データがあるためにFindNextを使おうと思っていました。 シート3には同一の名前が複数あります。しかし実際のシート3とシート2のデータの順番は同じなので、単純に上から検索しヒットした物を当てはめ、一度検索した行は削除するという方法でやっています。(例では順番はばらばらになっていますが・・・) FindNextが使用できなかったのは、2回目のFindの検索条件を引きずっているからなのでしょうか?