• 締切済み

Find関数がうまく動作しない

エクセルで下記のData1のデータをData2の表に入れたいのですが、途中まではうまくデータが入るのですが、特に25がうまく認識されず認識が24のままデータが挿入されてしまいます。その後も認識されたり認識されなかったりと何故かがわかりません。どなたかヘルプお願いします。 Sheet(Data1) WK Data Attd 24 aaa 5 24 ddd 17 24 bbb 9 24 ccc 13 25 ddd 18 25 aaa 6 25 ccc 14 25 bbb 10 Sheet(Data2) WK→ 24 25 26 Data ↓ aaa 5 6 7 bbb 9 10 11 ccc 13 14 15 ddd 17 18 19 --------------------------------------------------------- Set Dsh = Worksheets("Data1") Set Ssh = Worksheets("Data2") Dsh.Select i = 3 r = Application.WorksheetFunction.CountA(Range("A3:A500")) Do While i < r Application.CutCopyMode = False Dsh.Select WK = (Dsh.Cells(i, 1).Value) Data = (Dsh.Cells(i, 2).Value) Attd = (Dsh.Cells(i, 3).Value) Ssh.Select Frow = Ssh.Cells.Find(what:=Data, LookIn:=xlValues, After:=Cells(2, 1), lookat:=xlWhole, searchorder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Row Wcol = Ssh.Cells.Find(what:=WK, LookIn:=xlValues, After:=Cells(2, 1), lookat:=xlWhole, searchorder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column Ssh.Cells(Frow, Wcol) = Attd i = i + 1 Loop

みんなの回答

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.2

分りませんでしたか・・残念 例えば A3~A10を処理をする場合 >r = Application.WorksheetFunction.CountA(Range("A3:A500")) に、当てはめると r = Application.WorksheetFunction.CountA(Range("A3:A10"))で rは[8]となります 今度は下記に当てはめてみますと i = 3 r = 8 Do While i < r   : i = i + 1 Loop >Do While i < r ここに当てはまるのは Do While i < 8 となります と言うことはA3~A7までしか処理されないということです したがって >r = i + Application.WorksheetFunction.CountA(Range("A3:A500")) とすることによって >Do While i < r は Do While i < 11 となり、A3~A10まで処理されます こんな説明で分りますか?

luvyak
質問者

お礼

少し認識が間違っていました。 よくわかりました。ありがとうございます。 ただまだ現象がかわらないのでもう少し検証してみます。 ありがとうございました。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

>Find関数がうまく動作しない findは関係ありません マクロを自分で組まれたのなら、分ると思います >r = Application.WorksheetFunction.CountA(Range("A3:A500")) r = i + Application.WorksheetFunction.CountA(Range("A3:A500")) ’for~nextの方がスッキリすると思います Sub test() Dim i As Long, Frow As Long, Wcol As Long Dim WK As Variant, Data As Variant, Attd As Variant For i = 3 To Worksheets("Data1").Range("A65536").End(xlUp).Row With Worksheets("Data1") WK = .Cells(i, 1).Value Data = .Cells(i, 2).Value Attd = .Cells(i, 3).Value End With With Worksheets("Data2") Frow = .Range("A2", .Range("A2").End(xlDown)).Find(what:=Data, LookIn:=xlValues).Row Wcol = .Range("B1", .Range("B1").End(xlToRight)).Find(what:=WK, LookIn:=xlValues).Column .Cells(Frow, Wcol) = Attd End With Next i End Sub こんな感じかな doをforへ findの検索範囲指定した程度の変更です 参考までに

luvyak
質問者

お礼

もう少し考えてみます。 ありがとうございました。

luvyak
質問者

補足

アドバイスありがとうございます。 ただ一つわからない部分がありますのでご説明頂けるとたすかります。 r = i + Application.WorksheetFunction.CountA(Range("A3:A500")) 上記は行のデータがあるマックス値をとることでiをまわすのをきめているのですが、i+ ですとマックス値+3となりますが・・・

関連するQ&A