Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
クリップボードから貼付けができない現状
投稿日時: 23/01/20 13:41:00
投稿者: takatada72

お世話になります。
 
Excel のユーザーフォームにテキストボックスを設置して、その中に記載する文章を
クリップボードに貼り付けたいのですが、何故か、チームスに貼り付けると「口口」と
表示されます。また、テキストに貼り付けると「??」 になってしまいます。
※D3は、製品番号です。D5は、製品名になります。
※MsgBox msgでは、正しく表示されるのです。
 
何が問題になりますでしょうか
宜しくお願い致します。
 
 
Dim MsgItem As String
    MsgItem = Sheets("Sheet1").Range("D3").Value & " " & Sheets("Sheet1").Range("D5").Value
 
Dim MyClipboard As New DataObject
msg = MsgItem & Chr(13) & Chr(10) & TextBox1
MsgBox msg
With MyClipboard
    .SetText msg 'テキスト文字列をDataObjectにコピー
    .PutInClipboard 'DataObjectのデータをクリップボードに移動
End With
 

回答
投稿日時: 23/01/20 14:21:19
投稿者: taitani
投稿者のウェブサイトに移動

問題の切り分けで恐縮ですが、
 
msg = MsgItem & Chr(13) & Chr(10) & TextBox1

msg = MsgItem
だけに変更した場合はどうなりますか?
 
また、TextBox1 にはどのような文言が設定されており、その文言はどこから取得していますか?(Webベースなど)

投稿日時: 23/01/20 15:49:31
投稿者: takatada72

お疲れさまです。
 
早速、ありがとうございました。
 
先程、社内の講習が終わり、今、確認させて頂きました。
下記に変更してみましたが、同じ現象です。
 
 
入力している文字列は、適当です。
しししししし
ひひひひひ
ささささささ
ちちちちちち
D102030 製品名1 ← MSGBOXでは、正しく表示されます。
 
 
>msg = MsgItem & Chr(13) & Chr(10) & TextBox1
>を
>msg = MsgItem
 
 
引き続き宜しくお願い致します。

回答
投稿日時: 23/01/20 17:02:52
投稿者: taitani
投稿者のウェブサイトに移動

確認ありがとうございます。
おそらく、もともとのコードは、以下の URL の見解です。
http://officetanaka.net/excel/vba/tips/tips20.htm
 

Sub Sample2()
    Dim buf As String, buf2 As String, CB As New DataObject
    buf = "tanaka"
    With CB
        .SetText buf        ''変数のデータをDataObjectに格納する
        .PutInClipboard     ''DataObjectのデータをクリップボードに格納する
        .GetFromClipboard   ''クリップボードからDataObjectにデータを取得する
        buf2 = .GetText     ''DataObjectのデータを変数に取得する
    End With
    MsgBox buf2
End Sub

 
私の端末で動作してみましたが、buf2 のデータは「??」だったので、事象が再現できました。
→Windows 10 Pro : Microsoft 365
 
Microsoft 365 Excel のバグでしょうか。。。
ただ、以下のように、Ctrl+C でセルのデータをクリップボードに送った後は、正常に取得できました。
 
Sub Sample3()
    Dim buf As String, buf2 As String, CB As New DataObject
    buf = "tanaka"
    With CB
        'Ctrl+C で何かをクリップボードに送った後
        .GetFromClipboard ''クリップボードからDataObjectにデータを取得する
        buf2 = .GetText ''DataObjectのデータを変数に取得する
    End With
    MsgBox buf2
End Sub

 
他の、Excel バージョンの方の回答を待ってみましょう。

回答
投稿日時: 23/01/20 18:06:21
投稿者: simple

ご苦労様です。
■実験結果
私は、Win10(64bit),Excel2019(32bit)ですが、正常に動作します。
問題は365でしょうから、それで異常が再現できるか、どなたか追加の実験を。
 
個人的には、DataObjectに余り良い印象がありません。
不可解な動きになることが結構あります。ですので、余り使わないようにしています。
 
■この関係の話は昔からあるようで、
https://www.ka-net.org/blog/?p=7537
が参考になると思います。(なお、記事中のURLに注意(下記(*)参照)
 
その中で紹介されている
「TextBoxを経由して文字列をコピーする方法」はトライする意味があると思います。
私もこれを使って回答したことが結構あります。安定していると思います。
 
質問者さんの状況は非表示のテキストボックスを追加して、そこに連結した文字列を書き、
そのテキストを選択して、copyメソッドを使うとよいでしょう。
詳細コードは、上記記事にあるように

  With CreateObject("Forms.TextBox.1")
    .MultiLine = True
    .Text = str
    .SelStart = 0
    .SelLength = .TextLength
    .Copy
  End With
を参考にして修正してください。
 
(*)なお、ExcelQ&A掲示板の記事については、
検索用ログに移った関係で、URLを下記に変更してみてください。
「VBAからクリップボードへの出力ができなくなりました」
https://excelfactory.net/excelboard/excelvba/cfs.cgi?word=178686&andor=and&logs=32.txt

回答
投稿日時: 23/01/20 18:32:19
投稿者: simple

日本語がおかしかったので(というより私の頭がおかしい)、以下に修正します。
 
質問者さんの状況ですと、非表示のテキストボックスを追加して、そこに連結した文字列を書き、
そのテキストを選択して、copyメソッドを使うとよいでしょう。

投稿日時: 23/01/23 09:56:48
投稿者: takatada72

みなさま
 
色々とご確認を頂きましてありがとうございます。
 
simpleさん、ご回答をありがとうございました。
 
こちらを記入しました所、msgの内容がそのまま表示されるようになりました。
ありがとうございました。
 
 With CreateObject("Forms.TextBox.1")
    .MultiLine = True
    .Text = msg
    .SelStart = 0
    .SelLength = .TextLength
    .Copy
  End With
 
 
taitaniさん、ご確認をありがとうございました。
こちらを試したところ、CTR+Cをした内容が表示されました。
こちらをうまくプログラムで実現すれば、実現できますね
   Dim buf As String, buf2 As String, CB As New DataObject
    buf = msg
    With CB
        'Ctrl+C で何かをクリップボードに送った後
        .GetFromClipboard ''クリップボードからDataObjectにデータを取得する
        buf2 = .GetText ''DataObjectのデータを変数に取得する
    End With
    MsgBox buf2
 
クローズさせて頂きます。