エクセル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
配列を入れる場合
Sub 配列を入れる() Dim hi As Variant: hi = Worksheets("sheet1").Range("A1:C5") Worksheets("sheet2").Range("A1:C5") = hi End Sub
POINTは配列変数hiをVariantで宣言すること。こうすることで、指定したセルの範囲を一気にhiに入れることが可能です。
Raangeを入れる、配列を入れる方法も、貼り付け先の書式を設定しておけば、コピペと同じ動作になります。
いろんな書き方がありますな~!