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