HOME > 即効テクニック > Excel VBA > その他関連のテクニック > クリップボードとデータのやりとりをする

クリップボードとデータのやりとりをする|Excel VBA

その他関連のテクニック

クリップボードとデータのやりとりをする

(Excel 2000/2002/2003/2007/2010)

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に貼り付けます。

● サンプル1 ●

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メソッドで格納されたテキストデータを取得します。

● サンプル2 ●

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メソッドでアクティブシートに貼り付けます。

● サンプル3 ●

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