【VBA】クリップボードを使ってデータをコピー・貼り付け・クリアする方法(コピペOK)

VBA
スポンサーリンク

記事ID: 105
タイトル: クリップボードを使ってデータをコピー・貼り付け・クリアする方法
カテゴリ: シート操作
一次キーワード: VBA クリップボード コピー 貼り付け
想定読者: Range.Copyの点線が消えない、PasteSpecialの引数がわからない、テキストをクリップボード経由で操作したい初心者〜初級者
検索意図: VBAでクリップボードを使ったコピー・貼り付け・クリアの方法を知りたい
読者の悩み(1文): Range.Copyした後に点線が残る、値だけ貼り付けたい、テキストをクリップボードに送りたい
読了後にできること(1文): Range.Copy/PasteSpecialで書式・値を選んで貼り付けられ、MSForms.DataObjectでテキストのクリップボード操作もできるようになる
前提条件:
  - Excel版: Excel 2016以降 / Microsoft 365
  - OS: Windows 10/11
  - 保存形式: .xlsm(マクロ有効ブック)
  - 貼り付け場所: 標準モジュール
  - 実行方法: Alt+F8でマクロ実行 / ボタン割り当て
更新日: 2026-03-18

スポンサーリンク
  1. この記事でわかること
  2. どんな場面で使う?
  3. 完成イメージ(Before / After)
  4. 実行前の準備
    1. バックアップを取る
    2. Excelをマクロ有効ブック(.xlsm)で保存する
  5. 手順(コピペ → 実行まで約5分)
    1. VBE(コードを書く画面)を開く
    2. 標準モジュールを挿入する
    3. コードを貼り付けて実行する
  6. コード(基本版)– Range.CopyでセルをコピーしてPasteSpecialで値貼り付け
    1. 書き換えポイント
    2. PasteSpecialのPaste引数一覧
  7. コード(応用版)– MSForms.DataObjectでテキストをクリップボードに送る・取り出す
    1. パターン1: テキストをクリップボードに送る
    2. パターン2: クリップボードからテキストを取り出す
  8. コード(実務版)– エラー処理・クリップボードクリア付きの安全な一括コピー
    1. 書き換えポイント
    2. シート構成の例
  9. よくある落とし穴5選
    1. 1. Range.Copyの後に点線(コピーモード)が残り続ける
    2. 2. PasteSpecialで「PasteSpecialメソッドは失敗しました」(エラー1004)
    3. 3. MSForms.DataObjectで「ユーザー定義型は定義されていません」
    4. 4. PasteSpecialの引数を省略して書式まで貼り付いてしまう
    5. 5. 結合セルにPasteSpecialすると「この操作には同じサイズの結合セルが必要です」
    6. VBAのPasteSpecialで値だけ貼り付けできないときの対処法
    7. VBAでクリップボードのコピーモード(点線)が消えないときの対処法
  10. FAQ
    1. Q1: Range.Copy と Range.Value = Range.Value はどう使い分ける?
    2. Q2: PasteSpecialのTranspose引数で行列を入れ替えられる?
    3. Q3: MSForms.DataObjectの参照設定が見つからない場合は?
    4. Q4: PasteSpecialのOperation引数で演算貼り付けできる?
    5. Q5: マクロの中でコピーしたデータを複数箇所に貼り付けるには?
  11. まとめ
    1. 関連記事
  12. 次にやりたくなること

この記事でわかること

  • Range.Copy + PasteSpecialで「値だけ」「書式だけ」を選んでセルを貼り付ける方法
  • MSForms.DataObjectでテキストをクリップボードに送る・取り出す方法
  • クリップボードをクリアして点線(コピーモード)を消す方法

対象: Excel 2016以降 / Microsoft 365、Windows 10/11

どんな場面で使う?

  • 数式を含むセルの計算結果だけを別の列やシートに貼り付けたいとき
  • 書式(色・罫線・フォント)を維持したまま値だけ入れ替えたいとき
  • セルの内容をテキストとしてクリップボードに送り、メモ帳や他アプリにCtrl+Vで貼り付けたいとき
  • マクロの中でコピー→貼り付けを安全に行い、終了後に点線(コピーモード)を確実に消したいとき

完成イメージ(Before / After)

Before(A列に数式+書式付きデータ):

A列 B列
=100*1.1(太字・黄色背景) (空)
=200*1.1(太字・黄色背景) (空)
=300*1.1(太字・黄色背景) (空)

After(B列に値だけ貼り付け):

A列 B列
=100*1.1(太字・黄色背景) 110
=200*1.1(太字・黄色背景) 220
=300*1.1(太字・黄色背景) 330

B列には数式ではなく計算結果の値だけが入り、書式(太字・背景色)はコピーされない。

