Excel VBAでクリップボードの履歴の値をすべてクリアする方法させたいときはないでしょうか。
例えば、RPAなどでExcelの処理を大量にさせたらクリップボードも肥大化して、クリアしたいときです。
けど、そんな中で悩むことは、
・ショートカットやVBAで効率的に行いたいがやり方がわからない。
ですよね。
今回はそんなお悩みを解決する
・クリップボードの履歴の値をすべてクリアさせるショートカット
・クリップボードの履歴の値をすべてクリアさせるVBA
についてまとめます!
もくじ
クリップボードの履歴の値をすべてクリアさせる基本操作
セルに任意の値を入力しコピーします

[ホーム]タブを選択します

[クリップボード]グループの[右下矢印]をクリックします

[クリップボード]メニューの[すべてクリア]をクリックします

クリップボードの履歴の値がクリアされました

クリップボードの履歴の値をすべてクリアさせるショートカット
クリップボードの履歴の値をすべてクリアさせるショートカットは以下の順序で実施します。
Alt + H
Alt + FO
すべてクリアをクリック
もしくは
Win + V
…クリック
すべてクリアをクリック
クリップボードの履歴の値をすべてクリアさせるVBA
クリップボードの1次キャッシュをクリアするVBA
クリップボードの1次キャッシュをクリアするVBAとなります。
CutCopyMode プロパティにFalseを指定するだけです。
切り取りモードおよびコピーモードが解除され、ペースト用のキャッシュがクリアされます。
Sub クリップボードの履歴の値をクリア_一次キャッシュのみ()
Application.CutCopyMode = False
End Sub
選択範囲が、
VBAを実行後、解除され、ペーストができないことが確認できます。

ちなみに、この方法ではクリップボードの履歴の値は消えていません…
値が残っている…
クリアされているのはコピペ用に用意している一次キャッシュのみなのです。
では、根こそぎクリップボードをクリアする方法はなに?
ということですが、それは次の方法となります。
クリップボードの履歴の値をすべてクリアさせるVBA_64bit版
Excelの対応バージョンは2007以降で、64bit版となります。
参考にした文献は以下となります。
https://stackoverflow.com/questions/14440274/cant-clear-office-clipboard-with-vba
Private Declare PtrSafe Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, ByVal iChildStart As Long, ByVal cChildren As Long, ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
Public Sub クリップボードの履歴の値をすべてクリア_64bit()
Dim objCombar As Variant
Dim objClipboard As Variant
Dim num As Integer
Dim boolVis As Boolean
Set objCombar = Application.CommandBars("Office Clipboard")
'クリップボード非表示の場合表示させます。
If Not boolVis Then
objCombar.Visible = True
DoEvents
End If
objClipboard = Application.ClipboardFormats
'クリップボードの中身が空の場合中断します。
If objClipboard(1) = -1 Then
MsgBox "クリップボードは空のため中断します。", vbExclamation
Exit Sub
End If
'「すべてクリア」のボタンへ遷移します。
For num = 1 To 3
AccessibleChildren objCombar, 0, 1, objCombar, 1
AccessibleChildren objCombar, 3, 1, objCombar, 1
Next
AccessibleChildren objCombar, 1, 1, objCombar, 1
'IAccessibleオブジェクトのaccDoDefaultAction メソッドで「すべてクリア」のボタンを実行します。
objCombar.accDoDefaultAction CLng(0)
'クリップボードを元の表示状態に戻す
Application.CommandBars("Office Clipboard").Visible = boolVis
MsgBox "クリップボードの内容をすべてクリアしました。"
End Sub
実行し、以下の表示がされれば完成です!
クリップボードの内容が無い場合は以下のメッセージが表示されます。

クリップボードの履歴の値をすべてクリアさせるVBA_32bit版
Excelが32bit版である場合はこちらのVBAを使用してください。
Private Declare Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, ByVal iChildStart As Long, ByVal cChildren As Long, ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
Public Sub クリップボードの履歴の値をすべてクリア_32bit()
Dim objCombar As Variant
Dim objClipboard As Variant
Dim num As Integer
Dim boolVis As Boolean
Set objCombar = Application.CommandBars("Office Clipboard")
'クリップボード非表示の場合表示させます。
If Not boolVis Then
objCombar.Visible = True
DoEvents
End If
objClipboard = Application.ClipboardFormats
'クリップボードの中身が空の場合中断します。
If objClipboard(1) = -1 Then
MsgBox "クリップボードは空のため中断します。", vbExclamation
Exit Sub
End If
'「すべてクリア」のボタンへ遷移します。
For num = 1 To 2
AccessibleChildren objCombar, 0, 1, objCombar, 1
AccessibleChildren objCombar, 3, 1, objCombar, 1
Next
'IAccessibleオブジェクトのaccDoDefaultAction メソッドで「すべてクリア」のボタンを実行します。
objCombar.accDoDefaultAction CLng(2)
'クリップボードを元の表示状態に戻す
Application.CommandBars("Office Clipboard").Visible = boolVis
MsgBox "クリップボードの内容をすべてクリアしました。"
End Sub
VBAの実装手順
実装手順は以下の通りです。
今回はExcel側にこのVBAを実装します。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。

③右ペインのウインドウに上記のVBAを入力します。
こちらで完了です。
VBAを実行する
では早速VBAの実行をしてみましょう。
①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。
②処理がされたことが確認できれば完了です。
※完了メッセージやステータス管理など必要に応じて実装してもらえばと思います。
クリップボードの履歴の値をすべてクリアさせるVBAの説明
今回のVBAはExcel32bit版と64bit版の2種類となりますが、
異なる部分は「すべてクリア」ボタンへのアクセスルートだけです。
では、順に説明をしたいと思います。
クリップボードが非表示の場合、「クリアボタン」操作のため表示させます。
If Not boolVis Then
objCombar.Visible = True
DoEvents
End If
クリップボードフォーマットをオブジェクトに設定します。
objClipboard = Application.ClipboardFormats
クリップボードの中身が空の場合は中断させるようにします。
objClipboardの内容が全くない場合は一つ目の値が-1となりますので、
それを条件に空判定を行います。
If objClipboard(1) = -1 Then
MsgBox "クリップボードは空のため中断します。", vbExclamation
Exit Sub
End If
コンテナオブジェクト内の子IDを指定し、
「すべてクリア」のボタンへ遷移します。
64bit版
AccessibleChildren objCombar, 0, 1, objCombar, 1
AccessibleChildren objCombar, 3, 1, objCombar, 1
AccessibleChildren objCombar, 0, 1, objCombar, 1
AccessibleChildren objCombar, 3, 1, objCombar, 1
AccessibleChildren objCombar, 0, 1, objCombar, 1
AccessibleChildren objCombar, 3, 1, objCombar, 1
AccessibleChildren objCombar, 1, 1, objCombar, 1
32bit版
AccessibleChildren objCombar, 0, 1, objCombar, 1
AccessibleChildren objCombar, 3, 1, objCombar, 1
AccessibleChildren objCombar, 0, 1, objCombar, 1
AccessibleChildren objCombar, 3, 1, objCombar, 1
IAccessibleオブジェクトのaccDoDefaultAction メソッドで「すべてクリア」のボタンを実行します。
objCombar.accDoDefaultAction CLng(0)
クリップボードを元の表示状態に戻します。
Application.CommandBars("Office Clipboard").Visible = boolVis
さいごに
いかがでしょうか。
今回は、
・クリップボードの履歴の値をすべてクリアさせるショートカット
・クリップボードの履歴の値をすべてクリアさせるVBA
についてまとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
コメントを残す