Excel VBA 逆引き集 | コピーして値貼り付け(行単位)

Excel VBA
スポンサーリンク

コピーして値貼り付け(行単位)

「行を丸ごとコピーして“値だけ”を貼り付けたい」場面の最短コードを、初心者向けに整理しました。基本は PasteSpecial の xlPasteValues、または Range.Value の代入で、Select/Activate を使わずに直接処理します。


基本の考え方と最短パターン

  • 値だけ貼り付けの定番: PasteSpecial xlPasteValues か、Range.Value の代入を使う。
  • 行単位の安全指定: Range(“A2”).EntireRow などで「その行丸ごと」を対象にする。
  • サイズ合わせ: 行の「開始列〜終了列」を合わせてから値代入するのが高速・堅牢。
Sub RowValuePaste_Basic_PasteSpecial()
    '2行目をコピーして、5行目へ「値のみ」貼り付け
    Rows(2).Copy
    Rows(5).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
End Sub

Sub RowValuePaste_Basic_DirectValue()
    'B2:E2 の値を B5:E5 へ一括代入(最速・クリップボード不使用)
    Range("B2:E2").Value = Range("B5:E5").Value '←これは逆。正しくは下
End Sub
VB

上の2つ目は「貼り付け先にコピー元を代入」します。正しくは以下です。

Sub RowValuePaste_Correct_DirectValue()
    'B2:E2 の値を B5:E5 へ一括代入(最速)
    Range("B5:E5").Value = Range("B2:E2").Value
End Sub
VB

行単位テンプレート(同一シート・別シート・複数行)

'同一シート:A列〜E列の行を「値のみ」貼り付け
Sub PasteValues_SameSheet()
    Range("A5:E5").Value = Range("A2:E2").Value
End Sub

'別シートへ貼り付け(値のみ)
Sub PasteValues_ToAnotherSheet()
    Dim src As Range, dst As Range
    Set src = Worksheets("Sheet1").Range("A2:E2")
    Set dst = Worksheets("Sheet2").Range("A5:E5")
    dst.Value = src.Value
End Sub

'複数行まとめて:2〜10行を20〜28行へ「値のみ」
Sub PasteValues_MultipleRows()
    Dim src As Range, dst As Range
    Set src = Range("A2:E10")
    Set dst = Range("A20").Resize(src.Rows.Count, src.Columns.Count)
    dst.Value = src.Value
End Sub

'見出しを除くデータ最終行まで、1行ずつ値転記(開始列と幅を固定)
Sub PasteValues_ToLastRow()
    Dim last As Long
    last = Cells(Rows.Count, "A").End(xlUp).Row
    Range("B2:E" & last).Offset(3).Value = Range("B2:E" & last).Value '3行下へ
End Sub
VB
  • ラベルのポイント:
    • 同一シート: 値代入が最速。数式・書式は貼らない。
    • 別シート: src/dst を事前に Range で作ってから代入。
    • 複数行: Resize で貼り先のサイズを一致させる。
    • 可変範囲: last を使って行数が変わっても対応。

フィルタ後の「表示中の行」だけ値貼り付け

Sub PasteValues_VisibleRowsOnly()
    Dim rg As Range, vis As Range, c As Range
    Set rg = Range("A1").CurrentRegion
    rg.AutoFilter Field:=2, Criteria1:="=営業A" '例:B列で営業A抽出

    'データ部(見出しを除く)で可視セルを1列に限定して取得
    On Error Resume Next
    Set vis = rg.Offset(1).Resize(rg.Rows.Count - 1).Columns(1).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not vis Is Nothing Then
        For Each c In vis.Cells
            '例:可視行の C:D を G:H に「値のみ」貼り付け
            Range(Cells(c.Row, "G"), Cells(c.Row, "H")).Value = _
                Range(Cells(c.Row, "C"), Cells(c.Row, "D")).Value
        Next
    End If
End Sub
VB
  • ラベルのポイント:
    • 可視セルを1列に限定: 行重複を避け、Row番号で行単位処理。
    • 値だけ: 数式を外して値転記できるので、計算負荷や依存を断ち切れる。

テーブル(ListObject)の行を値貼り付け

Sub PasteValues_ListObjectRow()
    Dim lo As ListObject, r As ListRow, iSrc As Long, iDst As Long
    Set lo = ActiveSheet.ListObjects("売上テーブル")
    iSrc = lo.ListColumns("金額").Index
    iDst = lo.ListColumns("確定金額").Index

    Dim area As Range
    On Error Resume Next
    Set area = lo.DataBodyRange.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not area Is Nothing Then
        Dim rw As Range
        For Each rw In area.Rows
            rw.Columns(iDst).Value = rw.Columns(iSrc).Value
        Next
    End If
End Sub
VB
  • ラベルのポイント:
    • 列名指定: ListColumns(“列名”).Index で壊れにくく。
    • DataBodyRange: テーブルのデータ部だけを対象にすると安全。

例題で練習

'例題1:計算列(C:D)の結果を固定化(値化)して別列(H:I)へ保存
Sub Example_FixFormulasAsValues()
    Dim last As Long
    last = Cells(Rows.Count, "A").End(xlUp).Row
    Range("H2:I" & last).Value = Range("C2:D" & last).Value
End Sub

'例題2:選択した行の「値だけ」同じ行番号へ別シートに転記
Sub Example_PasteSelectionRowValuesToAnotherSheet()
    If TypeName(Selection) = "Range" Then
        Dim r As Long
        r = Selection.Row
        Worksheets("Out").Range("A" & r & ":E" & r).Value = _
            Worksheets("In").Range("A" & r & ":E" & r).Value
    End If
End Sub

'例題3:営業Aの可視行だけ、単価×数量の計算値を「値として」結果列へ
Sub Example_VisibleCalcToValues()
    Dim rg As Range, vis As Range, c As Range
    Set rg = Range("A1").CurrentRegion
    rg.AutoFilter Field:=2, Criteria1:="=営業A"

    On Error Resume Next
    Set vis = rg.Columns(1).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not vis Is Nothing Then
        For Each c In vis
            If c.Row > rg.Row Then
                Cells(c.Row, "G").Value = Cells(c.Row, "C").Value * Cells(c.Row, "D").Value
            End If
        Next
    End If
End Sub
VB

実務の落とし穴と対策

  • 数式や書式も貼られてしまう: 値だけなら PasteSpecial xlPasteValues、または Range.Value 代入を使う。
  • サイズ不一致でエラー: 代入は「貼り先」と「貼り元」の行・列サイズを一致させる。Resize で調整。
  • フィルタ後の重複処理: 可視セル取得は列1に限定し、Rowで行単位に展開する。
  • 速度最適化: クリップボードを使わない Range.Value 代入が最速。大量処理では ScreenUpdating/Calculation の制御を併用。
Sub SpeedWrap()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    '…大量の値貼り付け処理…

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
VB
タイトルとURLをコピーしました