Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2010)
Range("A1:B2")とRange(Cells(1, 1), Cells(2, 2))の違いのついて
投稿日時: 21/12/20 20:02:36
投稿者: 富山の初心者

お願いします。

Worksheets("Sheet1").Range("A1:B2").Copy Destination:=Worksheets("Sheet2").Range("E1")                  '1行目
Worksheets("Sheet1").Range(Cells(1, 1), Cells(2, 2)).Copy Destination:=Worksheets("Sheet2").Cells(1, 5) '2行目

 
上記を実行すると
1行目は正しく動作するのに、2行目がエラーとなる場合があります。
 
実行詳細
1.Sheet1を選択状態で実行-->1行目も2行目も正しく動作する
2.Sheet2を選択状態で実行-->1行目は正しく動作するが2行目でエラー
3.Sheet3を選択状態で実行-->1行目は正しく動作するが2行目でエラー
 
エラー内容は
実行時エラー'1004'
アプリケーション定義またはオブジェク定義エラーのエラーです
 
原因と対応策を教えていただけませんか?

回答
投稿日時: 21/12/20 21:05:39
投稿者: 半平太

>Worksheets("Sheet1").Range(Cells(1, 1), Cells(2, 2)).Copy ・・
 
よくあるミスです。
 
そこのCells(1,1) と言う記述が、親シートを指定していないので、
その時のアクティブシートのセルと解釈される為不整合になる訳です。
 
ただし、シートモジュールに書いた場合は、そのシートが親と解釈される
 
対策は、そう言う書き方をする場合、親シートを明示することです(標準モジュールの場合ですけど)。

回答
投稿日時: 21/12/20 21:11:32
投稿者: MMYS

Excelでは、Worksheetを省略した場合、対象シートはActiveSheetになるのはご存じだと思います。2行目のコードではRangeには、対象Worksheetを指定していますが、Cellsには指定していません。よって
 
Worksheets("Sheet1").Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(2, 2)).Copy Destination:=Worksheets("Sheet2").Cells(1, 5) '2行目
 
と解釈されます。
ActiveSheetが "Sheet1" の時は動作しますが、それ以外だとSheetの指定に矛盾が生じるため、エラーになります。正しい記述は
 
Worksheets("Sheet1").Range(Worksheets("Sheet1").Cells(1, 1), Worksheets("Sheet1").Cells(2, 2)).Copy Destination:=Worksheets("Sheet2").Cells(1, 5) '2行目
 
上記のように、すべてにWorksheetsを指定しなければなりません。ただし、こんな記述は面倒ですから、With を使って、下記のように、記述します。
 
With Worksheets("Sheet1")
    .Range(.Cells(1, 1), .Cells(2, 2)).Copy Destination:=Worksheets("Sheet2").Cells(1, 5)
End With
 

投稿日時: 21/12/22 12:14:02
投稿者: 富山の初心者

半平太様
MMYS 様 ありがとうございます。
 
ご回答ありがとうございます。
 
いちいちCells(1, 1)にWorksheets("Sheet1")を付けるのは面倒ですが、しかたがありません。
また、With Worksheets("Sheet1")とありますが、行数が長くなりそうですが、しかたがありません。
 
今回は、Cells(1, 1)にWorksheets("Sheet1")で対応しました。
ありがとうございました。
 
解決とさせていただきます