VBAでシートをアクティブにしないとエラーになるのはなぜ?
ExcelVBAで次のようなコードを書きました。(マクロはすべてSheets(1)がアクティブ状態で実行するものとします)
VBA
1 Sub test1() 2 Dim myData 3 myData = Range("A1").CurrentRegion.Value 4 Dim r As Long, c As Long 5 r = UBound(myData, 1) 6 c = UBound(myData, 2) 7 Sheets(2).Range(Cells(1, 1), Cells(r, c)).Value = myData 8 End Sub
現在Sheets(1)がアクティブになっている状態で、Sheets(1)のある範囲のセルの値を非アクティブのSheets(2)にコピペするといったものです。
VBA
1Sheets(2).Range(Cells(1, 1), Cells(r, c)).Value = myData
ここでエラーが発生します。
実行時エラー1004 アプリケーション定義またはオブジェクトの定義エラーです。
次のように変更すれば解決はします。
VBA
1 Sub test2() 2 Dim myData 3 myData = Range("A1").CurrentRegion.Value 4 Dim r As Long, c As Long 5 r = UBound(myData, 1) 6 c = UBound(myData, 2) 7 Sheets(2).Activate 8 Range(Cells(1, 1), Cells(r, c)).Value = myData 9 End Sub
要するに、一旦Sheet(2)をアクティブにしてから範囲に値を入れているわけです。
そこで疑問なのですが、なぜわざわざSheet(2)をアクティブにしてからじゃないとエラーになってしまうのでしょうか?
たとえば、以下のようなコードではエラーになりません。
VBA
1Sub test3() 2 Dim myData 3 myData = Range("A1:B5").Value 4 Sheets(2).Range("A1:B5") = myData 5End Sub
VBA
1Sub test4() 2 Dim myData 3 myData = Range("A1").Value 4 Sheets(2).Cells(1, 1) = myData 5End Sub
エラーになるコードとの違いはセル範囲かつRangeの始点と終点にcellsを使っているという点だと思うのですが、なぜその場合はエラーになってしまうのか理由が知りたいです。
よろしくおねがいします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/07 05:19