エクセルVBA100本ノック。1本目:セルのコピー

この記事から得るもの

エクセルの神髄というサイトから、ExcelVBAの記述のお題が出されるものに、回答していきます。
基本操作の勉強としてブログにまとめていきます。


1 今回のお題

「Sheet1」のA1:C5のセル範囲を、「Sheet2」のA1:C5にコピーしてください。
値も数式も書式も全てコピーしてください。
ただしSelectメソッドは使用禁止
※行高と列幅の設定はしなくて良い。

2 今回のお題の意図

「ただしSelectメソッドは使用禁止」。つまり、記録マクロでは作れないということです。

記録マクロのコード

Sub Macro1()
'
' Macro1 Macro
'

'
    Range("A1:C5").Select
    Selection.Copy
    Sheets("Sheet2").Select
    Range("A1").Select
    ActiveSheet.Paste
End Sub


バリバリ「Select」を使ってしまいますね(;^ω^)
つまり、Selectを使わなくても書く方法があるよ!
そのことを伝えたいのだと理解しました。

3 回答

Sub コピペ()

Worksheets("sheet1").Range("A1:C5").Copy Worksheets("sheet2").Range("A1")

End Sub

どうでしょう。Selectは使っておりません。
わざわざ選択をしなくても、コピペの記述は書けるという証明です。かつ、この書き方の方がスマートです。

POINTは、Worksheets("sheet2").Range("A1")の(”A1”)まで書けばOKということ。
Worksheets("sheet2").Range("A1:C5")と書いても問題はありません。

4 値のみを代入する場合

問題の制限である「数式も書式も全て」を考えずに、「値だけ入れたい」場合には別の方法も取れます。

Raangeを使う場合

Sub rangeを入れる()

Dim rng As Range: Set rng = Worksheets("sheet1").Range("A1:C5")

Worksheets("sheet2").Range("A1:C5") = rng.Value

End Sub

POINTは、= rng.Valueの「.Value」を指定しないといけません。

配列を入れる場合

Sub 配列を入れる()

Dim hi As Variant: hi = Worksheets("sheet1").Range("A1:C5")

Worksheets("sheet2").Range("A1:C5") = hi

End Sub

POINTは配列変数hiをVariantで宣言すること。こうすることで、指定したセルの範囲を一気にhiに入れることが可能です。


Raangeを入れる、配列を入れる方法も、貼り付け先の書式を設定しておけば、コピペと同じ動作になります。
いろんな書き方がありますな~!