プロが教えるわが家の防犯対策術!

『実行時エラー'1001': 'Range'メソッドは失敗しました:'_Worksheet'オブジェクト』

先週から仕事に必要なためVBAの勉強を始めましたが、別シートへコピーする際などに上記のエラーが発生してしまい原因が分からず困っています。どこが間違っているのでしょうか??

処理はデータが書かれているシートから作業用のシートにセル範囲を指定してコピーする、というものです。
なお、マクロ自体は別にマクロ用ファイルを作成し、そこのシートモジュールへ記述しています。


よろしくお願いします。


Sub test()

'--------- 対象ファイルの呼び出し

Dim MAIN As Workbook
Dim ws As Worksheet
Dim sh As String

'ファイルを呼び出す
Call GetMAINFile

Set MAIN = ActiveWorkbook
Set ws = MAIN.Worksheets(1)


sh = ws.Name

'--------- 一時作業用TEMPシートの作成

Dim TEMP As Worksheet

Worksheets.Add(after:=ws).Name = "TEMP"
Set TEMP = Worksheets("TEMP")


'--------- 対象シートから一時作業用TEMPシートへデータのコピー

Dim x1, x2, y1, y2 As Integer


x1 = 5
x2 = 10
y1 = 1
y2 = 4


ws.Range(Cells(x1, y1), Cells(x2, y2)).Copy _
Destination:=TEMP.Range(Cells.SpecialCells(xlLastCell).Row, 1)


End Sub

'--------- ファイル名を指定ダイアログの表示
Sub GetMAINFile()

Dim NewBook As Workbook
Dim OpenFileName As String
OpenFileName = Application.GetOpenFilename()
If OpenFileName <> "False" Then
Workbooks.Open OpenFileName

Else
Exit Sub

End If
End Sub

A 回答 (1件)

以下のように変更が必要です。



ws.Range(Cells(x1, y1), Cells(x2, y2)).Copy _
  Destination:=TEMP.Range(Cells.SpecialCells(xlLastCell).Row, 1)
        ↓
Range(ws.Cells(x1, y1), ws.Cells(x2, y2)).Copy _
 Destination:=Cells(TEMP.Cells.SpecialCells(xlLastCell).Row, "A")

補足説明)
・Cells(x1, y1)
 これを明示的にするとActiveSheet.Cells(x1, y1) になります。
 よってws.Range(Cells(x1, y1), Cells(x2, y2))を明示的にすると
  ws.Range(ActiveSheet.Cells(x1, y1), ActiveSheet.Cells(x2, y2)) または
  ws.Range(TEMP.Cells(x1, y1), TEMP.Cells(x2, y2))
 になります。
 ws.RangeとTEMP.Cells(x1, y1)はシートが違うためにエラーとなっています。

・TEMP.Range(Cells.SpecialCells(xlLastCell).Row, 1)
 これを数字に直してみると
  TEMP.Range(1, 1)
 となってしまい明らかに間違っています。
  TEMP.Cells(1, 1)またはTEMP.Cells(1, "A")にする必要があります。
  ※列は"A"のように列名で指定した方が分かりやすいかと思います。

気になる点)
 Worksheets("TEMP")は毎回作成しているので、空シートだと思います。
 TEMP.Cells.SpecialCells(xlLastCell).Row と最後の行を取得しなくても
 必ず「1」だと思いますが…

 
もし私の勘違いで間違った指摘かも知れませんが…  
  
    • good
    • 0
この回答へのお礼

的確なご指摘ですね!非常に勉強になりました。


・Cells(x1, y1)
 cellsプロパティの前に省略されたRangeオブジェクトがあるということですね。

・TEMP.Range(Cells.SpecialCells(xlLastCell).Row, 1)
 ご指摘の通り文法がおかしかったです。
 
 Cells.SpecialCells(xlLastCell).Rowを使っているのは、
 実は質問文に記載した処理以外で、FINDで検索した結果から繰り返して別シートへコピーさせたかったからです。



ありがとうございました。

お礼日時:2010/06/13 20:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!