web-dev-qa-db-ja.com

範囲は機能するがセルは機能しないのはなぜですか?

ある範囲から別の範囲に値を割り当てることにより、あるワークブックから別のワークブックにデータを移動しようとしています。通常の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オブジェクトの使用がなぜ問題を引き起こしているのか、あるいは私が知らない他の問題があるのなら誰でも知っていますか?

16
user2597163

問題は、Cellsが修飾されていないことです。つまり、これらのセルが参照するシートは、コードの場所によって異なります。 RangeまたはCellsまたはRowsまたはUsedRangeを呼び出すか、またはRangeオブジェクトを返すものを呼び出し、それがどのシートにあるかを指定しない場合は常に、シートは次のように割り当てられます:

  • シートのクラスモジュール:アクティブなものに関係なく、そのシート
  • その他のモジュール:ActiveSheet

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
36
Dick Kusleika