- ベストアンサー
【Find関数】あるのに見つからない。
現在、VBAで、 Find関数で行う処理を記述しています。 以下、記述------------------------ Dim LastRow, onecell As String Dim OrderNew As String LastRow = Range("B38").End(xlDown).Row oldad = 38 For cnt = 38 To LastRow OrderNo = Range("D" & oldad).Value Range("K" & cnt).Value = Range("B" & oldad).Value Range("M" & cnt).Value = Range("C" & oldad).Value Range("N" & cnt).Value = Range("D" & oldad).Value Range("O" & cnt).Value = Range("E" & oldad).Value Range("P" & cnt).Value = Range("F" & oldad).Value Range("P" & cnt).Value = Range("G" & oldad).Value Range("Q" & cnt).Value = Range("H" & oldad).Value Set OrderNoResult = Range("D" & 38 & ":D" & LastRow).Find (OrderNo, MatchByte:=False, MatchCase:=False, LookIn:=xlValues, Lookat:=xlWhole, SearchOrder:=xlByRows) OrderResultValue = OrderNoResult.Value Do While OrderNoResult.Value = OrderResultValue oldad = OrderNoResult.Row Set OrderNoResult = Range("D" & 38 & ":D" &LastRow).FindNext(OrderNoResult) If OrderNoResult Is Nothing Then Exit Do End If Loop Range("L" & cnt).Value = Range("B" & oldad).Value Range("R" & cnt).Value = Range("I" & oldad).Value oldad = oldad + 1 Next cnt 終わり---------------------------- 30週目で必ず止まります。値はあります。Ctrl+Fで同じ値をペーストして、実行して該当したので間違いありません。 また、一度停止し、再度実行すると、その一周は動き、また停止します。これを一回ずつ繰り返す場合は、問題なく処理されます。 オブジェクトの初期化のような処理が必要なのでしょうか? ご教授お願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
根本的に Find の使用の仕方が間違ってると思います 下記で代用できませんか Dim LastRow As String Dim OrderNew As String '最終行を取得 LastRow = Range("B38").End(xlDown).Row oldad = 38 '最終行になるまでループ For cnt = 38 To LastRow '初期値セット(値が詰められている最初の行)。一週目は'1' OrderNo = Range("D" & oldad).Value 'ヘッダーをセット。 Range("K" & cnt).Value = Range("B" & oldad).Value Range("M" & cnt).Value = Range("C" & oldad).Value Range("N" & cnt).Value = Range("D" & oldad).Value Range("O" & cnt).Value = Range("E" & oldad).Value Range("P" & cnt).Value = Range("F" & oldad).Value Range("P" & cnt).Value = Range("G" & oldad).Value Range("Q" & cnt).Value = Range("H" & oldad).Value 'D列の注文番号を検索。Rangeオブジェクトを格納。 'Rangeオブジェクトから値を格納。 OrderResultValue = Range("D" & oldad).Value 'ループ。比較。検索される値が見つからなくなったらその行番号を取得し、 _ IF文によりループエンド。その際、次の検索開始位置をoldadで確保。 Do While Range("D" & oldad + 1).Value = OrderResultValue oldad = oldad + 1 Loop Range("L" & cnt).Value = Range("B" & oldad).Value Range("R" & cnt).Value = Range("I" & oldad).Value '決済行の次行が、新たな発注番号のため、oldad+1で次行取得。 oldad = oldad + 1 Next cnt 試してみてください
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
こんな複雑なコードを質問にコピーし、エラーを考えてくれていうのは無茶だ。 コードを読み解くことまで読者に放り投げている。 全体的なエクセルでの処理・データの成り立ち・したいことを文章で説明すること。 プログラムでやっている処理など文章ででも説明を添えたら。 >Range("K" & cnt).Value = Range("B" & oldad).Value でCntは38から最下行まで変化させているが、右辺のoldad = 38は38で固定している。処理内容がFindならなぜ繰り返すのか一見して判らなかった。 >30週目で 週は表上ではどう変化するのか?週が変わるとデータの列が変わるのか? 突然出てきて判らない。読者・回答者に配慮した質問をしてほしい。 作った自分だけが判ることでは困る。 例えばFind("g")は私の勝手な例ですが Sub test02() LastRow = Range("B38").End(xlDown).Row OrderNoResult = Range("D" & 38 & ":D" & LastRow).Find("g") MsgBox OrderNoResult End Sub では、初発見のセルの「値」しか返さないが、値は探索した値に決まっている。普通は見つかった行などを後の処理に使うのではと思うが、値では何に使うのかな。 後の重複発見探求はFindNextで追求する必要が有るが、 OrderResultValue = OrderNoResult.Value はなぜ行っているのか。
お礼
@書き直しました。 ・やりたいこと ある行に、注文番号が1から連なっています。 この注文番号で構成されるレコードは、重複もあります。 発注「1」 注文変更「1」 決済「1」 のように、多レコードで構成されています。 今回やりたいのは、この発注部分と決済部分の注文番号の取得です。 乱暴な記述をしてしまい申し訳ありません。
補足
現在、VBAで、 Find関数で行う処理を記述しています。 以下、記述------------------------ Dim LastRow As String Dim OrderNew As String '最終行を取得 LastRow = Range("B38").End(xlDown).Row oldad = 38 '最終行になるまでループ For cnt = 38 To LastRow '初期値セット(値が詰められている最初の行)。一週目は'1' OrderNo = Range("D" & oldad).Value 'ヘッダーをセット。 Range("K" & cnt).Value = Range("B" & oldad).Value Range("M" & cnt).Value = Range("C" & oldad).Value Range("N" & cnt).Value = Range("D" & oldad).Value Range("O" & cnt).Value = Range("E" & oldad).Value Range("P" & cnt).Value = Range("F" & oldad).Value Range("P" & cnt).Value = Range("G" & oldad).Value Range("Q" & cnt).Value = Range("H" & oldad).Value 'D列の注文番号を検索。Rangeオブジェクトを格納。 Set OrderNoResult = Range("D" & 38 & ":D" & LastRow).Find (OrderNo, MatchByte:=False, MatchCase:=False, LookIn:=xlValues, Lookat:=xlWhole, SearchOrder:=xlByRows) 'Rangeオブジェクトから値を格納。 OrderResultValue = OrderNoResult.Value 'ループ。比較。検索される値が見つからなくなったらその行番号を取得し、IF文によりループエンド。その際、次の検索開始位置をoldadで確保。 Do While OrderNoResult.Value = OrderResultValue oldad = OrderNoResult.Row Set OrderNoResult = Range("D" & 38 & ":D" &LastRow).FindNext(OrderNoResult) If OrderNoResult Is Nothing Then Exit Do End If Loop Range("L" & cnt).Value = Range("B" & oldad).Value Range("R" & cnt).Value = Range("I" & oldad).Value '決済行の次行が、新たな発注番号のため、oldad+1で次行取得。 oldad = oldad + 1 Next cnt 終わり---------------------------- ご教授お願いいたします。
お礼
解決しました。 私のやりたい処理は、そもそもループで拾える処理だったんですね・・・・。 私があまりに短絡的な発想をしていたみたいで恐縮です。 非常に助かりました。 ありがとうございます。