自分も以前、Range.Copyでセルをコピーした後に点線がずっと残るのが地味に気になっていた。そのまま別の操作をしたら、意図しないセルにデータが貼り付いてしまい冷や汗をかいたこともある。CutCopyModeの解除とPasteSpecialの使い分けを覚えてからは、コピペ処理が安定して動くようになった。この記事で、クリップボード操作の基本から安全な使い方まで一通りできるようになればうれしい。

VBAのクリップボード操作には2つの方法がある。Range.Copy/PasteSpecial(セル範囲のコピペ)とMSForms.DataObject(テキストのクリップボード読み書き)。用途に応じて使い分ける。

なお、クリップボードを使わずにセルの値を直接転記する方法もある。詳しくは セルの転記を自動化する方法(別シートへのコピペ不要に) を参照。

実行前の準備

バックアップを取る

PasteSpecialは貼り付け先のセルを上書きする。必ずファイルのコピーを別フォルダに保存してから実行する。

Excelをマクロ有効ブック(.xlsm)で保存する

拡張子が .xlsx のままだとマクロが保存できない。

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

  1. Excelで Alt + F11 を押す

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」

コードを貼り付けて実行する

  1. コードウィンドウに、下のコードをそのままコピペする
  2. Alt + F8 → マクロ名を選んで「実行」

ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。

コード(基本版)– Range.CopyでセルをコピーしてPasteSpecialで値貼り付け

A列のデータをB列に「値だけ」貼り付ける。まずはこれで動きを確認する。


'============================================================
' ■ セル範囲を値だけ貼り付け(基本版)
'   → A1:A10 の値を B1 に値のみ貼り付け
'============================================================
Sub CopyPasteValues()

    '--- コピー元の範囲を指定してコピー
    Range("A1:A10").Copy

    '--- 貼り付け先に「値のみ」で貼り付け
    Range("B1").PasteSpecial Paste:=xlPasteValues

    '--- クリップボードをクリア(点線を消す)
    Application.CutCopyMode = False

    MsgBox "値の貼り付けが完了しました。", vbInformation

End Sub

書き換えポイント

変数・引数 説明 初期値
Range("A1:A10") コピー元のセル範囲 A1:A10(1行目がヘッダーなら A2:A10 に変更)
Range("B1") 貼り付け先の左上セル B1(ヘッダーありなら B2
Paste:=xlPasteValues 貼り付けの種類 xlPasteValues(値のみ)

PasteSpecialのPaste引数一覧

引数値 意味 使いどころ
xlPasteAll すべて(既定) 書式+数式+値を丸ごとコピー
xlPasteValues 値のみ 数式を消して計算結果だけ残したい
xlPasteFormats 書式のみ 色・フォント・罫線だけコピー
xlPasteFormulas 数式のみ 数式だけコピー(書式は持っていかない)
xlPasteColumnWidths 列幅 列幅を揃えたい
xlPasteComments コメント コメントだけコピー

コード(応用版)– MSForms.DataObjectでテキストをクリップボードに送る・取り出す

セルの値をテキストとしてクリップボードに送る例。メモ帳など外部アプリにCtrl+Vで貼り付けられるようになる。

注意: この方法を使うには、VBEで「ツール」→「参照設定」→「Microsoft Forms 2.0 Object Library」にチェックを入れるか、下記コードのように遅延バインディングを使う。参照設定が一覧に見つからない場合(特に64bit環境)は、遅延バインディングを使えば問題ない。

パターン1: テキストをクリップボードに送る


'============================================================
' ■ セルの値をテキストとしてクリップボードに送る
'   → A1の値をクリップボードにコピー(メモ帳等に貼り付け可能)
'============================================================
Sub SendTextToClipboard()

    '--- DataObjectを作成(参照設定不要の書き方)
    '    下の長い文字列はDataObjectを作るためのID。そのままコピペしてOK
    Dim objData As Object
    Set objData = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

    Dim strText As String
    strText = CStr(Range("A1").Value)  '← セルの値を文字列に変換

    objData.SetText strText    '← テキストをセット
    objData.PutInClipboard     '← クリップボードに送る

    MsgBox "クリップボードにコピーしました。" & vbCrLf & _
           "内容: " & strText, vbInformation

End Sub

パターン2: クリップボードからテキストを取り出す


'============================================================
' ■ クリップボードのテキストをセルに貼り付ける
'   → クリップボードの内容を A1 に書き込む
'============================================================
Sub GetTextFromClipboard()

    '--- DataObjectを作成(参照設定不要の書き方)
    Dim objData As Object
    Set objData = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

    On Error Resume Next
    objData.GetFromClipboard   '← クリップボードから取得

    Dim strText As String
    strText = objData.GetText  '← テキストとして取り出す
    On Error GoTo 0

    If Len(strText) = 0 Then
        MsgBox "クリップボードにテキストがありません。", vbExclamation
        Exit Sub
    End If

    Range("A1").Value = strText

    MsgBox "クリップボードの内容をA1に書き込みました。" & vbCrLf & _
           "内容: " & strText, vbInformation

End Sub

文字列の置換処理と組み合わせるなら セルの文字列を一括置換する方法 も参考になる。

コード(実務版)– エラー処理・クリップボードクリア付きの安全な一括コピー

エラー処理+CutCopyModeクリアのパターンを覚えてからは、どのコピペマクロにもこのテンプレートを使い回している。処理が途中で止まってもクリップボードが残らないので安心感が違う。

A列のデータをB列に値だけ貼り付ける実務版。エラーが起きてもCutCopyModeを確実にクリアする。

※ B列の既存データは上書きされます。実行前にバックアップを取ってください。


'============================================================
' ■ セル範囲を値だけ貼り付け(実務版・エラー処理付き)
'   → A列のデータを B列に値のみ貼り付け
'   → エラー発生時もクリップボードを確実にクリア
'   → 対象シート: アクティブシート
'============================================================
Sub CopyPasteValuesSafe()

    '--- ★書き換えポイント ---
    Dim dstCell As String
    dstCell = "B1"               '← 貼り付け先の開始セル(B列)

    Dim srcCol As Long
    srcCol = 1                   '← コピー元の列番号(A列=1)

    Dim dstCol As Long
    dstCol = 2                   '← 貼り付け先の列番号(B列=2)

    Dim startRow As Long
    startRow = 2                 '← データの開始行(1行目はヘッダー)
    '--- ★ここまで ---

    Dim ws As Worksheet
    Set ws = ActiveSheet

    '--- 最終行を取得
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, srcCol).End(xlUp).Row

    If lastRow < startRow Then
        MsgBox "データがありません。", vbExclamation
        Exit Sub
    End If

    '--- 高速化設定
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    On Error GoTo ErrHandler

    '--- コピー元範囲をコピー
    ws.Range(ws.Cells(startRow, srcCol), ws.Cells(lastRow, srcCol)).Copy

    '--- 貼り付け先に値だけ貼り付け
    ws.Cells(startRow, dstCol).PasteSpecial Paste:=xlPasteValues

    '--- クリップボードクリア
    Application.CutCopyMode = False

    '--- 高速化設定を元に戻す
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

    MsgBox lastRow - startRow + 1 & " 行の値を貼り付けました。", vbInformation
    Exit Sub

