値と書式を同時コピー
「値だけ」「書式だけ」ではなく、“値と書式をまとめて”移したい場面に使える定番コードを、初心者向けにわかりやすく整理します。基本は PasteSpecial の種類を正しく選ぶか、値貼り+書式貼りを組み合わせます。
基本:同じサイズの範囲へ値+数値書式を一度に貼り付け
Sub CopyValuesAndFormats_Basic()
Dim src As Range, dst As Range
Set src = Range("B3:E12")
Set dst = Range("H3").Resize(src.Rows.Count, src.Columns.Count)
src.Copy
dst.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End Sub
VB- ポイント:
- 値+数値書式: xlPasteValuesAndNumberFormats は「値と数値の表示形式」を一度に貼ります。色や太字などの書式も含めたい場合は下の組み合わせを使います。
- サイズ一致: 貼り付け先は src と同じ行数・列数に Resize します。
値+すべての書式を移す(2回貼り付けで確実)
Sub CopyValuesAndAllFormats()
Dim src As Range, dst As Range
Set src = Range("B3:E12")
Set dst = Range("H3").Resize(src.Rows.Count, src.Columns.Count)
src.Copy
dst.PasteSpecial Paste:=xlPasteValues '値
dst.PasteSpecial Paste:=xlPasteFormats '書式(色、太字、罫線、表示形式など)
Application.CutCopyMode = False
End Sub
VB- ポイント:
- 分割貼り付け: 値→書式の順に2回貼ると、見た目(塗り、罫線、フォント、表示形式)も含めてほぼ完全に移せます。
- 罫線だけ除外したい: xlPasteAllExceptBorders を使うと罫線以外を一括で移せます。
列幅も含めて“見た目そのまま”にする
Sub CopyValuesFormatsAndColumnWidths()
Dim src As Range, dst As Range
Set src = Range("B3:E12")
Set dst = Range("H3").Resize(src.Rows.Count, src.Columns.Count)
src.Copy
dst.PasteSpecial Paste:=xlPasteValues
dst.PasteSpecial Paste:=xlPasteFormats
dst.PasteSpecial Paste:=xlPasteColumnWidths '列幅も合わせる
Application.CutCopyMode = False
End Sub
VB- ポイント:
- 列幅同期: 表の見た目を揃えたい提出用などに便利。
- 行の高さは別途設定: 行高さは自動では移らないので、必要なら手動で調整します。
クリップボードを使わない軽量版(値は直接、書式だけPaste)
Sub CopyValuesDirect_FormatsPaste()
Dim src As Range, dst As Range
Set src = Range("B3:E12")
Set dst = Range("H3").Resize(src.Rows.Count, src.Columns.Count)
'値は直接代入(高速・安全)
dst.Value = src.Value
'書式だけPasteSpecial
src.Copy
dst.PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
End Sub
VB- ポイント:
- 高速化: 値は .Value で直接コピーすると速く、余計な再計算やペーストの不安定さを避けられます。
- 安定: 書式だけ PasteSpecial で重ねれば、見た目も揃います。
条件付き書式をマージして持っていく
Sub CopyWithConditionalFormatsMerge()
Dim src As Range, dst As Range
Set src = Range("B3:E12")
Set dst = Range("H3").Resize(src.Rows.Count, src.Columns.Count)
src.Copy
dst.PasteSpecial Paste:=xlPasteValues
dst.PasteSpecial Paste:=xlPasteAllMergingConditionalFormats '条件付き書式をマージ
Application.CutCopyMode = False
End Sub
VB- ポイント:
- マージ: 既存の条件付き書式に重ねる形で持って行きたいときに便利。
- 完全置換したい: 条件付き書式を一旦クリアしてから貼る手順に変更。
シートやブックをまたいでコピー
Sub CopyAcrossSheetsAndWorkbooks()
Dim src As Range, dst As Range
Set src = ThisWorkbook.Worksheets("元").Range("B3:E12")
Set dst = Workbooks("提出.xlsm").Worksheets("先").Range("H3"). _
Resize(src.Rows.Count, src.Columns.Count)
src.Copy
dst.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
dst.PasteSpecial Paste:=xlPasteFormats '必要に応じて追加
dst.PasteSpecial Paste:=xlPasteColumnWidths '列幅も
Application.CutCopyMode = False
End Sub
VB- ポイント:
- 対象を明示: Workbooks/Worksheets を必ず明示して取り違えを防止。
- 先ブックは開いている前提: 未オープンなら開いてから実行します。
選択範囲を“そのまま見た目”で値化コピー(作業グループ対応)
Sub CopySelectionValuesFormats()
If TypeName(Selection) = "Range" Then
Dim src As Range, dst As Range
Set src = Selection
Set dst = Application.InputBox("貼り付け先の左上セルを指定", Type:=8)
If dst Is Nothing Then Exit Sub
Set dst = dst.Resize(src.Rows.Count, src.Columns.Count)
src.Copy
dst.PasteSpecial Paste:=xlPasteValues
dst.PasteSpecial Paste:=xlPasteFormats
dst.PasteSpecial Paste:=xlPasteColumnWidths
Application.CutCopyMode = False
End If
End Sub
VB- ポイント:
- 対話的: 左上セルを指定するだけで選択範囲を“見た目ごと”値にコピー。
- 安全: サイズを一致させて事故を防ぎます。
例題で練習
例題1:売上表を“値+見た目”で提出用シートへコピー
Sub Example_CopyTableForSubmission()
Dim src As Range, dst As Range
Set src = ThisWorkbook.Worksheets("集計").Range("B2:E20")
Set dst = ThisWorkbook.Worksheets("提出").Range("B2").Resize(src.Rows.Count, src.Columns.Count)
src.Copy
dst.PasteSpecial Paste:=xlPasteValues
dst.PasteSpecial Paste:=xlPasteFormats
dst.PasteSpecial Paste:=xlPasteColumnWidths
Application.CutCopyMode = False
End Sub
VB例題2:値+数値書式だけで軽量コピー(見た目最低限)
Sub Example_LightCopyValuesAndNumberFormats()
Dim src As Range, dst As Range
Set src = Range("C3:F200")
Set dst = Range("J3").Resize(src.Rows.Count, src.Columns.Count)
src.Copy
dst.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End Sub
VB例題3:値は直接、書式だけ複数ブロックでまとめ貼り(非連続対応)
Sub Example_CopyFormatsMultipleAreas()
Dim src As Range, dst As Range, area As Range
'非連続の書式元を作成(例)
Set src = Union(Range("B2:E2"), Range("B5:E5"))
'値は直接(例として同じ形の先頭ブロックへ)
Range("H2:K2").Value = Range("B2:E2").Value
Range("H5:K5").Value = Range("B5:E5").Value
'書式は各エリアでPaste(サイズは一致させる)
For Each area In src.Areas
Set dst = Range("H" & area.Row).Resize(area.Rows.Count, area.Columns.Count)
area.Copy
dst.PasteSpecial Paste:=xlPasteFormats
Next
Application.CutCopyMode = False
End Sub
VB実務の落とし穴と対策
- 貼り付け先サイズが違う:
- 対策: 常に Resize で行数・列数を一致させる。ズレると一部しか貼れない/エラーの原因。
- 列幅が合わず見た目が崩れる:
- 対策: xlPasteColumnWidths を追加。行高さは必要に応じて Rows(…).RowHeight を設定。
- 条件付き書式の上書き/衝突:
- 対策: マージしたいなら xlPasteAllMergingConditionalFormats。完全置換なら先に ClearFormats。
- クリップボード状態が残る:
- 対策: 最後に Application.CutCopyMode = False を必ず実行。
- 速度が遅い/ちらつく:
- 対策: 値は直接代入+書式だけPaste、必要に応じて Application.ScreenUpdating = False を併用。
