VBAで別のシートにデータを転記するには、Sheets("Sheet1").Cells(1,1).Value = Sheets("Sheet2").Cells(1,1).Value のように、シート名を直接指定して値を代入するのが最もシンプルで速い方法です。シートを選択(Select)してからコピー・貼り付けする方法より、コードが短くなり処理も速くなります。
この記事では、シート間でデータをやり取りする3つの方法を比較しながら解説します。
方法①:シートを選択してコピー・貼り付けする
Excelの手動操作をそのままVBAにした方法です。
Sheets("Sheet2").Select
Cells(1, 1).Copy
Sheets("Sheet1").Select
Cells(1, 1).Select
ActiveSheet.Paste
動きはわかりやすいですが、シートを選択するたびに処理が重くなります。コードも5行必要で、データ量が多いマクロには向きません。
方法②:変数に値を入れてから転記する
一度変数に値を入れてから別のシートに書き込む方法です。
Dim txt As String
Sheets("Sheet2").Select
txt = Cells(1, 1).Value
Sheets("Sheet1").Select
Cells(1, 1).Value = txt
貼り付け操作がなくなった分すっきりしますが、シートを選択する処理は残っています。複数の場所から値を取り出してまとめて書き込む場合には、この方法が読みやすいこともあります。
方法③:シートを直接指定して転記する(おすすめ)
シートの選択をせずに、シート名を直接指定して値を代入する方法です。
Sheets("Sheet1").Cells(1, 1).Value = Sheets("Sheet2").Cells(1, 1).Value
たった1行で完了します。シートを選択しないので処理が速く、今どのシートを開いていても正しく動きます。
複数のセルをまとめて転記する場合
複数のセルを転記したい場合も同じ書き方を繰り返します。
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Set ws1 = Sheets("Sheet1")
Set ws2 = Sheets("Sheet2")
ws1.Cells(1, 1).Value = ws2.Cells(1, 1).Value
ws1.Cells(1, 2).Value = ws2.Cells(1, 2).Value
ws1.Cells(1, 3).Value = ws2.Cells(1, 3).Value
シート名を変数(ws1・ws2)に入れておくと、毎回 Sheets("Sheet1") と書かなくて済みます。
3つの方法の比較
- 方法①(コピー・貼り付け):手動操作に近くわかりやすいが、コードが長くなり処理が遅い。
- 方法②(変数を使う):複数の値をまとめて扱う場合に読みやすい。シート選択は残る。
- 方法③(直接指定):最もシンプルで速い。シートを選択しないのでどのシートを開いていても動く。
基本は方法③を使い、複数の値をまとめて管理したい場合だけ方法②を使うのがおすすめです。
まとめ
シート間のデータ転記は、シートを直接指定して値を代入する方法が最もシンプルで速いです。
- 基本形:
Sheets("転記先").Cells(行, 列).Value = Sheets("転記元").Cells(行, 列).Value - シートを変数に入れる:
Set ws = Sheets("Sheet1")とすると繰り返し書かなくて済む。 - シートのSelectは不要:直接指定することで処理が速くなり、コードも短くなる。
よくある質問
シート名ではなくシートの番号で指定できる?
できます。Sheets(1) のように番号で指定すると左から1番目のシートを指します。ただしシートの順番が変わると意図しないシートを指してしまうので、シート名で指定する方が安全です。
値だけでなく書式もコピーしたい場合は?
値だけを代入する方法では書式はコピーされません。書式も含めてコピーしたい場合は Sheets("Sheet2").Cells(1,1).Copy Destination:=Sheets("Sheet1").Cells(1,1) のように Copy メソッドを使います。
別のファイルのシートにも転記できる?
できます。Workbooks("ファイル名.xlsx").Sheets("Sheet1").Cells(1,1).Value のようにファイル名も一緒に指定します。ただし転記先のファイルがあらかじめ開いている必要があります。
転記する行数が毎回変わる場合はどうする?
最終行を取得してからループ処理と組み合わせます。lastRow = Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row で最終行を取得して、For i = 1 To lastRow でループすれば、行数が変わっても対応できます。
シート名にスペースや記号が入っている場合は?
問題なく使えます。Sheets("売上 データ") のようにそのままシート名を書けばOKです。シート名が変わる可能性がある場合は、シート名を変数に入れておくと修正が1か所で済みます。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



