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

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

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

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

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

ですよね。

今回はそんなお悩みを解決する

・クリップボードの履歴の値をすべてクリアさせる基本操作
・クリップボードの履歴の値をすべてクリアさせるショートカット
・クリップボードの履歴の値をすべてクリアさせる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")

    boolVis = objCombar.Visible

    'クリップボード非表示の場合表示させます。
    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")

    boolVis = objCombar.Visible

    'クリップボード非表示の場合表示させます。
    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

実行時エラー424「オブジェクトが必要です。」が表示される場合の対処法

本VBAを繰り返し実行をするとまれに実行時エラー424「オブジェクトが必要です。」が表示される場合があります。

VBA エラー 424「オブジェクトが必要です。」の原因と対処方法

原因は、クリップボードを表示する前にAccessibleChildrenによるオブジェクトの存在チェックが入り
表示がないため対象がないものと判断されててしまうためです。

対処法としては、VBA実行前にExcelのクリップボードを手動にて表示させるようにしてください。

また後処理でクリップボードが消える状態になる場合は、以下の処理を無効化するようにしてください。

‘クリップボードを元の表示状態に戻す
Application.CommandBars(“Office Clipboard”).Visible = boolVis

さいごに

いかがでしょうか。

今回は、

・クリップボードの履歴の値をすべてクリアさせる基本操作
・クリップボードの履歴の値をすべてクリアさせるショートカット
・クリップボードの履歴の値をすべてクリアさせるVBA

についてまとめました。

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



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。





タカヒロ

ドラッカーの名言「強みを生かす」の自分の「強み」をツールでサクッと診断してみました。

結果は意外でした…

ストレングスファインダー診断結果公開!NGな点もまとめ!




3 件のコメント

  • タカヒロ@extan さん
    こんにちは。

    問い合わせ後、該当部分の無効化で本現象を回避できることに気付き、
    メッセージ部分も無効化し、RPAで利用させて頂きました。
    どうも、ありがとうございました。

  • お伺いします。
    「【Excel VBA】クリップボードをすべてクリアする方法」の64Bit版ですが、
    > AccessibleChildren objCombar, 0, 1, objCombar, 1
    のところで、「実行時エラー424 オブジェクトが必要です。」というエラーが、
    発生したり、発生しなかったりします。
    常に発生させないようにするには、どのようにしたらいいでしょうか?
    教えて頂ければ、幸いです。

    • いつもご利用ありがとうございます。

      実行時エラー424がまれに発生する件につきまして、
      こちらでも再実行を繰り返したところ現象の再現ができました。

      原因といたしましては、クリップボードを表示する前にAccessibleChildrenによるオブジェクトの存在チェックが入り
      表示がないため対象がないものと判断されててしまうためです。

      対応といたしましては、Excelのクリップボードを手動にて表示し、

      次に、以下を無効化するか削除いただいた上、実行いただきたくお願いいたします。

      ‘クリップボードを元の表示状態に戻す
      Application.CommandBars(“Office Clipboard”).Visible = boolVis

  • コメントを残す

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