クリップボードの使い方

中級VBA

はじめに

 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/

コメント

タイトルとURLをコピーしました