Excel

[VBA]DataObjectを使ったクリップボード操作が上手くいかない場合の対処法

VBAマクロからクリップボードを操作する場合、定番となっているのがDataObjectを使った方法です。

Public Sub Sample()
  With New DataObject
    .SetText "こんにちは、世界!"
    .PutInClipboard
  End With
End Sub

ところが、近年この方法だと上手くいかないという質問や投稿をよく見かけるようになりました。

対処法として有効とされているのがSetClipboardData等のクリップボード周りのAPI関数を使う方法ですが、個人的には、クリップボードに文字列を出し入れするためだけに、わざわざAPIを呼び出したくはありません。

そこで、もっと簡単な方法がないものかと思っていたのですが、先日ExcelQ&A掲示板を見たときに「これはイケそう!」というコードが載っているのを見つけました。

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呼び出しを・・・)

[リボン・カスタマイズ]dropDown要素の初期項目を指定する。前のページ

Microsoft アカウント + v2.0 エンドポイント + JavaScriptでMicrosoft Graphを呼び出す方法次のページ

関連記事

  1. アイコン一覧

    Office 365アイコン(imageMso)一覧(W)

    Office 365のデスクトップ版Officeアプリケーション(Wo…

  2. Office関連

    「もし宇宙人が地球レポートをまとめたら」動画公開

    PLAY! Office第三弾、「もし宇宙人が地球レポートをまとめたら…

  3. Office関連

    Excel 2016でマップグラフを作成する。

    12月6日、Office Insider向けに、Office 2016…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP