[[20250606073737]] 『クリップボードへのコピー』(メイ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『クリップボードへのコピー』(メイ)

クリップボードにテキストをコピーする方法を
教えてほしいのです。

ネットで調べてみると

?@「ActiveXコンポーネントはオブジェクトを作成できません。」
  のエラーが出ます。(2行目)

Dim clipboard As Object
Set clipboard = CreateObject("MSForms.DataObject")
clipboard.SetText "コピーするテキスト"
clipboard.PutInClipboard

?Aエラーは出ませんが、メモ帳に貼り付けると[ ]になります。
 また、エクセルのVBAエディタでは[??]と表示されます。

Dim buf As String, CB As New DataObject
buf = Range("コピーするテキスト")
With CB

    .SetText buf
    .PutInClipboard
End With

※プレビューするとフォントがバラバラになるのはなぜ?

< 使用 Excel:Excel2016、使用 OS:Windows11 >


>※プレビューするとフォントがバラバラになるのはなぜ?

 各行の1文字目を半角スペースにすると、そのまま表示されるとか?

 (5) Wikiに書き込む場合の整形ルール
 通常は入力した文字がそのまま表示されますが、以下のルールに従ってテキスト整 
 形を行うことができます

 空行から空行までがひとつの段落として整形され途中の改行は無視されます
 行頭を半角スペースで始めると書き込みの改行位置が反映されます
 HTMLのタグは書けません
 ----のようにマイナス4つがあると、水平線になります
 http://www.hyuki.com/ のようなURLは自動的にリンクになります
(ゆたか) 2025/06/06(金) 08:46:27

 Sub a()
    Dim clipboard As New DataObject
    clipboard.SetText "コピーするテキスト111"
    clipboard.PutInClipboard
 End Sub

 参照設定にMicrosoft Forms 2.0 Object Library(FM20.DLL)が必要ですよ。
(ゆたか) 2025/06/06(金) 09:14:26

>buf = Range("コピーするテキスト")
Range("A1").Valueとか。

(asada) 2025/06/06(金) 09:36:43


 Sub b()
    Dim clipboard As Object
    Set clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    clipboard.SetText "コピーするテキスト223"
    clipboard.PutInClipboard
 End Sub

 こう書くと参照設定はいらないらしい。。。参照設定がわからないなら有効か?(^^;
(ゆたか) 2025/06/06(金) 09:39:57

 参照設定がわからない人には
 「一回ユーザーフォーム挿入して消してみ?」って説明したり。^^;

(白茶) 2025/06/06(金) 11:55:38


    Option Explicit
    Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As LongPtr) As Long
    Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
    Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
    Private Declare PtrSafe Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As LongPtr) As LongPtr
    Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As LongPtr) As LongPtr
    Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
    Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As Long
    Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As LongPtr)
    Private Const GMEM_MOVEABLE As Long = &H2
    Private Const GMEM_ZEROINIT As Long = &H40
    Private Const GHND          As Long = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
    Private Const CF_UNICODETEXT As Long = &HD

    Sub SetClipboard(str As String)
        Dim h As LongPtr, p As LongPtr
        If OpenClipboard(0) <> 0 Then
            If EmptyClipboard() <> 0 Then
                h = GlobalAlloc(GHND, LenB(str) + 2&)
                p = GlobalLock(h)
                CopyMemory ByVal p, ByVal StrPtr(str), LenB(str)
                Call GlobalUnlock(h)
                Call SetClipboardData(CF_UNICODETEXT, h)
                Call CloseClipboard
            End If
        End If
    End Sub

    Sub test()
        SetClipboard "リットル" & ChrW(8467) & ChrW(13137)
    End Sub

(白茶) 2025/06/06(金) 12:07:00


 既に回答がありましたようにDataObjectオブジェクトを使うのが普通かもしれませんが、
 別の方法として、テキストボックス(ActiveXコントロールの)のCopyメソッドを使う方法もあります。
 そのためにテキストボックスをシートにセットするところが面倒かもしれませんが。ご参考まで。
(xyz) 2025/06/06(金) 14:46:44

 横から失礼します。

 過去ログで作業用にエクセルオブジェクトを生成しブックを作成、シートにテキストボックスを配置し
 クリップボード内容取得、内容改変、クリップボード再格納という事例がありました。

