クリップボードとデータのやりとりをする|Excel VBA |
DataObjectオブジェクトを使用してクリップボードにデータを送信したり、クリップボードからデータを受信したりすることができます。
DataObjectオブジェクトはMSFormsライブラリのメンバです。
使用するには、「Microsoft Forms 2.0 Object Library」を参照設定します。
ただし、[参照設定]ダイアログボックスの一覧に、このライブラリは表示されません。
[参照設定]ダイアログボックスで参照設定する場合は、[参照]ボタンをクリックして、「C:\Windows\System32\FM20.DLL」または「C:\Windows\SysWOW64\FM20.DLL」を選択します。
(ライブラリのパスはOSによって異なります)
ユーザーフォームを挿入すると自動的にこのライブラリが参照設定されるので、いったん[挿入]メニュー→[ユーザーフォーム]からユーザーフォームを挿入して、不要ならユーザーフォームを削除(解放)する方法でも良いでしょう。
DataObjectオブジェクトにデータを設定するにはSetTextメソッドを、データをクリップボードに送信するにはPutInClipboardメソッドを使用します。
Sample1は変数bufの値をクリップボードに送信します。
クリップボードに送信されたデータは、たとえばテキストエディタを起動して貼りつけるなど、他のアプリケーションで利用可能になります。
ここでは、クリップボードのデータをPasteメソッドでセルA1に貼り付けます。
Sub Sample1()
Dim buf As String
buf = "モーグ"
With New MSForms.DataObject
.SetText buf '変数の値をDataObjectに格納する
.PutInClipboard 'DataObjectのデータをクリップボードに格納する
End With
ActiveSheet.Paste Destination:=Range("A1")
End Sub
クリップボードからDataObjectオブジェクトにデータを受信するにはGetFromClipboardメソッドを、DataObjectオブジェクトからデータを取得するにはGetTextメソッドを使用します。
Sample2は、RangeオブジェクトのCopyメソッドを利用してセルA1をコピーし、クリップボードを介してその内容をメッセージボックスに表示します。
Copyメソッドを実行した時点で、セルA1の情報がクリップボードに格納されます。
ここでは、GetFromClipboardメソッドでクリップボードからDataObjectオブジェクトにデータを受信し、GetTextメソッドで格納されたテキストデータを取得します。
Sub Sample2()
ActiveSheet.Range("A1").Copy
With New MSForms.DataObject
.GetFromClipboard ''変数のデータをDataObjectに格納する
MsgBox .GetText
End With
Application.CutCopyMode = False
End Sub
データが何も格納されていない場合や、画像データをGetTextメソッドで取得しようとすると実行時エラーが発生します。現在クリップボードにどんな形式のデータが格納されているかは、ApplicationオブジェクトのClipboardFormatsプロパティで判定できます。
ClipboardFormatsプロパティは、クリップボードに格納されているデータ形式を、インデックスが 1 から始まる数値型の配列で返します。
クリップボードに何もデータが格納されていない場合は、ClipboardFormats(1)に -1 が入ります。
格納されているデータの種類は、ClipboardFormatsプロパティが返す配列の要素と定数を比較します。使用する定数には、XlClipboardFormat列挙体のメンバを指定します。
次のコードは、クリップボードに画像が格納されていたらPasteメソッドでアクティブシートに貼り付けます。
Sub Sample3()
Dim ClipBoard As Variant
Dim i As Long
ClipBoard = Application.ClipboardFormats
If ClipBoard(1) = -1 Then
MsgBox "クリップボードは空です。", vbExclamation
Exit Sub
End If
For i = 1 To UBound(ClipBoard)
If ClipBoard(i) = xlClipboardFormatBitmap Then
ActiveSheet.Paste Destination:=Range("A1")
Exit For
End If
Next i
End Sub