プチIT化 PR

【VBA】クリップボード操作に複数の値を追加する(履歴機能活用)

記事内に商品プロモーションを含む場合があります。
当サイトは、アフィリエイト広告を利用しています。

こんにちは。今回の記事は、Excel VBAのクリップボードについての記事です。

クリップボードと言えば、Windowsのシステム設定のクリップボードで、「クリップボードの履歴」をオンにすると、コピーした値がストックされていきますよね。

クリップボードをVBAマクロで操作しようと作成して動かすと、履歴がひとつしかストックできない!!という動きに。どうやって解決したかをまとめていきたいと思います。

それでは行ってみましょう!

事象詳細:クリップボードに2つ以上格納できない

今回作成したマクロは、DataObjectオブジェクトを使ってクリップボードに直接テキストを格納するというもの。

例えば、テキストひとつをクリップボードに送り込むサンプルマクロは以下です。

' 変数定義
Dim tmpStr As String
Dim DataObj As DataObject

' 文字列を変数tmpStrに格納
tmpStr = "文字列1"

' 文字列をクリップボードへ
dataObj.SetText tmpStr
dataObj.putInClipboard

これで、「文字列1」という文字列がクリップボードに格納されます。

では、「文字列1」と「文字列2」の2つのテキストをクリップボードの履歴機能に覚えさせたいと、以下のようなスクリプトを記載してみました。

' 変数定義
Dim tmpStr As String
Dim DataObj As DataObject

' 文字列1を変数tmpStrに格納
tmpStr = "文字列1"

' 文字列1をクリップボードへ
dataObj.SetText tmpStr
dataObj.putInClipboard

' 文字列2を変数tmpStrに格納
tmpStr = "文字列2"

' 文字列2をクリップボードへ
dataObj.SetText tmpStr
dataObj.putInClipboard

同じ要領で「文字列1」をクリップボードへ入れたのち、「文字列2」をクリップボードへ入れようと思いましたが、このマクロを実行したところ「文字列2」だけが履歴として残る(最後にクリップボードにputInClipboardしたもの)の1つしか記憶できなかったのです。

悩める人
悩める人
1つのテキストしか記憶できないのかな?

と思いましたが、2つ以上も記憶できましたので、その対処方法を載せていきます。

対処:2つ以上のテキストをクリップボードに記憶(履歴)させるには一時停止

色々試したのですが、「マクロを一時停止」すると2つ以上格納することができました。(違う方法もあるのかもしれませんが、私はこの方法で実現しました。)

マクロを一定時間停止させるApplication.Waitメソッドを使います。文字列1をクリップボードに格納後、一時停止(以下マクロでは1秒)して、文字列2の処理に移ります。そうすると2つのテキストが履歴に残りました。

' 変数定義
Dim tmpStr As String
Dim DataObj As DataObject

' 文字列1を変数tmpStrに格納
tmpStr = "文字列1"

' 文字列1をクリップボードへ
dataObj.SetText tmpStr
dataObj.putInClipboard

' ★一時停止(1秒間)★
Application.Wait Now + TimeValue("0:00:01")

' 文字列2を変数tmpStrに格納
tmpStr = "文字列2"

' 文字列2をクリップボードへ
dataObj.SetText tmpStr
dataObj.putInClipboard

一時停止しないと、処理が早すぎてクリップボードに格納が追いつかないのか、それともWaitすることによって制御が別のところに移るのか、何故だかは分かりませんが一時停止するとうまくいきました。

ただ、デメリットとしてはWaitメソッドはミリ秒では指定できないので、待ち時間が必要以上に出てしまうというところ。早い処理時間が求められる場合には厳しい対処法かと思います。

解決した私
解決した私
だけど、私の場合は時間はともかく実現できればOKなので、この方法で対処完了としました。

さいごに

いかがだったでしょか。同じような疑問を持たれた方の参考に少しでもなれば幸いです。なんか、もっといい方法とかありそうなものだけど…と思いつつこの記事は終わります。それでは、また!