ある範囲から別の範囲に値を割り当てることにより、あるワークブックから別のワークブックにデータを移動しようとしています。通常のRange構文を使用して宛先範囲(Range( "A1:B2"))を指定すると、コードは機能しますが、Range、Cells構文(Range(Cells(1,1)、Cells(2 、2)))私のコードは動作しません。
宛先ワークブック(ActiveWorkbook)をアクティブ化し、ソースブック(ThisWorkbook)でコードを実行しています。
このコードは機能します:
ActiveWorkbook.Worksheets(1).Range("A1:B2").Value _
= ThisWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value
しかし、このコードは:
ActiveWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value _
= ThisWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value
発生するエラーは、実行時エラー '1004'です。アプリケーション定義またはオブジェクト定義のエラーです。
Cellsオブジェクトの使用がなぜ問題を引き起こしているのか、あるいは私が知らない他の問題があるのなら誰でも知っていますか?
問題は、Cells
が修飾されていないことです。つまり、これらのセルが参照するシートは、コードの場所によって異なります。 Range
またはCells
またはRows
またはUsedRange
を呼び出すか、またはRangeオブジェクトを返すものを呼び出し、それがどのシートにあるかを指定しない場合は常に、シートは次のように割り当てられます:
Range
参照を修飾しましたが、Cells
参照は修飾されておらず、Activesheetを指している可能性があります。書くようなもの
ThisWorkbook.Worksheets(1).Range(ActiveSheet.Cells(1, 1), ActiveSheetCells(2, 2)).Value
もちろん、これはたまたまThisWorkbook.Worksheets(1)がアクティブでない限り意味がありません。 Withブロックを使用して、すべてが完全に修飾されていることを確認することがよくあります。
With Sheets(1)
.Range(.Cells(1,1), .Cells(2,2)).Value = "something"
End With
ただし、2つの異なるシートを参照するので、次のような短いシート変数を使用したほうがよいでしょう。
Dim shSource As Worksheet
Dim shDest As Worksheet
Set shSource = ThisWorkbook.Worksheets(1)
Set shDest = Workbooks("myBook").Worksheets(1)
shDest.Range(shDest.Cells(1, 1), shDest.Cells(2, 2)).Value = _
shSource.Range(shSource.Cells(1, 1), shSource.Cells(2, 2)).Value
しかし、実際には、Cells
引数をハードコードする場合は、次のようにクリーンアップできます。
shDest.Cells(1, 1).Resize(2, 2).Value = shSource.Cells(1, 1).Resize(2, 2).Value