[[20150613234613]] 『VBSからエクセルを起動してクリップボード内容取得,クリップボード再格納』(田吾作)

 VBSのコードですが、エクセル用に改変し、クリップボード内容取得ではなく指定のテキストをテキストボックスに
 格納し、そのテキストボックスの内容をクリップボードへコピー、というように改変してみてもいいかもしれません。

 これですと、マクロブックにテキストボックスを配置しなくて済むようになります。
(OK) 2025/06/06(金) 20:23:25

(白茶)さんへ
以下もおなじ結果でした。

   Option Explicit
    Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As LongPtr) As Long
     (略)

    Sub SetClipboard(str As String)
     (略)
    End Sub

    Sub test()
        SetClipboard "リットル" & ChrW(8467) & ChrW(13137)
    End Sub
(メイ) 2025/06/12(木) 09:04:37

以下のように表示されます。

メモ帳は[ ]
エクセルvbaのエディタは[??]
ここは[￿￿]

です。

(メイ) 2025/06/12(木) 09:19:12


(ゆたか) 2025/06/06(金) 09:39:57さんの試してみましたか。

(?) 2025/06/12(木) 10:01:59


すみません。
返答が間違っていました。

こちらはだめでした。
メモ帳は[ ],エクセルvbaのエディタは[??],ここは[￿￿]になります。

 Sub b()
    Dim clipboard As Object
    Set clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    clipboard.SetText "コピーするテキスト223"
    clipboard.PutInClipboard
 End Sub

以下はクリップボードにコピーできました。
Option Explicit

 Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As LongPtr) As Long
  (略)
 Sub SetClipboard(str As String)
  (略)
 End Sub

 Sub test()
     SetClipboard "リットル" & ChrW(8467) & ChrW(13137)
 End Sub

テストしながら返答していたので
返答がおかしくなりました。
ごめんなさい。

また、textbox のクリップボードは
テストしていません。

(メイ) 2025/06/13(金) 09:29:52


Set clipboard = CreateObject("MSForms.DataObject")
clipboard.SetText "コピーするテキスト"
clipboard.PutInClipboard

こちらの方が使えないのは何か原因があるのでしょうか?
こっちの方が簡単に使えるので使えれば
使いたいです。
何かの設定とか?
エクセルのバージョンやOSのバージョンによって
できるとかできないとかでしょうか?

Exce は 2016
OS は Windows11
です。
(メイ) 2025/06/13(金) 09:32:49


 textbox利用の方法は参考としてあげましたが、他の方法を優先してください。
 混乱させたとしたら失礼しました。

 Set clipboard = CreateObject("MSForms.DataObject")は機能しません。
 理由の説明は私には難しい。

 きちんと参照設定するのが正攻法だと思います。
 「ツール」ー「参照設定」で
 候補の中から
 Microsoft Forms 2.0 Object Library
 を探してチェックを付けるだけです。
 コードは、既に指摘があります。 ゆたかさん 2025/06/06(金) 09:14:26 

 白茶さんの方法は私のところでは成功しました。

(xyz) 2025/06/13(金) 10:10:05


 > Set clipboard = CreateObject("MSForms.DataObject")は機能しません。
 > 理由の説明は私には難しい。
 「参照設定とCreateObjectの対応リスト」
http://www.thom.jp/vbainfo/refsetting.html
 が参考になります。
 要するにProgIDを指定するのですが、MSForms.DataObjectにはそれが定義されていないから、
 ということのようです。ではなぜ定義しなかったのか、それは知りません。
 セキュリティがらみか何かでしょうか。
 # 朧げに覚えてはいたが、保守的に逃げました。
(xyz) 2025/06/13(金) 13:22:14

 そもそもテキストをクリップボードにコピーする目的を教えてもらえますか?
 後学のためです。
(xyz) 2025/06/13(金) 13:56:36

(xyz)さんへ
白茶さんの方法は私の方でも成功しています。

現在こちらを採用しています。

>そもそもテキストをクリップボードにコピーする目的を教えてもらえますか?
メッセージボックスに表示している文字列を
手書きで目盛っているのですが、情報がおおくなったので、
クリップボードにコピーして
メモ帳に貼り付けて確認したかったのです。

皆さんありがとうございました。
(メイ) 2025/06/16(月) 10:19:36


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.