Excel VBAでクリップボードにコピーする方法をお探しですね。

広告

Excel VBAでクリップボードにテキストをコピー&クリアする方法

Excel VBAで処理結果やセルの値を外部アプリに貼り付けたいとき、クリップボードへのコピーを自動化できると作業がぐっと楽になります。

ただ、コピー処理を繰り返すマクロを作っていると、「クリップボードがいっぱいです」なんて警告が出たり、前にコピーした情報が残ったままになっていないか心配になったりしますよね。

この記事では、Excel VBAでテキストをクリップボードにコピーする方法と、使い終わったクリップボードやメモリをきれいにする方法を、初心者の方にも分かりやすく解説します。

Excel VBAでテキストをクリップボードにコピーする基本

Excel VBAでテキストをクリップボードにコピーするには、`MSForms.DataObject`を使う方法が便利です。

`DataObject`は、文字列を一時的に保存して、それをWindowsのクリップボードに渡すためのオブジェクトです。

セル範囲をそのままコピーするだけなら`Range.Copy`でもできますが、自分で組み立てた文字列や処理結果、CSV形式に整えたテキストなどをコピーしたいときは、`DataObject`を使う方が扱いやすいんです。

たとえば「A1セルの値をクリップボードに入れて、メモ帳やメールに貼り付けられるようにする」といった使い方に向いています。

以下は、指定した文字列をクリップボードにコピーする基本的なコードです。

環境によっては「Microsoft Forms 2.0 Object Library」への参照設定が必要になることもありますが、まずは基本の書き方として覚えておくと便利ですよ。

“`vb
Sub CopyTextToClipboard()
Dim obj As Object
Dim text As String

text = “Excel VBAからクリップボードにコピーするテキストです。

Set obj = CreateObject(“Forms.DataObject”)
obj.SetText text
obj.PutInClipboard

Set obj = Nothing

MsgBox “クリップボードにコピーしました。


End Sub
“`

このコードでは、`SetText`でコピーしたい文字列をセットして、`PutInClipboard`で実際にクリップボードへ送っています。

`CreateObject(“Forms.DataObject”)`と書いているので、参照設定を追加しなくても動く場合が多いです。

ただし、すべてのPCで必ず同じように動くとは限りません。

会社のPCや他の人に配る用のマクロでは、使う人のOffice環境によってエラーになることもあるので、実行環境を確認しておくことが大切です。

特に、他の人に配るExcelファイルでは、エラーが出たときのメッセージを用意しておくと親切ですね。

セルの値をコピーしたい場合は、文字列の部分をセル参照に変えるだけでOKです。

たとえば、A1セルの値をコピーするなら次のように書けます。

“`vb
Sub CopyCellValueToClipboard()
Dim obj As Object
Dim text As String

text = CStr(ThisWorkbook.Worksheets(“Sheet1”).Range(“A1”).Value)

Set obj = CreateObject(“Forms.DataObject”)
obj.SetText text
obj.PutInClipboard

Set obj = Nothing
End Sub
“`

`CStr`は値を文字列に変換する関数です。

セルに数値や日付が入っていても、クリップボードに渡す内容を文字列として扱いやすくするために使っています。

ただし、日付や数値の表示形式までそのままコピーしたい場合は、`.Value`ではなく`.Text`を使う方法もあります。

たとえば、セルに「2026/05/12」と表示されている形式を優先したいなら、`Range(“A1”).Text`を使うと画面上の表示に近い形で取得できますよ。

Range.Copyとの違いと、テキストコピーで気をつけたいこと

Excel VBAでコピーといえば、まず`Range.Copy`を思い浮かべる人も多いんじゃないでしょうか。

`Range.Copy`は、セルの値だけじゃなくて、書式、罫線、数式、列幅などExcel上の情報をまるごとコピーするための命令です。

なので、Excel内でセル範囲を貼り付けたいときには便利なんですが、単純なテキストを外部アプリに渡したいときには余計な情報が含まれてしまうことがあります。

メール本文、チャット、メモ帳、Webフォームなどに貼り付ける用途では、あらかじめ文字列として整えてからクリップボードに入れる方が安定するんです。

たとえば、複数セルの値をタブ区切りや改行付きのテキストにしてコピーしたい場合は、VBA側で文字列を組み立ててから`DataObject`に渡します。

この方法なら、Excelの見た目に左右されず、貼り付け先に合わせた形式を作れるんです。

次の例では、A1からA5までの値を改行区切りでまとめてクリップボードにコピーしています。

