【Excel VBA】クリップボードをすべてクリアする方法

Excel VBAでクリップボードの履歴の値をすべてクリアする方法させたいときはないでしょうか。

例えば、RPAなどでExcelの処理を大量にさせたらクリップボードも肥大化して、クリアしたいときです。

けど、そんな中で悩むことは、

・Excel VBAでクリップボードの履歴の値をすべてクリアするさせるやり方がわからない。
・ショートカットやVBAで効率的に行いたいがやり方がわからない。

ですよね。

今回はそんなお悩みを解決する
【Excel VBA】クリップボードの履歴の値をすべてクリアする方法について
まとめます!



クリップボードの履歴の値をすべてクリアさせる基本操作

セルに任意の値を入力しコピーします

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

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

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

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




クリップボードの履歴の値をすべてクリアさせるショートカット

クリップボードの履歴の値をすべてクリアさせるショートカットは以下の順序で実施します。

Alt + H

Alt + FO

すべてクリアをクリック

もしくは

Win + V

クリック

すべてクリアをクリック



クリップボードの履歴の値をすべてクリアさせるVBA

クリップボードの1次キャッシュをクリアするVBA

クリップボードの1次キャッシュをクリアするVBAとなります。
CutCopyMode プロパティにFalseを指定するだけです。
切り取りモードおよびコピーモードが解除され、ペースト用のキャッシュがクリアされます。

Sub クリップボードの履歴の値をクリア_一次キャッシュのみ()
    Application.CutCopyMode = False
End Sub

選択範囲が、

VBAを実行後、解除され、ペーストができないことが確認できます。

タカヒロ
タカヒロ
なお、Trueを指定指定しても、切り取りモードまたはコピー モードを解除されます…

ちなみに、この方法ではクリップボードの履歴の値は消えていません…

値が残っている…

クリアされているのはコピペ用に用意している一次キャッシュのみなのです。

では、根こそぎクリップボードをクリアする方法はなに?

ということですが、それは次の方法となります。



クリップボードの履歴の値をすべてクリアさせる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



さいごに

いかがでしょうか。

今回は、
【Excel VBA】クリップボードの履歴の値をすべてクリアする方法について
まとめました。

また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。


「クリップボード」の関連記事

こちらの記事の内容「クリップボード」に関連する記事一覧です。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です