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関連

    テスト用の文字列を挿入するWordマクロ

    文字列操作を行うマクロを書いているとき、テスト用に「あいうえおかきくけ…

  2. Office アドイン

    [Office用アプリ]コピー&ペースト用マニフェストファイル

    Office 用アプリを作るとき、過去に作ったアプリのマニフェストファ…

  3. Office関連

    覚えていますか?ISHとLHA、パソコン通信の思い出

    この記事のアイキャッチ画像、文字化けしているわけではないですよ。画…

  4. Office関連

    GetSpellingSuggestionsメソッドで文法上の誤りの修正候補は取得できない?

    前回と前々回の記事でスペルチェック、文章校正に関するWordマクロを扱…

  5. Office関連

    Office 365 unified APIをVBAから呼び出す

    前回の記事で、VBAからOffice 365 APIを呼び出す手順につ…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP