『クリップボードへのコピー』(メイ)
クリップボードにテキストをコピーする方法を
教えてほしいのです。
ネットで調べてみると
?@「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
(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/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
こちらの方が使えないのは何か原因があるのでしょうか?
こっちの方が簡単に使えるので使えれば
使いたいです。
何かの設定とか?
エクセルのバージョンや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
現在こちらを採用しています。
>そもそもテキストをクリップボードにコピーする目的を教えてもらえますか?
メッセージボックスに表示している文字列を
手書きで目盛っているのですが、情報がおおくなったので、
クリップボードにコピーして
メモ帳に貼り付けて確認したかったのです。
皆さんありがとうございました。
(メイ) 2025/06/16(月) 10:19:36
参照設定の方法はトライしてもうまくいかなかったのでしょうか? それが一番標準的な方法だと思います。 ・アーリーバインディングをすれば(Dim clipboard As New DataObjectといった宣言方法です)、 インテリセンスが使えて(clipboard.まで入力すると、使えるメソッドなどの候補が出て選択できる)、 ・速度も相対的に早くなり、便利かと思います。 また、参照設定はそのブックに対して一度設定するだけで何度もする必要はありません。
利用方法を教えていただき、ありがとうございます。 了解しました。ご自分で作成した文字列変数の中身を、直接メモ帳に転記するということでしたか、 失礼しました。 (xyz) 2025/06/16(月) 12:41:08
> 参照設定の方法はトライしてもうまくいかなかったのでしょうか?
うまくいきません。
>clipboard.まで入力すると、使えるメソッドなどの候補が出て選択できる
はい、できるようにはなりますが、実行すると正常に動作しません。
結果は同じでした。
(メイ) 2025/06/19(木) 07:47:03
>メモ帳は[ ] >エクセルvbaのエディタは[??] >ここは[] 文字コードがあってない気がします (´・ω・`) 2025/06/19(木) 08:48:40
質問者さんへのコメントです。(誤解される可能性は低いと思います。とりわけ(´・ω・`)さんなら)
回答コメント拝見しました。 そうですか、私には原因不明です。力及ばずです。
ところで、ワークシート上の文字列が入っているセルたちを単純にCTRL+Cして、 メモ帳でCTRL+V すると文字化けしますか?
そもそもですが、 > 手書きで目盛っているのですが、情報がおおくなったので、 > クリップボードにコピーして > メモ帳に貼り付けて確認したかったのです。 正直な話をすると、これもよく理解できなかったのです。 普通にシートにメモして置いて、必要ならシートからメモ帳にコピーペイストするだけかと思うのです。 貼り付けられるのはテキストだけですから。
(xyz) 2025/06/19(木) 09:45:24
(?) 2025/06/19(木) 11:19:26
(?) 2025/06/19(木) 11:26:45
1:
Dim clipboard As Object Set clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") clipboard.SetText "コピーするテキスト223" clipboard.PutInClipboard
2:
Dim clipboard As New DataObject clipboard.SetText "コピーするテキスト111" clipboard.PutInClipboard
上記いずれも同じ結果で
メモ帳に上記のメッセージが表示されません。
メモ帳に貼り付けると半角スペース2文字になります。
皆さんのところでは動作しているのでしょうか?
代替え方法は
テキストファイルで出力するとかシートに出すとか
いろいろ考えられますが、
今は皆さんのところでできていることが
こちらではできない理由が知りたいです。
(メイ) 2025/06/26(木) 11:36:11
> ところで、ワークシート上の文字列が入っているセルたちを単純にCTRL+Cして、 > メモ帳でCTRL+V すると文字化けしますか? これに対する回答はいかがだったでしょう。
メモ帳の右下に文字コードが表示されていると思いますが、UTF-8となっていますか? 既にUTF-8しか使えないものと思いますが、念のためです。
実行した文字列は提示されたものと違いありませんか? もしそうなら文字数が全く異なるので、文字化けとも言えない状況かと思います。
(xyz) 2025/06/26(木) 13:21:08
Excel365では上手くいっています。 Excel2016の環境がないので確認できませんが、Excel2016で出来なった記憶もありません。
疑うとしたら、あとはクリップボード関係の常駐ソフトとかでしょうか 常駐ソフト(セキュリティ関連除く)を片っ端からOFFにして確かめてみたらどうでしょう (´・ω・`) 2025/06/26(木) 14:53:45
もひとつじゃない二つ
日本語を含まないASCII文字(半角英数字)だけの場合はどうなりますか? Officeクリップボードを表示させたときどうなりますか
確認してください。 (´・ω・`) 2025/06/26(木) 15:02:02
私もクリップボード周りのツールを入れていないかの可能性は頭をよぎりました。
それと、2016とWindows11との組み合わせもひょっとすると要因かもしれないと思っています。
# 実は私も以前使っていたExcel2019時代にDataObject周りで不思議なことが起きていたことがあります。 # 詳細は覚えていませんが、以降はそれの使用を避けて、質問に回答する際にもTextBoxのCopyメソッドを # 使っていたほどです。そのことは5年ほど前の回答の中にも残っています。 (xyz) 2025/06/26(木) 16:46:05
>Excel2016で出来なった記憶もありません。 なんか嘘ついたみたいです
Excel DataObject 文字化け をキーワードに検索したら Windows10 + Excel2016 ではよく知られた問題だったようで
退散いたします (´・ω・`) 2025/06/26(木) 17:06:39
貴重な情報ありがとうございました。 そうでしたか、今までそういう記事には遭遇しませんでした。トホホ。
(xyz) 2025/06/26(木) 17:24:35
> ところで、ワークシート上の文字列が入っているセルたちを単純にCTRL+Cして、 > メモ帳でCTRL+V すると文字化けしますか? 文字化けしません。
> メモ帳の右下に文字コードが表示されていると思いますが、UTF-8となっていますか? はい、UTF-8 です
> 疑うとしたら、あとはクリップボード関係の常駐ソフトとかでしょうか > 常駐ソフト(セキュリティ関連除く)を片っ端からOFFにして確かめてみたらどうでしょう 常駐ソフトはありません。
> 日本語を含まないASCII文字(半角英数字)だけの場合はどうなりますか? 以下いずれもスペース2つになります。文字化けなら文字数は変わると 思うのですが
clipboard.SetText "ABCDE"
clipboard.SetText "1"
clipboard.SetText ""
※ちなみに[clipboard.]まで打つと、選択肢に以下の表示があります。
Clear
GetFormat
GetFromClipboard
GetText
PutInClipboard
SetText
StatDrag
(´・ω・`)さん
いろいろ調べていただいてありがとうございました。
結局現状では無理だということですね。
皆さんありがとうございました。
(メイ) 2025/06/30(月) 11:45:11
DataObjectの利用について言うと、貴見のとおりです。
より広く言うと、 ・Excel2016(Or Excel2019) +Windows10(or Windows11)の環境では バグにより成功しない(ことがある?が正確かも。発生原因不明なので)。 ・2021,365では発生しない事象 と思われます。
DataObject以外も許容するなら、以下の対応策があります。 1. WindowsAPIを直接叩けば成功する 2. 以下のTextBoxを使った方法も成功します(少なくとも私の環境(365,Win10)では) があります。
1.は 中身が理解しにくく、利用法が複雑な印象があります(私見) 2.は 理解しやすく、利用も容易と思います。 (参照設定も不要です。Late Bindingなため。) バグの修正は一般ユーザーには不可能です。 貴兄の環境を考慮すれば、DataObjectにこだわらないのが得策と思います。
Sub test() Dim s As String s = "文字列テスト" & vbCrLf & "2行目文字列" myCopy s End Sub
Sub myCopy(str As String) With CreateObject("Forms.TextBox.1") .MultiLine = True .Text = str .SelStart = 0 .SelLength = Len(.Text) .Copy End With End Sub
# なお、上記の2は「Excel DataObject 文字化け」を検索すれば出てくると思います。 # ひょっとしたら他の対応策があるかもしれません.
(xyz) 2025/06/30(月) 12:24:42
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.