セル範囲のコピー
「値ごとコピー」「見た目も合わせて」「値だけ」「数式だけ」「列幅も」「別シート・別ブックへ」まで、初心者でも迷わず使える安全テンプレートをまとめます。基本は Range.Copy Destination、用途に応じて PasteSpecial を使い分けます。高速化したい時は配列で値を転記します。
基本:セル範囲をそのままコピー
Sub CopyRange_Basic()
'B2:D5 を F2 にコピー(書式・背景色・数式・コメントなども含む)
Range("B2:D5").Copy Destination:=Range("F2")
End Sub
VB- ポイント:
- そのままコピー: もっとも簡単。見た目も中身も同じにしたいとき。
- Destination指定: 貼り付け先の左上セルを指定するだけ。
貼り付けの種類を使い分け(PasteSpecial)
Sub CopyRange_PasteSpecial()
'値のみ(書式・数式を除く)
Range("B2:D5").Copy
Range("F2").PasteSpecial Paste:=xlPasteValues
'書式のみ(背景色・罫線・フォントなど)
Range("B2:D5").Copy
Range("F2").PasteSpecial Paste:=xlPasteFormats
'数式のみ(参照はそのまま維持)
Range("B2:D5").Copy
Range("F2").PasteSpecial Paste:=xlPasteFormulas
'列幅も含めてコピー(見た目再現)
Range("B2:D5").Copy
Range("F2").PasteSpecial Paste:=xlPasteColumnWidths
'値+数値の表示形式(よく使う提出用)
Range("B2:D5").Copy
Range("F2").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False 'クリップボード解除
End Sub
VB- ポイント:
- PasteSpecialの組み合わせ: 状況に合わせて必要な要素だけ貼る。
- ValuesAndNumberFormats: 値と数値の見た目をセットで再現。よく使います。
高速で安全:配列で値だけ転記(クリップボード不使用)
Sub CopyRange_ByArray()
Dim src As Range, dst As Range
Set src = Range("B2:D100")
Set dst = Range("F2").Resize(src.Rows.Count, src.Columns.Count)
dst.Value = src.Value '値だけ一括転記(高速)
End Sub
VB- ポイント:
- 速い・壊れにくい: クリップボードを使わず、値だけを丸ごと転記。
- 書式は別途: 見た目を揃えるなら後から書式を設定。
別シート・別ブックへコピー
Sub CopyRange_ToAnotherSheet()
Worksheets("Sheet1").Range("B2:D20").Copy _
Destination:=Worksheets("Sheet2").Range("F2")
End Sub
Sub CopyRange_ToAnotherWorkbook()
Dim wb As Workbook
Set wb = Workbooks.Open("C:\Data\Report.xlsx")
ThisWorkbook.Worksheets("Source").Range("B2:D20").Copy _
Destination:=wb.Worksheets("Target").Range("A1")
wb.Save
wb.Close
End Sub
VB- ポイント:
- 修飾: シート・ブックを明示して“どこからどこへ”をはっきり指定。
- 保存忘れに注意: 別ブックへ書くときは保存もセットで。
可視セルだけコピー(フィルタ後に便利)
Sub CopyRange_VisibleOnly()
With Range("B2:D100")
.SpecialCells(xlCellTypeVisible).Copy Destination:=Range("F2")
End With
End Sub
VB- ポイント:
- フィルタ後: 非表示行を除いてコピーしたい場合に使う。
動的最終行で表全体をコピー(毎回行数が違う時)
Sub CopyRange_DynamicLastRow()
Dim last As Long
last = Cells(Rows.Count, "B").End(xlUp).Row 'B列基準
Range("B2:D" & last).Copy Destination:=Range("F2")
End Sub
VB- ポイント:
- last行取得: 基準列から最終行をとり、範囲を可変に。
列幅も含めて“見た目そのまま”コピー
Sub CopyRange_LookAndFeel()
Dim src As Range, dst As Range
Set src = Range("B2:D20")
Set dst = Range("F2")
src.Copy
dst.PasteSpecial Paste:=xlPasteAll '中身と書式
dst.PasteSpecial Paste:=xlPasteColumnWidths '列幅
Application.CutCopyMode = False
End Sub
VB- ポイント:
- 幅も再現: 見出しや提出用で「同じ見た目」を作りたい時に便利。
例題で練習
例題1:売上データを値だけ別列に転記(高速)
Sub Example_CopyValuesOnly()
Dim last As Long
last = Cells(Rows.Count, "B").End(xlUp).Row
Range("G2").Resize(last - 1, 3).Value = Range("B2:D" & last).Value
End Sub
VB例題2:テンプレートから見出し+書式+幅をコピー
Sub Example_CopyTemplateHeader()
Dim src As Range, dst As Range
Set src = Worksheets("Template").Range("A1:E2")
Set dst = Worksheets("Report").Range("A1")
src.Copy
dst.PasteSpecial Paste:=xlPasteAll
dst.PasteSpecial Paste:=xlPasteColumnWidths
Application.CutCopyMode = False
End Sub
VB例題3:フィルタ後に可視行だけ値+表示形式で出力
Sub Example_CopyFilteredVisible()
Dim vis As Range
Set vis = Range("B2:D100").SpecialCells(xlCellTypeVisible)
vis.Copy
Range("H2").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End Sub
VB実務の落とし穴と対策
- シート関数の再計算負荷: 大量コピー前後は再計算で重くなることがある。必要なら計算モードを一時変更。
- 対策: Application.ScreenUpdating=False、Application.Calculation=xlCalculationManual を検討し、最後に戻す。
- 結合セルの崩れ: 結合セルはコピー先で崩れやすい。
- 対策: 見出し結合は最小限にし、必要なら書式を後から適用。
- 参照ズレ(数式コピー): 数式を貼ると参照が相対的に変わる。
- 対策: 数式だけ貼りたい時は xlPasteFormulas、参照固定は絶対参照にするか、値貼りにする。
- Clipboardに依存した処理の不安定: Copy/Pasteは他アプリの操作で中断されることがある。
- 対策: 値だけなら配列転記(dst.Value = src.Value)で安定・高速。
- 列幅が再現されない: 通常のCopyでは幅が変わらない。
- 対策: ColumnWidths を別途 PasteSpecial する。