ErrHandler:
    '--- エラー時もクリップボードと設定を確実に復帰
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "内容: " & Err.Description, vbCritical

End Sub

書き換えポイント

変数 説明 初期値
dstCell 貼り付け先の開始セル "B1"
srcCol コピー元の列番号 1(A列)
dstCol 貼り付け先の列番号 2(B列)
startRow データの開始行 2(1行目はヘッダー)
Paste:=xlPasteValues 貼り付けの種類 値のみ。書式も必要なら xlPasteAll に変更

シート構成の例

A列(数式+書式付き) B列(値のみ貼り付け)← マクロで書き込み
ヘッダー ヘッダー
=100*1.1(太字) 110
=200*1.1(太字) 220
=300*1.1(太字) 330

エラー処理の詳細は エラー処理(On Error)で止まらないマクロを作る方法 を参照。

結合セルがある場合、コピーに失敗することがある。事前に セル結合を一括解除してデータを整形する方法 で結合を解除しておくと安全。

よくある落とし穴5選

1. Range.Copyの後に点線(コピーモード)が残り続ける

自分もこれが地味に気になっていた。マクロは終わっているのにセルの周りに点線がチカチカ残る。そのまま放置して手動でCtrl+Vを押したら、意図しないセルにデータが貼り付いてしまい冷や汗をかいた。

原因: Application.CutCopyMode = False を実行していない。

対策: PasteSpecialの直後に Application.CutCopyMode = False を入れる。実務版のようにエラー処理の中にも入れておくと安全。

2. PasteSpecialで「PasteSpecialメソッドは失敗しました」(エラー1004)

原因: Range.Copyを実行する前にPasteSpecialを呼んでいる、またはCopyとPasteSpecialの間でCutCopyModeが解除されている。

対策: Copy → PasteSpecial → CutCopyMode = False の順序を守る。間に他のCopy操作やCutCopyMode = Falseを挟まない。

3. MSForms.DataObjectで「ユーザー定義型は定義されていません」

原因: 参照設定「Microsoft Forms 2.0 Object Library」が設定されていない。

