• 締切済み

VBAのFindメソッドのエラー理由

初歩的な質問ですがよろしくお願いいたします。 シート1のi行6列目の文字列をシート2の3列目から探してその行数をシート1のi行16列目に 引っ張ってくる記述をしたく、下記のようなコードを書いたところ1004のデバック表示がされました。下の記述をどうすれば正常に動くでしょうか。 Range(i, 16) = Worksheets(2).Range(Cells(5, 3), Cells(5, 3).End(xlsown)).Find(Cells(i, 6)).Row

みんなの回答

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

Range(Cells(),cells())とCellsを2つとRangeを使ってセル範囲を指定する場合は、初心者はワークシートの指定を忘れやすい。 回避策は (1)しつこくワークシート名をかぶせて書くか、または (2)Set ws1=Worksheets(1) Set ws2=Worksheets(2) のような書き方をして Range(Ws2.Cells(5, "c"), Ws2.Cells(1000, "c")のように添えて書くか (3)With Worksheets(2) .Cells(・・・    End With と書くかでしょう(#1のご回答) 全貌が質問に書かれてないので、よくわからないが、1つのやり方をご参考に上げる。 Sub test01() i = 2 'Worksheets(2).Range(Worksheets(2).Cells(5, "c"), Worksheets(2).Cells(5, "c")).End(xlDown).Select Range(Worksheets(2).Cells(5, "c"), Worksheets(2).Cells(1000, "c").End(xlUp)).Select 'Stop Selection.Find(Worksheets(1).Cells(i, "F")).Select Worksheets(2).Cells(i, "J") = Selection.Offset(0, 1) 'Range(i, 16) = Worksheets(2).Range(Cells(5, "c"), Cells(5, "c").End(xlDown)).Find(worksheets(1).Cells(i, 6)).Row End Sub i=2は,全貌が書かれてないので、わたしが仮定した。 上記Stopは範囲を捉えているか途中で確認テスト用。本番では不要。 例データ Sheet2のF2にaa Sheet2 C5:D8 f 12 g 23 ss 25 aa 11 結果 Sheet1 F2  に 11 ーー XLSOWNは誤りだろう。 End(xlUp)もあるよ(このほうが多く使われるのかも)。1000行としているのは、仮の例で、余裕を見てのデータ数の見積もり行のつもり。 Offset(0, 1)としているのは、 ふつうは、見つかった隣列などのデータがほしいのでは。 Findメソッドで第2、第三の該当を見つけに行くとき、くりかえしを探索を続ける場合の終わり判定は初心者にはむつかしいと思うので勉強必要かな。

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.2

No1です。一部訂正 ドットのないセル指定はコードの書かれているセル ↓ ドットのないセル指定はコードの書かれているシートのセル

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.1

Worksheets(2)の指定が最初のRangeにしか適用されず以後の検索範囲指定のCellsはコードの書かれているシート(もしくはアクティブシート)のセルを指定していることになりエラーなっています。Worksheets(2)のセルを指定する部分はすべてWorksheets(2).から書かないとエラーになりますが、すべてのセル指定にWorksheets(2).を付けるのは面倒ですので、以下の方法Withで最初に指定しておくという手があります。 ドットで始まるセル指定はWithで指定したシートのセルを、ドットのないセル指定はコードの書かれているセル(もしくはアクティブシート)をそれぞれ指定していることになります。 With Worksheets(2) Cells(i, 16) = .Range(.Cells(5, 3), .Cells(.Cells(5, 3).End(xlDown).Row, 3)).Find(Cells(i, 6)) End With

関連するQ&A

専門家に質問してみよう