はじめに
ExcelVBAでクリップボードを使用する方法には大きく分けて以下の2つの方法があります。
・MSFormsライブラリのDataObjectオブジェクトを使う方法
・WindowsAPIの関数を使う方法
2つの違いは、DataObjectの方は簡単に書く事ができ、WindowsAPIの方はプログラムが複雑です。
DataObjectの方は文字化けなどの不具合もあるようなので、筆者はそのような不具合が起こる場合は、WindowsAPIの方にシフトしていくという考え方で使うようにしています。
DataObjectオブジェクトを使う方法
DataObjectオブジェクトはMSFormsライブラリにあるため、「Microsoft Forms 2.0 Object Library」の参照設定が必要になります。
参照設定はVBEの「ツール」-「参照」から「Microsoft Forms 2.0 Object Library」にチェックを入れればOKです。
ただ、テキストボックスを配置すると、自動で参照設定になるようなので、やり方を紹介します。
まず、Excelのメニューから「開発」-「挿入」からActiveXコントロールのテキストボックスを選択し、シート上に配置します。
これで、「Microsoft Forms 2.0 Object Library」が参照状態になります。
シート上のテキストボックスは削除しても参照設定はそのままなのでDataObjectオブジェクトを New すれば使えるようになります。


テキストボックスを配置するだけで「Microsoft Forms 2.0 Object Library」が参照状態になります。
DataObjectオブジェクトを使ったサンプルコード
「Microsoft Forms 2.0 Object Library」が参照状態であれば、New DataObject として変数に代入すれば DataObject が利用できます。
クリップボードへコピー
クリップボードへコピーするには、一旦 dataObj.SetText で DataObject に文字列を代入し、DataObject からクリップボードへコピーするという手順を踏みます。
Sub ClipboardCopyTest()
Dim dataObj As Object
Set dataObj = New DataObject
' コピーするテキストをDataObjectにセット
dataObj.SetText "クリップボードにコピー"
' クリップボードにコピー
dataObj.PutInClipboard
End Sub
クリップボードから値を取得
クリップボードから値を取得するときは、GetFromClipboard で DataObject に値を入れて変数などに入れる事ができます。
Sub ClipboardPastTest()
Dim dataObj As Object
Set dataObj = New DataObject
'クリップボードからDataObjectにデータを取得する
dataObj.GetFromClipboard
Range("A1") = dataObj.GetText
End Sub
ただ、クリップボードに入っているのPasteメソッドで直接貼り付ける事もできます。
Range(“A1”) = dataObj.GetText の部分は以下のように書けます。
ActiveSheet.Paste Destination:=Range(“A1”)
もし選択されているセルに貼り付けたければ、以下のように書きます。
ActiveSheet.Paste
クリップボードの内容をクリアする
クリップボードの内容をクリアするには、以下のようにします。
Application.CutCopyMode = False
ただ、筆者の環境では上手くクリアできませんでした。(このような問題はいくつか報告されているようです。)
代替案としては、空のデータを代入しておくという手段が考えられます。
うまく行かない場合は試してみてください。
Sub ClipboardPastTest2()
Dim dataObj As Object
Set dataObj = New DataObject
'クリップボードからDataObjectにデータを取得する
dataObj.GetFromClipboard
Range("A1") = dataObj.GetText
'クリップボードの内容をクリアする(クリアできない事がある)
'Application.CutCopyMode = False
'クリップボードの内容をクリアする【代替案】
' コピーするテキストをDataObjectにセット
dataObj.SetText ""
' クリップボードにコピー
dataObj.PutInClipboard
End Sub
WindowsAPI関数でクリップボードを利用する
WindowsAPI関数でクリップボードを使うには、色々と手間がかかります。
このような時は先人知恵を拝借するのも1つの手です。
以下に筆者が参考にしたページを示します。
実際に利用する場合は、これらのサンプルを1つのモジュールにまとめておき、使いやすい関数を作っておいて利用すると良いでしょう。
各種宣言部分は Private 属性としておき、外部から利用する関数のみ Public 関数にしてアクセスするようにしておくと便利です。
エクセルの神髄
https://excel-ubara.com/excelvba4/EXCEL_VBA_462.html
liclog.net
https://liclog.net/set-clipboad-sting-function-vba-api/
https://liclog.net/get-clipboad-sting-function-vba-api/
コメント