対策: VBEで「ツール」→「参照設定」→「Microsoft Forms 2.0 Object Library」にチェック。見つからない場合(特に64bit環境)は遅延バインディング(CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"))を使えば参照設定なしで動作する。

4. PasteSpecialの引数を省略して書式まで貼り付いてしまう

原因: Paste引数の既定値が xlPasteAll(すべて貼り付け)。引数を省略すると値だけでなく書式・数式もすべてコピーされる。

対策: 値だけ欲しいなら Paste:=xlPasteValues を明示的に指定する。


' NG: 引数省略 → 書式+数式+値すべてコピー
Range("B1").PasteSpecial

' OK: 値のみを明示
Range("B1").PasteSpecial Paste:=xlPasteValues

5. 結合セルにPasteSpecialすると「この操作には同じサイズの結合セルが必要です」

原因: コピー元とコピー先でセル結合の構造が異なる。

対策: 貼り付け先の結合を解除してからPasteSpecialを実行する。結合解除の方法は セル結合を一括解除してデータを整形する方法 を参照。

VBAのPasteSpecialで値だけ貼り付けできないときの対処法

「PasteSpecialで値だけ貼り付けたのに書式までコピーされる」という場合、原因は Paste:=xlPasteValues の指定忘れだ。PasteSpecialの引数を省略すると既定値の xlPasteAll(すべて)が適用される。必ず Paste:=xlPasteValues を明示的に記述する。

VBAでクリップボードのコピーモード(点線)が消えないときの対処法

「マクロは終了したのにセルの周りに点線が残り続ける」という場合、原因は Application.CutCopyMode = False の記述漏れだ。PasteSpecialの直後にこの1行を入れる。エラーで処理が途中停止した場合にも消えないので、On Error GoToのエラーハンドラ内にも同じ行を入れておくと安全。

FAQ

Q1: Range.Copy と Range.Value = Range.Value はどう使い分ける?

比較項目 Range.Copy + PasteSpecial Range.Value = Range.Value
クリップボード 使う 使わない
貼り付け種類の選択 値/書式/数式を選べる 値のみ
処理速度 やや遅い 速い
CutCopyModeの管理 必要 不要

迷ったら: 値だけ転記するなら Range.Value = Range.Value の方がシンプルで速い。書式や数式も含めてコピーしたいときだけRange.Copy + PasteSpecialを使う。詳しくは セルの転記を自動化する方法 を参照。

Q2: PasteSpecialのTranspose引数で行列を入れ替えられる?

入れ替えられる。PasteSpecial Paste:=xlPasteAll, Transpose:=True で行と列が入れ替わる。


Range("A1:A5").Copy
Range("C1").PasteSpecial Paste:=xlPasteAll, Transpose:=True
Application.CutCopyMode = False
'→ A1:A5(縦5セル)がC1:G1(横5セル)に貼り付く

転置の詳細は データの行と列を入れ替える(転置する)方法 を参照。

Q3: MSForms.DataObjectの参照設定が見つからない場合は?

VBEの「参照設定」ダイアログで「Microsoft Forms 2.0 Object Library」が一覧にない場合がある(特に64bit環境)。この場合は遅延バインディング(CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"))を使えば参照設定なしで動作する。本記事の応用版コードはこの方法を採用している。

Q4: PasteSpecialのOperation引数で演算貼り付けできる?

できる。既存データに対して演算しながら貼り付けられる。

Operation引数 意味
xlPasteSpecialOperationNone 演算なし(既定)
xlPasteSpecialOperationAdd 加算
xlPasteSpecialOperationSubtract 減算
xlPasteSpecialOperationMultiply 乗算
xlPasteSpecialOperationDivide 除算

例:B列の値にA列の値を加算する場合


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

Q5: マクロの中でコピーしたデータを複数箇所に貼り付けるには?

Range.Copyは1回実行すれば、CutCopyModeをクリアするまで何度でもPasteSpecialできる。


Range("A1:A10").Copy
Range("B1").PasteSpecial Paste:=xlPasteValues   '← 1回目
Range("C1").PasteSpecial Paste:=xlPasteValues   '← 2回目もOK
Range("D1").PasteSpecial Paste:=xlPasteFormats  '← 書式だけ別の列に
Application.CutCopyMode = False                  '← 全部貼り終わってからクリア

まとめ

  • Range.Copy + PasteSpecial: セル範囲を値/書式/数式を選んで貼り付けられる
  • Application.CutCopyMode = False: コピー後のクリップボードクリア。忘れると点線が残る
  • MSForms.DataObject: テキストをクリップボードに送る/取り出す。外部アプリとの連携に使う
  • エラー処理: On Error GoToでCutCopyModeの復帰を保証する。実務では必須

関連記事

次にやりたくなること

コメント

タイトルとURLをコピーしました