VBAマクロからクリップボードを操作する場合、定番となっているのがDataObjectを使った方法です。
Public Sub Sample() With New DataObject .SetText "こんにちは、世界!" .PutInClipboard End With End Sub
ところが、近年この方法だと上手くいかないという質問や投稿をよく見かけるようになりました。
- 【Wordマクロ】クリップボードへのデータ入力・取得のエラーへの対処
- http://ameblo.jp/gidgeerock/entry-11621556349.html
- 開いているファイルのアドレスを取るマクロ動かすとなぜか□□が張り付く
- http://ameblo.jp/kanchiezou/entry-12199210078.html
- Excel VBAでクリップボードに全角文字を格納する [備忘録]
- http://tomodachihiroba.cocolog-nifty.com/square/2015/03/excel-vba-ea26.html
- EXCEL VBAでの質問です。
- http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14162604109
対処法として有効とされているのがSetClipboardData等のクリップボード周りのAPI関数を使う方法ですが、個人的には、クリップボードに文字列を出し入れするためだけに、わざわざAPIを呼び出したくはありません。
そこで、もっと簡単な方法がないものかと思っていたのですが、先日ExcelQ&A掲示板を見たときに「これはイケそう!」というコードが載っているのを見つけました。
- [178686] VBAからクリップボードへの出力ができなくなりました
- http://excelfactory.net/excelboard/excelvba/excel.cgi?mode=all&namber=178686&rev=0
TextBoxを経由して文字列をコピーする方法です。
なるほど!API関数を呼ぶよりよっぽどシンプルなコードです。
ただ、上記質問のコードでは複数行の文字列に対応していなかったので、MultiLineプロパティを有効にしたコードを書いてみることにしました。
Option Explicit Public Sub Sample() Dim s1 As String, s2 As String s1 = "中国語テスト:" & vbNewLine & _ ChrW(&H94F6) & ChrW(&H884C) & ChrW(&H6682) & ChrW(&H505C) & _ ChrW(&H65B0) & ChrW(&H589E) & ChrW(&H4F4F) & ChrW(&H623F) & _ ChrW(&H8D37) & ChrW(&H6B3E) SetCB s1 GetCB s2 CreateObject("WScript.Shell").Popup s2 End Sub Private Sub SetCB(ByVal str As String) 'クリップボードに文字列を格納 With CreateObject("Forms.TextBox.1") .MultiLine = True .Text = str .SelStart = 0 .SelLength = .TextLength .Copy End With End Sub Private Sub GetCB(ByRef str As String) 'クリップボードから文字列を取得 With CreateObject("Forms.TextBox.1") .MultiLine = True If .CanPaste = True Then .Paste str = .Text End With End Sub
Windows 10(64ビット版) + Office 2016(32ビット版)環境でテストしましたが、私が確認した限りでは意図した通り動いているようです。
クリップボード操作でお困りの方は是非一度お試しください。
(これでダメな場合は、やはり諦めてAPI呼び出しを・・・)
この記事へのコメントはありません。