[Excel][VBA] クリップボードからテキストを取得
トップページへ
※全てのExcelで動作する保証はありません。また、内容に関し管理人は全ての責任を負いかねます
目的
クリップボード内のテキストデータが欲しい。画像データなどテキスト以外は処理をしない。
既知の問題点
原因は不明ですが、下のコードを実行してもクリップボードからコピーできない場合があります。他サイト様のコードを実行してもです。
その場合は、
コピーVBAを「数回」実行する
↓
それでもダメ
↓
他のアプリ(Edge, Chromeなどブラウザやエクスプローラー)が起動していたら終了し、コピーVBAを実行(空きメモリを増やす)
↓
それでもダメ
↓
Excelを再起動して、コピーVBAを実行
↓
それでもダメ
↓
パソコンの再起動
の順で対処しています。
おそらく、OSとExcelとのメモリ関係の処理の互換性の問題、あるいはメモリの排他制御(他アプリが使用権を握ったままになっている等)が要因ではないかと推定していますが根拠はありません。ともかく、「PCを再起動」をしメモリに関する命令をクリアする方法が確実と考えています。(2023年3月時点)
処理の流れ
クリップボードの中身をチェックし、テキスト形式のデータがあるのかチェック。
無ければ、メッセージを出して処理を抜ける。テキストデータがあるのなら続行。
クリップボードからテキストデータをワーク領域(w_str)へ転送。
(サンプルコードには記載していませんが、その後はワーク領域の文字列に対する処理です)
サンプルコード
Dim aFmts As Variant Dim fmt As Variant Dim sw_on As Boolean Dim w_str As String 'チェック処理 aFmts = Application.ClipboardFormats sw_on = False For Each fmt In aFmts If fmt = xlClipboardFormatText Then sw_on = True Exit For End If Next If sw_on = False Then 'クリップボードが空の時も MsgBox "クリップボードにテキストはありません", vbExclamation Exit Sub End If 'チェック処理 'メイン処理 With New MSForms.DataObject .GetFromClipboard w_str = .GetText End With 'メイン処理
※MSForms.DataObjectでエラーになる場合は一番下のリンク先サイト様をご覧下さい。
この記事は下記のサイトを参考にさせて頂きました。謝辞
・チェック処理
Application.ClipboardFormats プロパティ (Excel) | Microsoft Docs
XlClipboardFormat 列挙 (Excel) | Microsoft Docs
・メイン処理、MSForms.DataObjectについて
クリップボードとデータのやりとりをする:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug
←エクセルのメニューに戻る