【VBA×WindowsAPI】GetClipboardData関数の使い方

GetClipboardData関数

GetClipboardData関数は指定した形式でクリップボードからデータを取得する関数です。
たとえばクリップボード内にテキストデータが格納されている場合に、この関数でテキストデータ形式(CF_TEXT)を指示すると、クリップボード内のテキストデータへのハンドルを取得することができます。このハンドルをメモリを操作する系の関数(GlobalAlloc関数やMoveMemory関数など)に渡すことでデータの情報を抜き出すことが可能になります。

クリップボード内に格納されているデータと違う形式を指定した場合はデータへのハンドルは取得できないため、予めクリップボード内に何のデータがあるのかを判定しておく必要があります

GetClipboardData関数をはじめとしたクリップボードの操作する関数を使用するには事前にOpenClipboard関数を実行してクリップボードを開いておく(アクセスを可能にしておく)必要があります。また、クリップボードの操作が終了した際は必ずCloseClipboard関数を使ってクリップボードを閉じる必要があります。(※他のアプリケーションがクリップボードにアクセスできないままになります)

クリップボード関連の関数としては下記のような様々な関数が存在しています。

関数名 内容
OpenClipboard関数 クリップボードを開く
CloseClipboard関数 クリップボードを閉じる
EmptyClipboard関数 クリップボード内のデータを空にする
GetClipboardData関数 クリップボード内のデータを取得する
SetClipboardData関数 クリップボード内にデータをセットにする
IsClipboardFormatAvailable関数 クリップボード内のデータのフォーマットを調べる

実際にクリップボードとデータのやり取りをするコードを書く際は、これら関数だけでなくメモリを操作する系の関数(GlobalAlloc関数やMoveMemory関数など)と合わせて利用されることが多いです。

 

使用方法

GetClipboardData関数を使用するにはあらかじめ関数の宣言しておく必要があります。
※宣言をしないと関数は使えずにエラーとなるので書き忘れに注意しましょう。

使用しているWindowsが32bitか64bitかによって宣言時に書く文言が違います。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。

 icon-code  64bit  

Declare PtrSafe Function GetClipboardData Lib “user32” _

(ByVal wFormat As Long) As LongPtr

icon-code  32bit  

Declare Function GetClipboardData Lib “user32” _

(ByVal wFormat As Long) As Long

上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。

 
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。

Private Declare PtrSafe Function~ :モジュール内でのみ呼び出し有効
Public Declare PtrSafe Function~ :モジュール外で呼び出し有効

 
 

構文

GetClipboardData関数の構文は下記のように書きます。

icon-code GetClipboardData関数 

hMem = GetClipboardData(wFormat)

引数

 wFormat   (Long型)

任意のクリップボード形式(フォーマット)を入力します。
ここで指定した形式と同じデータがクリップボード内に存在する場合にそのデータへのハンドルが取得できます。反対に指定した形式のデータがクリップボード内に存在しない場合は関数が失敗します。

データ形式は指定の定数値を入力します。下表はVBAにて主に利用されるものです。
その他のクリップボード形式は「標準クリップボード形式」を参照下さい。

定数値 説明
Const CF_TEXT = 1 テキストデータ (文字列全般)
Const CF_BITMAP = 2 ビットマップ画像データ (画像全般)
Const CF_HDROP = 15 ファイルデータ

クリップボード形式は特定の形式間で暗黙的なデータ形式変換が行われるものもあります。
たとえばPNG画像やGIF画像がクリップボード内にある場合、ビットマップ画像データではないですが「CF_BITMAP」を指定することでデータの取得が可能になります。
暗黙的なデータ形式変換については「合成されたクリップボード形式」を参照下さい。
 

戻り値

 hMem   (64bit:LongPtr型 / 32bit:Long型) 

戻り値は関数が成功した場合はクリップボード内に格納されているデータへのハンドルです。
関数が失敗した場合はNULL値(0)が返されます。

 

サンプルコード

以下はGetClipboardData関数OpenClipboard関数CloseClipboard関数を使って、クリップボード内のテキストデータへのハンドルを取得するサンプルコードです。

下記コードのGetClipboardData関数の引数を変更することで画像データやファイルデータへのハンドルに変更することもできます。エクスプローラやデスクトップ上で画像”ファイル”をコピーしても文字通りファイルデータ扱いとなるため、画像データで確認する場合はブラウザ上の画像やExcel上の画像を直接コピーする必要があるので注意して下さい。

 

 icon-share-square  VBA×WindowsAPIまとめページ

その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。

 icon-share-square  参考

Microsoft公式:GetClipboardData 関数 (winuser.h) – Win32 apps

Excel, VBA, Windows API

Posted by Lic