“`vb
Sub CopyRangeAsText()
Dim obj As Object
Dim rng As Range
Dim cell As Range
Dim text As String

Set rng = ThisWorkbook.Worksheets(“Sheet1”).Range(“A1:A5”)

For Each cell In rng
text = text & CStr(cell.Value) & vbCrLf
Next cell

If Len(text) > 0 Then
text = Left(text, Len(text) – Len(vbCrLf))
End If

Set obj = CreateObject(“Forms.DataObject”)
obj.SetText text
obj.PutInClipboard

Set obj = Nothing
End Sub
“`

ここで使っている`vbCrLf`は改行を表す定数です。

Windows環境でテキストを改行付きで貼り付けたいときによく使います。

最後に余分な改行を削除しているのは、貼り付けたときに末尾に不要な空行が入るのを防ぐためです。

細かい処理に見えますが、実務でメール本文や報告文を自動生成する場合には、こうした整形の丁寧さが使いやすさにつながるんですよ。

ところで、クリップボードには「Windowsのクリップボード」と「Officeクリップボード」という2つの考え方があります。

Windowsのクリップボードは、Ctrl+CやVBAのコピー処理で使われるOS側の一時保存場所です。

一方、Officeクリップボードは、WordやExcelなどOfficeアプリが複数のコピー履歴を管理するための機能です。

Microsoftのサポート情報でも、Officeクリップボードでは複数の項目を保存したり、作業ウィンドウから個別削除やすべてクリアを行ったりできると説明されています。

VBAで扱う場合は、この2つを混同しないことが大事なんです。

クリップボードやメモリをクリアする方法

Excel VBAで「メモリをクリアしたい」と言う場合、実はいくつかの意味が考えられます。

ひとつは、Excelでコピーしたセル範囲の選択状態、つまり点滅する枠線を消したいケースです。

もうひとつは、Windowsのクリップボードに残ったテキストそのものを空にしたいケースです。

さらに、大量データを扱うマクロでは、使い終わったオブジェクト変数や配列を解放して、VBA側のメモリ使用を抑えたいという意味で使われることもあります。

目的によって使うコードが変わるので、まず「何を消したいのか」を分けて考える必要があるんですね。

Excel上のコピー状態を解除するだけなら、次のコードで対応できます。

“`vb
Sub ClearExcelCopyMode()
Application.CutCopyMode = False
End Sub
“`

`Application.CutCopyMode = False`は、Excelでコピー中または切り取り中の状態を解除する命令です。

セルの周りに表示される点線の枠が消えて、Excelが「貼り付け待ち」の状態じゃなくなります。

ただし、この命令はWindowsのクリップボードの中身を完全に空にするものではありません。

つまり、さっきコピーした文字列やセル内容が、他のアプリに貼り付けられる状態で残っている場合があるんです。

セキュリティ上の理由でクリップボード自体を空にしたい場合は、別の方法が必要になります。

`DataObject`を使って空文字をクリップボードに入れることで、実質的にテキストの内容を消す方法もあります。

完全な「空」にするというより、空のテキストで上書きするイメージですね。

“`vb
Sub ClearClipboardByEmptyText()
Dim obj As Object

Set obj = CreateObject(“Forms.DataObject”)
obj.SetText “”
obj.PutInClipboard

Set obj = Nothing
End Sub
“`

この方法はシンプルで、テキストコピーを扱うマクロの最後に入れやすいのがメリットです。

ただし、クリップボードにはテキスト以外にも画像、HTML形式、Excel独自形式など複数の形式が保存されることがあります。

空文字で上書きする方法では、状況によってはすべての形式を完全に消したとは言い切れないんです。

重要な情報を扱う業務マクロでは、単に空文字を入れるだけで十分か、運用上のルールも含めて検討する必要があります。

より確実にWindowsのクリップボードを空にしたい場合は、Windows APIを使う方法があります。

APIとは、Windowsが提供する機能をVBAから呼び出す仕組みです。

ちょっと上級者向けですが、クリップボードを開いて、内容を空にして、閉じるという流れをコード化できます。

64bit版Officeと32bit版Officeで宣言の書き方が変わるので、以下のように条件付きコンパイルを使うと比較的安全です。

“`vb
#If VBA7 Then

Private Declare PtrSafe Function OpenClipboard Lib “user32” (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function EmptyClipboard Lib “user32” () As Long
Private Declare PtrSafe Function CloseClipboard Lib “user32” () As Long
#Else

Private Declare Function OpenClipboard Lib “user32” (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib “user32” () As Long
Private Declare Function CloseClipboard Lib “user32” () As Long
#End If

Sub ClearWindowsClipboard()
If OpenClipboard(0&) <> 0 Then
EmptyClipboard
CloseClipboard
End If
End Sub
“`

このコードは、Windowsのクリップボードを空にする目的で使います。

`OpenClipboard`でクリップボードを操作できる状態にして、`EmptyClipboard`で内容を削除して、最後に`CloseClipboard`で閉じています。

APIを使う場合、エラーが起きたときにクリップボードを開いたままにしないことが大切です。

実務で使うなら、エラー処理を追加して、処理の最後に必ず`CloseClipboard`が実行されるようにしておくと安心ですよ。

VBAのメモリ面では、使い終わったオブジェクト変数に`Nothing`を設定したり、大きな配列を`Erase`したりする方法があります。

たとえば、`Set obj = Nothing`はオブジェクト参照を解放するための基本的な書き方です。

配列の場合は`Erase arr`のように書くことで、配列の内容を初期化できます。

ただし、VBAのメモリ管理は完全に手動で制御できるものではなくて、Excel本体の状態やアドイン、開いているブックの数にも影響されます。

なので、「クリップボードを空にする」「Excelのコピー状態を解除する」「変数を解放する」を分けて実装することが、トラブルを減らす近道なんです。

実務で使いやすいコピー・クリア処理のまとめ方

実務で使うマクロでは、単にコピー処理だけを書くんじゃなくて、エラー対策と後片付けまで含めておくと安定します。

特に、処理の途中でエラーが起きた場合、クリップボードに古い情報が残ったり、Excelのコピー状態が解除されなかったりすることがあるんです。

また、個人情報や社外秘の内容をクリップボードに入れる場合は、処理後にクリアする設計にしておくと安全性が高まります。

ここでは、テキストをコピーして、必要に応じて最後にExcelのコピー状態やオブジェクトを片付ける形のサンプルを紹介しますね。

“`vb
Sub CopyReportText()
On Error GoTo ErrHandler

Dim obj As Object
Dim text As String

text = “売上レポート” & vbCrLf & _
“作成日:” & Format(Date, “yyyy/mm/dd”) & vbCrLf & _
“担当者:” & Environ$(“Username”)

Set obj = CreateObject(“Forms.DataObject”)
obj.SetText text
obj.PutInClipboard

Application.CutCopyMode = False
Set obj = Nothing

MsgBox “レポート文をクリップボードにコピーしました。


Exit Sub

ErrHandler:
Application.CutCopyMode = False
Set obj = Nothing
MsgBox “クリップボードへのコピーに失敗しました。

” & vbCrLf & Err.Description
End Sub
“`

このサンプルでは、コピーしたい文章をVBAで組み立ててからクリップボードに送っています。

`Format(Date, “yyyy/mm/dd”)`で日付を整えて、`Environ$(“Username”)`でWindowsのユーザー名を取得しています。

実際の業務では、ここにセルの値や集計結果を組み合わせることで、定型文作成や報告文作成を効率化できるんです。

エラーが起きた場合でも、`ErrHandler`でコピー状態の解除とオブジェクトの解放を行っているので、最低限の後片付けができます。

目的別に考えると、使い分けの目安は次のようになります。

– **セル範囲をExcel内で貼り付けたい場合**は、`Range.Copy`を使う
– **任意の文字列を外部アプリへ貼り付けたい場合**は、`DataObject`を使う
– **Excelのコピー状態だけを解除したい場合**は、`Application.CutCopyMode = False`を使う
– **Windowsのクリップボードを空にしたい場合**は、空文字で上書きするか、必要に応じてWindows APIを使う

ちなみに、Officeクリップボードの作業ウィンドウには、コピーした複数の項目が保存されることがあります。

手動で確認する場合は、Excelの「ホーム」タブにある「クリップボード」グループから作業ウィンドウを開いて、「すべてクリア」や個別削除を選べます。

VBAの処理とOfficeクリップボードの表示は完全に同じものではないので、ユーザー操作で見える履歴と、VBAで操作するWindowsクリップボードを混同しないようにしましょう。

「クリップボードがいっぱいです」というエラーが出る場合は、Officeクリップボードに多くの項目がたまっている可能性もあるので、手動でクリアする方法も知っておくと対応しやすくなりますよ。

まとめ

Excel VBAでテキストをクリップボードにコピーする、またはメモリをクリアする処理は、見た目以上に用途の切り分けが重要です。

文字列をコピーするだけなら`DataObject`で十分な場面が多いですし、Excelのコピー状態を消したいだけなら`Application.CutCopyMode = False`で対応できます。

一方、機密情報を扱う場合やクリップボードの中身を明確に削除したい場合は、空文字での上書きやWindows APIによるクリアも検討する価値があります。

マクロの最後に後片付けを入れる習慣をつけておくと、エラーや情報残りを防ぎやすくて、実務で安心して使えるVBAになりますよ。

広告