Excel VBA 逆引き集 | セル範囲のコピー

Excel VBA
スポンサーリンク

セル範囲のコピー

「値ごとコピー」「見た目も合わせて」「値だけ」「数式だけ」「列幅も」「別シート・別ブックへ」まで、初心者でも迷わず使える安全テンプレートをまとめます。基本は 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 する。
タイトルとURLをコピーしました