『Excel』からクリップボード経由でテキストを他のアプリケーションにペーストしたい!
エクセルからクリップボードを操作する方法は、
かなり特殊で制限があり、エクセルを終了した後、
クリップボードにコピーしたテキストを
他のアプリケーションで使用が出来ない…。(T_T)
まあ、レアケースなんですが…。
他のPCでも使用する事が前提なので、
特殊なアプリを作って対応は、前提としてNG…。
…でも、駄目ならそれもありかも…。
と結構ブルー。
そこで、見つけたのがこれ
VBAでメモ帳にコピペをしたいのですが…
で色々調べた結果、こうなった。
Sub TestCopyText()
ActiveSheet.Range("A1:A1").Value = "test text"
ActiveSheet.Range("A1:A1").Copy
ClipBoardCopy
MsgBox "send text ok?"
End Sub
Function ClipBoardCopy()
' メモ帳を最小かつフォーカス有りで起動。
Shell "notepad.exe", vbMinimizedFocus
' テキストを貼り付け
CreateObject("Wscript.Shell").SendKeys "^v"
' テキストを全て選択
CreateObject("Wscript.Shell").SendKeys "^a"
' クリップボードにコピー
CreateObject("Wscript.Shell").SendKeys "^c"
' 入力があった状態で終了すると、セーブするか聞いてくる。
' 「Ctrl+Z」で未入力状態に戻す。
' これで、問い合わせを無くす。
CreateObject("Wscript.Shell").SendKeys "^z"
' メモ帳を「Alt+F4」で終了させる
CreateObject("Wscript.Shell").SendKeys "%{F4}"
End Function
原理は、エクセルのクリップボードへのコピーは、制限があるが、
その制限内でメモ帳にコピーを行い
改めてメモ帳でクリップボードにコピーを行う。
メモ帳のクリップボード・コピーは、
メモ帳が終了しても生きている。
正し、これでも上手く行かない場合は、
『Shell "notepad.exe", vbMinimizedFocus』を
『Shell "notepad.exe", vbNormalFocus』にする事で
上手く行った。
これの、弱点は、「ClipBoardCopy」内の処理中に
フォーカスが移動する事。
最も、一瞬なので大丈夫だと思うのだが…。
その辺は、『MsgBox』でのアナウンスの直後に
処理をするなど、工夫が必要かもしれない。
…
素直にコピーアンドペーストさせてくれれば、
こんな手間は無いんだけどね…。
でも、セルは、計算式など複雑で奇々怪々な情報の塊なので
実際にクリップボードにコピーされるのは、参照先なのだろう。
ならば、参照先が消滅したら、内容も無くなる理屈かと思う。
実際、セル内のテキストを直接入力状態にして、
クリップボードにコピーを行うと、エクセルを終了してもコピーは生き残る。
…
一元的に管理するために必ずセルを介して操作しろと言う事なのだろう。
思想として正しと思うのだが…
なので、外部で別にクリップボードにコピーをさせる形で
外部で使用できる形にするって、やっぱ手間…。
でも、出来たので良しとしよう…。(^^;)
| 固定リンク
コメント