Excel VBAのPasteSpecialを複数属性で使い分ける

Excel VBAのPasteSpecialを複数属性で使い分ける

値、書式、列幅、空白無視、行列入替を、業務マクロで誤用しないための整理

Copyright © 2026 LWP 山中 一弘

本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。

記事要約

Excel VBAの PasteSpecial は、単なる貼り付け命令ではありません。値だけ貼る、書式だけ貼る、列幅だけ貼る、空白セルを無視する、行列を入れ替える、既存値に加算する、といった貼り付けの属性を指定するための機能です。

便利な一方で、PasteSpecial はクリップボードに依存します。何を貼るかを曖昧にしたまま xlPasteAll を使うと、値だけが必要な処理に書式、入力規則、コメント、条件付き書式まで持ち込むことがあります。業務マクロでは、この「余計な属性を持ち込むこと」が後続処理の不具合や保守しにくさにつながります。

結論は、値だけの転記なら直接代入を優先し、書式、列幅、入力規則、空白無視、行列入替、加算など貼り付け特有の機能が必要なときだけ PasteSpecial を使う、という整理です。複数属性を扱うときは、1回の PasteSpecial で指定できるものと、複数回に分けて重ねるものを分けて考えると安全です。

本記事の対象とゴール

想定読者

  • Excel VBAで転記、帳票作成、一覧表コピーのマクロを書いている人

  • PasteSpecial の引数を見ても、どれを組み合わせてよいか迷う人

  • xlPasteAll を使えばよいのか、xlPasteValues にすべきなのか判断したい人

  • 値、書式、列幅、入力規則などを分けて貼り付ける業務マクロを安定させたい人

本記事で得られること

  1. PasteSpecial の4つの主要引数の役割を説明できるようになります。

  2. 1回で指定できる複合パターンと、複数回に分けるべきパターンを判断できます。

  3. 値だけ転記する場面で、PasteSpecial ではなく直接代入を選ぶ根拠を持てます。

  4. xlPasteAll を安易に使わず、必要な属性だけを明示して貼る設計にできます。

1. PasteSpecialは貼り付け属性を指定する機能である

Excel VBAで PasteSpecial を使う基本形は次のとおりです。

Range("A1:C10").Copy
Range("E1").PasteSpecial _
    Paste:=xlPasteValues, _
    Operation:=xlNone, _
    SkipBlanks:=False, _
    Transpose:=False
Application.CutCopyMode = False

このコードでは、A1:C10 をコピーし、E1 を左上セルとして値だけを貼り付けています。最後の Application.CutCopyMode = False は、Excelのコピー状態を解除する処理です。

PasteSpecial は、先に Copy しておくことを前提に動きます。コピーしていない状態で PasteSpecial だけを実行しても、期待どおりには動きません。この点が、通常の値代入と大きく違います。

2. PasteSpecialの主な引数

PasteSpecial では、主に次の4つの引数を指定します。

  • Paste: 何を貼り付けるか。

  • Operation: 貼付先の既存値に対して計算するか。

  • SkipBlanks: コピー元の空白セルを貼り付けるか。

  • Transpose: 行列を入れ替えるか。

この4つを分けて理解すると、複数属性の貼り付けを整理しやすくなります。

2.1 Paste

Paste は、何を貼り付けるかを指定します。代表的な指定は次のとおりです。

  • xlPasteAll: 値、数式、書式などを含めて貼り付ける。

  • xlPasteValues: 値だけを貼り付ける。

  • xlPasteFormulas: 数式だけを貼り付ける。

  • xlPasteFormats: 書式だけを貼り付ける。

  • xlPasteColumnWidths: 列幅だけを貼り付ける。

  • xlPasteValidation: 入力規則だけを貼り付ける。

  • xlPasteComments: コメントだけを貼り付ける。

業務マクロで最もよく使うのは xlPasteValues です。値だけを貼り付けるため、数式や書式などの余計な属性を持ち込みません。

2.2 Operation

Operation は、貼付先の既存値に対して計算しながら貼り付ける指定です。

  • xlNone: 計算しない。

  • xlAdd: 加算する。

  • xlSubtract: 減算する。

  • xlMultiply: 乗算する。

  • xlDivide: 除算する。

通常は xlNone を使います。加算、減算、乗算、除算は、既存データを一括補正したい場合に使います。

2.3 SkipBlanks

