こんにちは。今回の記事は、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つしか記憶できなかったのです。
と思いましたが、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メソッドはミリ秒では指定できないので、待ち時間が必要以上に出てしまうというところ。早い処理時間が求められる場合には厳しい対処法かと思います。
さいごに
いかがだったでしょか。同じような疑問を持たれた方の参考に少しでもなれば幸いです。なんか、もっといい方法とかありそうなものだけど…と思いつつこの記事は終わります。それでは、また!