【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な点もまとめ!




11 件のコメント

  • タカヒロ@extan様
    boolVis = objCombar.Visible の追加で解決しました。ユーザーに説明して矛盾のない操作が確立できました。ありがとうございます。
    あと、クリップボードを強制的に閉じる方法はありますか? 開いた状態から始めるので、
    Application.CommandBars(“Office Clipboard”).Visible = boolVis
    では閉じられないかと…

    • 解決されたようでよかったです。

      追加のクリップボードを強制的に閉じる方法につきましては、
      Application.CommandBars(“Office Clipboard”).Visible = False
      のコードを実行したい処理のところに入れていただければと存じます。

  • タカヒロ@extan様
    たびたびで恐縮ですが…前述のような事情により自動で削除するのをやめ、For num = 1 To 3 の手前までとして、手動にて「すべてクリア」を行なうことにする代わりに、クリアすべきデータがある場合に必要な旨をメッセージボックスに表示しようとしています。データの有無の判断は目視です。If Not boolVis Then が True のときクリップボードが閉じた状態ならば False のときメッセージを出せばよいと考えましたが、クリップボードが表示されていても True が返ってきます。クリップボードはマクロの開始前に開いた状態にしています。お気づきの点、アドバイスいただければ幸いです。

    • クリップボードが表示されていたらboolVisがTrueになる件ですが
      以下のところでマクロ実行直後にクリップボードの表示状態をBoolean型で取得しており、表示されていたらTrueがboolVisに代入されます。
      boolVis = objCombar.Visible
      結果として、クリップボードを開いている状態でマクロを実行する場合はTrueが返る形となりますので、動きとしては問題なさそうです。
      なお、クリップボード非表示(False)の場合は以下のところで強制的に表示させており、この場合はFalseだけど表示されている状態になりますので、
      boolVisの判定で別処理を行う場合は「boolVis = objCombar.Visible」を追加し、再度表示状態を取得するようお願いします。
      If Not boolVis Then
      objCombar.Visible = True
      DoEvents
      End If

  • タカヒロ@extan様

    早々の対応ありがとうございます。
    下記実行してみたところメッセージは表示されるもののクリップボードのデータは消えませんでした。

    Dim objShell As Object
    Dim intResult As Integer
    ‘WshShellオブジェクトをセットします。
    Set objShell = CreateObject(“WScript.Shell”)
    intResult = objShell.Run(“cmd /c echo off | clip”, 0, True)
    ‘PowerShell実行結果を返します。0:成功 1:失敗
    If intResult = 0 Then
    MsgBox “クリップボードの内容をクリアしました。”
    End If

    手動にて「すべてクリア」の運用で引き続き利用させていただきます。いずれにしてもクリップボードが開いている必要があるため、これをSelectCaseでクリップボードが閉じていたら開くというプロセスで実現しているのですが、ここに手動が入ることもありクリアだけ自動にこだわる必要はないという理由です。クリップボード関連では、画面に反映されるタイミングがマクロが終了したタイミングであるなど独特なところがあり、すべてのニーズを満たすのは簡単ではなさそうですね。

    • 消去不可ということで力及ばず申し訳ありません。

      クリップボードの「すべてクリア」の実現方法については
      またなにか情報があれば更新していきたいと思います。

  • タカヒロ@extan様
    Excelのクリップボードを表示した状態で、コピーされたデータが見えている状態でもクリアできません。
    If objClipboard(1) = -1 Then の手前に、Msgbox objClipboard(1) を入れて確認してみますと、ExcelのCtrl+CでコピーしたデータやVBAでコピーしたデータだけの場合-1になり、webページなど他のアプリからのコピーが入るとかならず0になりクリアされることが分かりました。 オフィス365のエクセルを使用です。試しにIf objClipboard(1) = 0 Then にしてみてもクリアできなくて、本当に空のときはエラーになります。objClipboard(1)=に関わらず常にクリアできる方法があればありがたいのですが、原因または別の解決方法はありませんか。現在は手動で「すべてクリア」で運用しており、これでも十分助かっています。

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

      Excelのクリップボードからすべてクリアできない件ですが、
      ご指摘の通りExcel以外でコピーした内容はExcelのクリップボードに入らない場合があることが確認できました。
      詳しい文献が見つからず憶測となりますが、各アプリケーション毎やデータ種別によって記録領域が異なるため
      アプリケーションによっては参照できない場合があるためと思われます。
      対応といたしましては、アプリケーションに依存しないOS側からすべてのクリップボードに対してクリアを実施することですが、現時点でそのようなコマンドは無いようです。
      ただ、コマンドプロンプトより”echo off | clip”とコマンドを打てば、一つだけ消すことができるようですので、クリップボードの設定から履歴をOFFにすることを組み合わせればできなくはなさそうです。
      “echo off | clip”とコマンドをVBAから実行させるには以下のコードで対応可能ですので、こちらで確認いただくようお願いいたします。
      Dim objShell As Object
      Dim intResult As Integer
      ‘WshShellオブジェクトをセットします。
      Set objShell = CreateObject(“WScript.Shell”)
      intResult = objShell.Run(“cmd /c echo off | clip”, 0, True)
      ‘PowerShell実行結果を返します。0:成功 1:失敗
      If intResult = 0 Then
      MsgBox “クリップボードの内容をクリアしました。”
      End If

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

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

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

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

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

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

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

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

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

  • コメントを残す

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