SkipBlanks は、コピー元の空白セルで貼付先を上書きするかどうかを指定します。

SkipBlanks:=True

True にすると、コピー元が空白のセルは貼り付けられず、貼付先の既存値が残ります。

SkipBlanks:=False

False にすると、コピー元が空白なら貼付先も空白になります。既存値を消したいのか、残したいのかで使い分けます。

2.4 Transpose

Transpose は、行列を入れ替える指定です。

Transpose:=True

True にすると、横方向のデータを縦方向に、または縦方向のデータを横方向に貼り付けられます。

たとえば、B1:D1 に 氏名、金額、日付 が横並びで入っているとします。これを Transpose:=True で A1 に貼り付けると、A1:A3 に縦並びで展開されます。

3. 複数属性貼付の考え方

PasteSpecial の複数属性貼付には、大きく2つの考え方があります。

  1. 1回の PasteSpecial で複数の引数を組み合わせる。

  2. PasteSpecial を複数回実行して、複数の属性を重ねる。

たとえば、値だけを行列入れ替えして貼る場合は、1回の PasteSpecial で指定できます。

一方で、値、書式、列幅をすべて貼りたい場合は、PasteSpecial を複数回実行するのが基本です。Paste:= には基本的に一度に1種類の貼り付け対象を指定するためです。

4. 1回のPasteSpecialで指定するパターン

4.1 値だけ貼付と行列入替

横並びの見出しを縦並びに変換する場合などに使います。

Range("B1:E1").Copy
Range("A1").PasteSpecial _
    Paste:=xlPasteValues, _
    Operation:=xlNone, _
    SkipBlanks:=False, _
    Transpose:=True
Application.CutCopyMode = False

このコードは、値だけを貼り付け、計算はせず、空白も貼り付け、行列を入れ替えます。横方向の見出し一覧を、縦方向のチェックリストに変換する場面で使えます。

4.2 すべて貼付と行列入替

値、数式、書式などを含めて、行列を入れ替えて貼り付ける場合は次のように書きます。

Range("B1:E1").Copy
Range("A1").PasteSpecial _
    Paste:=xlPasteAll, _
    Operation:=xlNone, _
    SkipBlanks:=False, _
    Transpose:=True
Application.CutCopyMode = False

ただし、業務マクロでは xlPasteAll の使用には注意が必要です。xlPasteAll は、値だけでなく、書式、数式、コメント、入力規則、条件付き書式なども貼り付ける可能性があります。

見出し名やデータ値だけが必要な場合は、通常は xlPasteValues の方が安全です。

4.3 値だけ貼付と空白セルの無視

コピー元の空白セルで貼付先を消したくない場合は、SkipBlanks:=True を使います。

Range("A1:A10").Copy
Range("C1").PasteSpecial _
    Paste:=xlPasteValues, _
    Operation:=xlNone, _
    SkipBlanks:=True, _
    Transpose:=False
Application.CutCopyMode = False

この場合、コピー元が空白のセルは貼り付けられません。貼付先に既に値がある場合、その値が残ります。

4.4 値だけ貼付と加算

コピー元の値を、貼付先の既存値に加算する場合は Operation:=xlAdd を使います。

Range("A1:A10").Copy
Range("C1").PasteSpecial _
    Paste:=xlPasteValues, _
    Operation:=xlAdd, _
    SkipBlanks:=False, _
    Transpose:=False
Application.CutCopyMode = False

この処理では、C1:C10 の既存値に A1:A10 の値を加算します。数量の補正、残高の調整、集計値への加算などに使えます。

4.5 値だけ貼付と減算

貼付先の既存値から、コピー元の値を減算する場合は Operation:=xlSubtract を使います。

Range("A1:A10").Copy
Range("C1").PasteSpecial _
    Paste:=xlPasteValues, _
    Operation:=xlSubtract, _
    SkipBlanks:=False, _
    Transpose:=False
Application.CutCopyMode = False

この処理では、C1:C10 の既存値から A1:A10 の値を引きます。

4.6 値だけ貼付と乗算

貼付先の既存値に、コピー元の値を掛ける場合は Operation:=xlMultiply を使います。

Range("A1:A10").Copy
Range("C1").PasteSpecial _
    Paste:=xlPasteValues, _
    Operation:=xlMultiply, _
    SkipBlanks:=False, _
    Transpose:=False
Application.CutCopyMode = False

