Excel (VBA)

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

 
(Windows 10 Pro : Microsoft 365)
クリップボードからの貼り付け
投稿日時: 23/04/25 20:49:29
投稿者: Hinatachan

クリップボードから貼り付けがうまくできない事象で御HPの以下URLを見て試行錯誤したのですが
うまく組み込むことができません。
https://www.moug.net/faq/viewtopic.php?t=82008
  
  
Windows 10 / Microsoft 365の環境において、
下記のコードだと、クリップボードから貼り付けができない状況です。
msgboxでは、ListBox1.Textのところに、コピーされた値がちゃんとメッセージボックス上で確認できるのですが、別の場所でペーストすると□□とか、空白のままになってしまいます。
調べてみると365の環境下でよくみられるバグのようなのですが、
APIを使わずに、御HPのような方法で解決したいのですが、
このコードをどの部分に組み込んでも、うんともすんとも言いません。
  
やりたいこと
リストボックスにでてきた任意のものをダブルクリックすると、
対応するA列の値がクリップボードにコピー
  
  
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim s As String
Dim rng As Range
Static cb As DataObject
If cb Is Nothing Then Set cb = New DataObject
With Me.ListBox1
If .ListIndex >= 0 Then
s = .List(.ListIndex, 0)
End If
End With
If s <> "" Then
Set rng = Me.ufFind(s)
If Not rng Is Nothing Then
rng.Select
cb.SetText rng.Value
cb.PutInClipboard
MsgBox ListBox1.Text & " をコピーしました"
End If
End If
End Sub
  
このコードにプラスして、御HPから得た知識で
With CreateObject("Forms.TextBox.1")
    .MultiLine = True
    .Text = str
    .SelStart = 0
    .SelLength = .TextLength
    .Copy
  End With
  
を組み込んでみました。それが以下ですが、クリップボードにどうやらコピーできてないようです。
メッセージボックスには、ちゃんと表示されるのに不思議です。
  
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim s As String
Dim rng As Range
Static cb As DataObject
If cb Is Nothing Then Set cb = New DataObject
With Me.ListBox1
If .ListIndex >= 0 Then
s = .List(.ListIndex, 0)
End If
End With
If s <> "" Then
Set rng = Me.ufFind(s)
If Not rng Is Nothing Then
rng.Select
cb.SetText rng.Value
With CreateObject("Forms.TextBox.1")
    .MultiLine = True
    .SelStart = 0
    .SelLength = .TextLength
    .Copy
  End With
MsgBox ListBox1.Text & " をコピーしました"
End If
End If
End Sub
  
よろしくおねがいします。

回答
投稿日時: 23/04/26 05:45:35
投稿者: simple

回答遅くなりました。当方の閲覧タイミングがズレていました。
私の過去発言に関係しているもののようでした。
 
.Text = sが抜けているようですが、投稿時の単なるミスですか?

    With CreateObject("Forms.TextBox.1")
        .MultiLine = True
        .Text = s           '← これが抜けているようですが....
        .SelStart = 0
        .SelLength = .TextLength
        .Copy
    End With
なお、
>下記のコードだと、クリップボードから貼り付けができない状況です。
とありますが、これはクリップボードにコピーするものであって、
クリップボードから貼り付ける処理は含まれていないように思います。
 
文字列は取得できているのに、それをクリップボードにいったんコピーして、
さらに貼り付けないといけない理由は何でしょうか。
また、どのように貼り付ける予定なんですか?
差し支えなければ、教えてください。
 
----
【補足事項】
質問内容ではありませんが、唐突かつ ついでながら、インデントをきちんとつけることを推奨します。
例えば以下のように。
(当初の発言そのままの内容です。上の修正はしていません。
  不要になるはずのDataObject周りの処理もそのままにしています。)
 
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim s As String
    Dim rng As Range
    Static cb As DataObject
    If cb Is Nothing Then Set cb = New DataObject
    With Me.ListBox1
        If .ListIndex >= 0 Then
            s = .List(.ListIndex, 0)
        End If
    End With
    If s <> "" Then
        Set rng = Me.ufFind(s)
        If Not rng Is Nothing Then
            rng.Select
            cb.SetText rng.Value
            With CreateObject("Forms.TextBox.1")
                .MultiLine = True
                .SelStart = 0
                .SelLength = .TextLength
                .Copy
            End With
            MsgBox ListBox1.Text & " をコピーしました"
        End If
    End If
End Sub

投稿日時: 23/04/26 06:11:47
投稿者: Hinatachan

返信いただきありがとうございます。
インデントのご指摘もありがとうございます、すみません。
 
textの抜けは、いろいろ試しながら入れていたら、
いつのまにか削除してしまっていたようです。
 
私の文章レベルがとても稚拙で、失礼いたしました。
ペーストはマクロのコード内に入れるのではなく、
クリップボードへのコピーのマクロ処理を行った後に、
実際に自分自身が行う動作なので、
コードの中にペーストのマクロは入れないという趣旨でございます。
 
2016環境では、cb.PutInClipboardが上手く動くのに
365の環境では、cb.PutInClipboardをしても、ペーストしたら◻︎◻︎にしかならない事が
困っております。
 
ちなみに、"Forms.TextBox.1"
のところですが、同じユーザフォームのなかに
すでに私はTextBox1を使用しているので、
使っていないTextBox3とかにいったんコピーさせるには、
"Forms.TextBox.3"とかにするのかなと思い、実行しましたが、
何も変わりませんでした。
 
もっと最初から出直して来いと思われそうな質問で恐縮です。

回答
投稿日時: 23/04/26 06:39:13
投稿者: simple

引用:
365の環境では、cb.PutInClipboardをしても、ペーストしたら◻︎◻︎にしかならない事が
困っております。

私はその環境が無いので、確認もできません。
もしそうなら、理由はMS社でないと回答できないと思います。
 
なお、Textbox3をそのまま使えばいいんじゃないですか?
コードが示されていないのでわかりません。ご自分で解決してください。
私はここまでとさせてください。

投稿日時: 23/04/26 06:40:26
投稿者: Hinatachan

ありがとうございました