クリップボードに、どんな形式のデータが格納されているかは、ApplicationオブジェクトのClipboardFormatsプロパティで判定できます。ClipboardFormatsプロパティは、クリップボードに格納されているデータ形式を配列で返します。クリップボードに何もデータが格納されていない場合は、ClipboardFormats(1)にTrue(-1)が入ります。
クリップボードにどんな形式のデータが格納されているかは、ClipboardFormatsプロパティが返す配列の要素と定数を比較します。次のサンプルは、クリップボードに画像が格納されていたらワークシートに貼り付けます。
Sub Sample()
Dim CB As Variant, i As Long
CB = Application.ClipboardFormats
If CB(1) = True Then
MsgBox "クリップボードは空です。", 48
Exit Sub
End If
For i = 1 To UBound(CB)
If CB(i) = xlClipboardFormatBitmap Then
ActiveSheet.Paste
Exit For
End If
Next i
End Sub
ClipboardFormatsプロパティで使用できる定数は、ヘルプをご覧ください。
CopyメソッドやPasteメソッドはセルが対象です。セルを使わずに、変数のデータをクリップボードに格納したり、クリップボードに格納されているデータを直接変数に入れるときにはDataObjectオブジェクトを使います。
DataObjectオブジェクトはMSFormsのメンバです。使用するには、Microsoft Forms 2.0 Object Libraryを参照設定します。または、ブックにUserFormを挿入すると自動的に参照設定されます。
次のサンプルは、変数bufの文字列「tanaka」をクリップボードに格納します。続いて、クリップボードのデータを変数buf2に取得します。
Sub Sample2()
Dim buf As String, buf2 As String, CB As New DataObject
buf = "tanaka"
With CB
.SetText buf ''変数のデータをDataObjectに格納する
.PutInClipboard ''DataObjectのデータをクリップボードに格納する
.GetFromClipboard ''クリップボードからDataObjectにデータを取得する
buf2 = .GetText ''DataObjectのデータを変数に取得する
End With
MsgBox buf2
End Sub
DataObjectオブジェクトは、Windowsの機能であるクリップボード本体ではありません。VBAがクリップボードとやり取りをするために必要となる「橋渡し役」のような存在です。