係数を掛ける、単価を補正する、割合を反映する、といった処理で使えます。

4.7 値だけ貼付と除算

貼付先の既存値を、コピー元の値で割る場合は Operation:=xlDivide を使います。

Range("A1:A10").Copy
Range("C1").PasteSpecial _
    Paste:=xlPasteValues, _
    Operation:=xlDivide, _
    SkipBlanks:=False, _
    Transpose:=False
Application.CutCopyMode = False

除算では、コピー元に0が含まれる場合に注意が必要です。ゼロ除算になるため、事前にコピー元の値を確認しておくべきです。

5. PasteSpecialを複数回実行して属性を重ねるパターン

PasteSpecial の Paste:= は、基本的に一度に1種類を指定します。値、書式、列幅を貼りたい場合は、1回の PasteSpecial ですべてを細かく指定するのではなく、複数回に分けて貼り付けます。

5.1 値と書式を貼る

Range("A1:C10").Copy
With Range("E1")
    .PasteSpecial Paste:=xlPasteValues
    .PasteSpecial Paste:=xlPasteFormats
End With
Application.CutCopyMode = False

この処理では、まず値を貼り付け、その後に書式を貼り付けます。帳票や一覧表のコピーでよく使います。

5.2 値、書式、列幅を貼る

Range("A1:C10").Copy
With Range("E1")
    .PasteSpecial Paste:=xlPasteValues
    .PasteSpecial Paste:=xlPasteFormats
    .PasteSpecial Paste:=xlPasteColumnWidths
End With
Application.CutCopyMode = False

この処理では、値、書式、列幅を順番に貼り付けます。帳票テンプレートを別位置にコピーする場合などに使いやすい形です。

5.3 数式と書式を貼る

Range("A1:C10").Copy
With Range("E1")
    .PasteSpecial Paste:=xlPasteFormulas
    .PasteSpecial Paste:=xlPasteFormats
End With
Application.CutCopyMode = False

数式を残したい場合に使います。ただし、相対参照の数式は貼付先に応じて参照先がずれるため注意が必要です。

5.4 数式、書式、列幅を貼る

Range("A1:C10").Copy
With Range("E1")
    .PasteSpecial Paste:=xlPasteFormulas
    .PasteSpecial Paste:=xlPasteFormats
    .PasteSpecial Paste:=xlPasteColumnWidths
End With
Application.CutCopyMode = False

表の構造をそのまま別位置に展開したい場合に使えます。

5.5 値と入力規則を貼る

Range("A1:C10").Copy
With Range("E1")
    .PasteSpecial Paste:=xlPasteValues
    .PasteSpecial Paste:=xlPasteValidation
End With
Application.CutCopyMode = False

入力規則、つまりドロップダウンリストなどを一緒に移したい場合に使います。ただし、入力規則には参照範囲が含まれることがあります。別シートや別ブックに貼り付ける場合、参照先が意図どおりになるか確認が必要です。

5.6 書式と列幅だけを貼る

値は貼らず、見た目だけをコピーしたい場合は次のようにします。

Range("A1:C10").Copy
With Range("E1")
    .PasteSpecial Paste:=xlPasteFormats
    .PasteSpecial Paste:=xlPasteColumnWidths
End With
Application.CutCopyMode = False

帳票レイアウトだけをコピーしたい場合に便利です。

6. よく使う複合パターン

業務マクロでよく使うパターンを、目的別に整理します。

6.1 値だけ貼付

