記事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
—
この記事でわかること
- 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 のままだとマクロが保存できない。
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
- Excelで
Alt + F11を押す
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
コードを貼り付けて実行する
- コードウィンドウに、下のコードをそのままコピペする
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の復帰を保証する。実務では必須
関連記事
- セルの転記を自動化する方法(別シートへのコピペ不要に) — Value=Valueでクリップボード不要の値転記
- セルの文字列を一括置換する方法 — クリップボードで取得したテキストの加工
- セル結合を一括解除してデータを整形する方法 — コピー前に結合を解除する前処理
- データの行と列を入れ替える(転置する)方法 — PasteSpecialのTranspose引数の活用
- 配列を使ってVBAの処理速度を10倍にする方法 — 大量データならRange.Copyより配列の方が速い
—
次にやりたくなること
- セルの転記を自動化する方法(別シートへのコピペ不要に): クリップボードを使わず、Value=Valueで直接転記する方法。大量データの値コピーならこちらが速い。
- データの行と列を入れ替える(転置する)方法: PasteSpecialのTranspose引数を使って、行と列を入れ替えたデータを貼り付けたい場合。
- 配列を使ってVBAの処理速度を10倍にする方法: 大量データのコピペが遅いと感じたら、配列に読み込んで一括書き出しする方法を試してみてほしい。
- セル結合を一括解除してデータを整形する方法: 結合セルがあるとPasteSpecialが失敗する。コピペ前の前処理として使える。


コメント