コピーして値貼り付け(行単位)
「行を丸ごとコピーして“値だけ”を貼り付けたい」場面の最短コードを、初心者向けに整理しました。基本は 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