Range("A1:C10").Copy
Range("E1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

値だけ貼付は、数式を値に変換する場合、元データの値だけを別シートへ転記する場合、余計な書式を持ち込みたくない場合に使います。

6.2 値と書式

Range("A1:C10").Copy
With Range("E1")
    .PasteSpecial Paste:=xlPasteValues
    .PasteSpecial Paste:=xlPasteFormats
End With
Application.CutCopyMode = False

値と見た目はコピーしたいが、数式は持ち込みたくない場合に使います。

6.3 値、書式、列幅

Range("A1:C10").Copy
With Range("E1")
    .PasteSpecial Paste:=xlPasteValues
    .PasteSpecial Paste:=xlPasteFormats
    .PasteSpecial Paste:=xlPasteColumnWidths
End With
Application.CutCopyMode = False

表を別位置に複製し、帳票を値ベースでコピーし、列幅も含めて見た目を合わせたい場合に使います。

6.4 値と行列入替

Range("B1:E1").Copy
Range("A1").PasteSpecial _
    Paste:=xlPasteValues, _
    Transpose:=True
Application.CutCopyMode = False

横並びの見出しを縦一覧にする場合や、縦方向のデータを横方向に展開する場合に使います。

6.5 値と空白無視

Range("A1:A10").Copy
Range("C1").PasteSpecial _
    Paste:=xlPasteValues, _
    SkipBlanks:=True
Application.CutCopyMode = False

空白で既存データを消したくない場合、入力済みセルを残しながら一部だけ更新したい場合に使います。

6.6 値と加算

Range("A1:A10").Copy
Range("C1").PasteSpecial _
    Paste:=xlPasteValues, _
    Operation:=xlAdd
Application.CutCopyMode = False

既存値に差分を加算する場合、数量や金額を一括補正する場合、集計値に追加分を反映する場合に使います。

6.7 値と乗算

Range("A1:A10").Copy
Range("C1").PasteSpecial _
    Paste:=xlPasteValues, _
    Operation:=xlMultiply
Application.CutCopyMode = False

係数を掛ける場合、税率や倍率を反映する場合、単価や数量を一括補正する場合に使います。

7. 直接代入との使い分け

PasteSpecial は便利ですが、値だけをコピーするなら、必ずしも使う必要はありません。値だけなら、次のように直接代入した方が速く、安全です。

Range("E1:G10").Value = Range("A1:C10").Value

この書き方はクリップボードを使いません。そのため、処理途中でユーザー操作や別のコピー操作に影響されにくく、処理も安定しやすくなります。

PasteSpecial を使うべきなのは、貼り付け特有の機能が必要な場合です。

  • 書式を貼りたい。

  • 列幅を貼りたい。

  • 入力規則を貼りたい。

  • 行列を入れ替えたい。

  • 貼付時に加算、減算、乗算、除算したい。

  • 空白セルを無視して貼りたい。

単なる値コピーだけなら、直接代入を優先してよいです。

8. PasteSpecialを使うときの注意点

8.1 クリップボードに依存する

PasteSpecial は Copy の後に使う処理です。つまり、Excelのコピー状態に依存します。

処理途中で別のコピー操作が入ると、意図しない内容が貼り付けられる可能性があります。業務マクロでは、貼り付け後に必ず次を実行しておくとよいです。

Application.CutCopyMode = False

8.2 xlPasteAllは使いすぎない

xlPasteAll は便利ですが、貼り付ける範囲が広い指定です。

xlPasteAll では、値、数式、書式、コメント、入力規則、罫線、表示形式、条件付き書式など、必要以上の属性まで貼り付ける可能性があります。

業務マクロでは、意図が明確な xlPasteValues や xlPasteFormats を指定する方が安全です。

8.3 Transposeは大量データで注意する

Transpose:=True は便利ですが、大量データでは失敗する可能性があります。特に行数や列数が多いデータを行列入れ替えする場合は注意が必要です。

小規模な見出し一覧や設定値一覧で使う分には便利ですが、大量データの変換には別の方法も検討します。

8.4 貼付先のサイズに注意する

貼付先は左上セルだけを指定すればよいです。

Range("A1:C10").Copy
Range("E1").PasteSpecial Paste:=xlPasteValues

この場合、E1:G10 に貼り付けられます。ただし、貼付先に既存データがある場合は上書きされます。必要に応じて、貼付先範囲を事前に確認またはクリアします。

9. 業務マクロでの標準パターン

業務マクロで使いやすい標準パターンは次の形です。

Sub 値書式列幅を貼付する()
    Range("A1:C10").Copy
    With Range("E1")
        .PasteSpecial Paste:=xlPasteValues
        .PasteSpecial Paste:=xlPasteFormats
        .PasteSpecial Paste:=xlPasteColumnWidths
    End With
    Application.CutCopyMode = False
End Sub

このコードは、値を貼り、書式を貼り、列幅を貼り、最後にコピー状態を解除しています。

複数属性を貼り付ける場合は、このように処理を分けた方が、意図が明確になります。

10. 見出しを縦に展開するコードをどう読むか

次のコードを例にします。

.Range("B1").Resize(1, c).Copy
ws設定.Range("A1").PasteSpecial _
    Paste:=xlPasteAll, _
    Operation:=xlNone, _
    SkipBlanks:=False, _
    Transpose:=True

これは、横並びのデータを縦並びに変換して貼り付ける処理です。

コピー元が B1:D1 に 氏名、金額、日付 のように並んでいる場合、Transpose:=True によって、貼付先の A1:A3 に縦並びで展開されます。

ただし、この処理では xlPasteAll を使っているため、値だけでなく書式なども貼り付けられます。見出しチェック用の項目名リストを作るだけなら、通常は次のように値だけを貼り付ける方が安全です。

.Range("B1").Resize(1, c - 1).Copy
ws設定.Range("A1").PasteSpecial _
    Paste:=xlPasteValues, _
    Operation:=xlNone, _
    SkipBlanks:=False, _
    Transpose:=True
Application.CutCopyMode = False

さらに、見出しチェックのためだけであれば、シートに貼り付けず、配列で処理する方が構造としてはよい場合もあります。PasteSpecial は便利ですが、常に最初の選択肢ではありません。

11. PasteSpecial早見リスト

目的別に見ると、よく使う指定は次のように整理できます。

  • 値だけ貼る場合は、Paste:=xlPasteValues を使います。

  • 書式だけ貼る場合は、Paste:=xlPasteFormats を使います。

  • 数式だけ貼る場合は、Paste:=xlPasteFormulas を使います。相対参照に注意します。

  • 列幅だけ貼る場合は、Paste:=xlPasteColumnWidths を使います。

  • 値を行列入替する場合は、Paste:=xlPasteValues と Transpose:=True を組み合わせます。

  • すべて行列入替する場合は、Paste:=xlPasteAll と Transpose:=True を組み合わせます。ただし余計な属性に注意します。

  • 値を空白無視で貼る場合は、Paste:=xlPasteValues と SkipBlanks:=True を組み合わせます。

  • 値を加算貼付する場合は、Paste:=xlPasteValues と Operation:=xlAdd を組み合わせます。

  • 値を減算貼付する場合は、Paste:=xlPasteValues と Operation:=xlSubtract を組み合わせます。

  • 値を乗算貼付する場合は、Paste:=xlPasteValues と Operation:=xlMultiply を組み合わせます。

  • 値を除算貼付する場合は、Paste:=xlPasteValues と Operation:=xlDivide を組み合わせます。ゼロ除算に注意します。

  • 入力規則だけ貼る場合は、Paste:=xlPasteValidation を使います。

  • コメントだけ貼る場合は、Paste:=xlPasteComments を使います。

12. まとめ

PasteSpecial は、Excel VBAで貼り付け方法を細かく制御するための機能です。複数属性で貼り付ける場合は、1回の PasteSpecial で引数を組み合わせるのか、PasteSpecial を複数回実行して属性を重ねるのかを分けて考えます。

1回で指定できる代表例は、値と行列入替、値と空白無視、値と加算などです。

Paste:=xlPasteValues, Transpose:=True
Paste:=xlPasteValues, SkipBlanks:=True
Paste:=xlPasteValues, Operation:=xlAdd

一方で、値、書式、列幅のように複数の貼付属性を重ねたい場合は、次のように複数回に分けます。

Range("A1:C10").Copy
With Range("E1")
    .PasteSpecial Paste:=xlPasteValues
    .PasteSpecial Paste:=xlPasteFormats
    .PasteSpecial Paste:=xlPasteColumnWidths
End With
Application.CutCopyMode = False

業務マクロでは、xlPasteAll を安易に使わず、必要な属性だけを明示して貼り付けることが重要です。また、値だけをコピーする場合は、PasteSpecial よりも直接代入の方が安全で速いです。

Range("E1:G10").Value = Range("A1:C10").Value

PasteSpecial は便利ですが、貼り付ける属性を明確に管理しないと、余計な書式や入力規則を持ち込む原因になります。業務マクロでは、「何を貼るのか」を明示し、必要な属性だけを分けて貼るのが安全です。

出典メモ

  • 元資料: C:\Users\hoehoe\Downloads\excel_vba_pastespecial_patterns.md

  • 記事化日: 2026年6月27日

  • 加工方針: 元MarkdownのPasteSpecial整理をもとに、LWP公開記事標準に合わせて著作権表示、結論を含む記事要約、本記事の対象とゴール、本文章立て、出典メモを追加した。Markdown表はDOCX化後の残骸を避けるため、早見リストへ置き換えた。