【VBA×WindowsAPI】EmptyClipboard関数の使い方
EmptyClipboard関数
EmptyClipboard関数はクリップボード内のデータを空にする関数です。
主にSetClipboardData関数のようなクリップボード内にデータを設定する関数と併用し、データのセット直前にクリップボードを”初期化する”というようなかたちで利用されます。
この関数はOpenClipboard関数を使ってクリップボードを開いた(アクセスできるようにした)ところから、CloseClipboard関数でクリップボードを閉じるまでの範囲でのみ有効です。この範囲外で実行しても失敗の戻り値「NULL(0)」が返ってくるだけで何も処理はされません。
OpenClipboard関数を実行してクリップボードが開かれるとき、クリップボードは他のアプリケーションが内容を変更できないようにして開かれます。これによりプログラム(VBA)でクリップボード内の操作を行うときにプログラム外部でクリップボードの操作が行われても影響を受けることが無いようになっています。ただし、プログラム終了時には必ずCloseClipboard関数を使ってクリップボードを閉じる必要があります。(※他のアプリケーションがクリップボードにアクセスできないままになります)
クリップボード関連の関数としては下記のような様々な関数が存在しています。
関数名 | 内容 |
OpenClipboard関数 | クリップボードを開く |
CloseClipboard関数 | クリップボードを閉じる |
EmptyClipboard関数 | クリップボード内のデータを空にする |
GetClipboardData関数 | クリップボード内のデータを取得する |
SetClipboardData関数 | クリップボード内にデータをセットにする |
IsClipboardFormatAvailable関数 | クリップボード内のデータのフォーマットを調べる |
実際にクリップボードとデータのやり取りをするコードを書く際は、これら関数だけでなくメモリを操作する系の関数(GlobalAlloc関数やMoveMemory関数など)と合わせて利用されることが多いです。
使用方法
EmptyClipboard関数を使用するにはあらかじめ関数の宣言しておく必要があります。
※宣言をしないと関数は使えずにエラーとなるので書き忘れに注意しましょう。
使用しているWindowsが32bitか64bitかによって宣言時に書く文言が違います。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。
Declare PtrSafe Function EmptyClipboard Lib “user32” () As Long
Declare Function EmptyClipboard Lib “user32” () As Long
上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。
1 2 3 4 5 |
#If VBA7 Then Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long #Else Declare Function EmptyClipboard Lib "user32" () As Long #End If |
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。
・Public Declare PtrSafe Function~ :モジュール外で呼び出し有効
構文
EmptyClipboard関数の構文は下記のように書きます。
※この関数を使うには事前にOpenClipboard関数でクリップボードを開いておく必要があります。
lRet = EmptyClipboard
戻り値
lRet (Long型)
戻り値は関数が成功した場合は「0以外」です。
失敗した場合は「0」が返されます。
サンプルコード
以下はEmptyClipboard関数とOpenClipboard関数、CloseClipboard関数を使って、クリップボード内のデータを空にするサンプルコードです。クリップボード内のデータを取得したり、クリップボードに別のデータをセットしたりする操作はもっと複雑になりますが、処理のはじめにOpenClipboard関数でクリップボードを開き、終わりにCloseClipboard関数でクリップボードを閉じる流れは同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long Sub main() 'クリップボードを開く If OpenClipboard(0) <> 0 Then 'クリップボードを空にする Call EmptyClipboard 'クリップボードを閉じる Call CloseClipboard End If End Sub |
VBA×WindowsAPIまとめページ
その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。
参考
Microsoft公式:EmptyClipboard 関数 (winuser.h) – Win32 apps