Excel (VBA)

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

 
(Windows 10 Home : Excel 2016)
クリップボードの履歴の追加
投稿日時: 20/09/27 10:20:30
投稿者: Bingo!

お世話になります
 
VBAを使用してクリップボードにデーターを送信すると
履歴に追加されません
 
例えば
1回目
 
Sub Sample1()
    Dim buf As String
    buf = "jj"
 
    With New MSForms.DataObject
        .SetText buf '変数の値をDataObjectに格納する
        .PutInClipboard 'DataObjectのデータをクリップボードに格納する
    End With
     
    ActiveSheet.Paste Destination:=Range("A1")
End Sub
 
を実行し2回目
 
buf="aa" に変更して実行しても
 
jjが履歴に残りません
 
1回目のjjが履歴に残る方法はありますでしょうか
 
よろしくお願いいたします

回答
投稿日時: 20/09/27 10:42:20
投稿者: WinArrow
投稿者のウェブサイトに移動

クリップボードには、2種類あります。
 
1つは、OSのクリップボード
こちらは、直前に「コピー」したものしか保存されないと思います
 
もう一つは、OFFICEのうリップボード
こちらは、複数のコピーが保存可能です。
 
私は、OFFICEのクリップクボードの操作をVBAで対応する方法は、詳しくありませんが、
 
少なくとも
DataObject
は、OSのクリップボード対象のものと思います。
 
OFFICEのクリップクボードの操作をVBAで対応する方法を探してみてください。

回答
投稿日時: 20/09/27 10:46:42
投稿者: WinArrow
投稿者のウェブサイトに移動

OFFICEのクリップボードの操作に関するwEBページ紹介
内容は、しっかり読んでいませんので
適用できるかわかりません。
 
 
http://www.ka-net.org/office/of56.html

回答
投稿日時: 20/09/27 15:17:48
投稿者: simple

DataObjectオブジェクトを使ったコピーは、ご指摘のとおり
Officeクリップボードで把握する対象にはなっていません。
これは仕様なので致し方ないですね。
 
DataObjectオブジェクトを使う事情が書かれていませんが、
Officeクリップボードに履歴を残すことが優先され、
しかも単なる値貼付で実現できることなら、
いったんセルに書き込んでからコピーしたうえで、貼付すればよいと思います。
 
別法として、ActiveXのテキストボックスを経由して、そのCopyメソッドを使えば、
テキスト情報"だけ"をクリップボードに(Officeクリップボードにも)に送ることもできます。
まあ、そこまですることなのか、疑問ではありますが。

投稿日時: 20/09/27 16:33:25
投稿者: Bingo!

WinArrowさん simpleさん
回答ありがとうございます
 
WinArrowさん
クリップボードが2種類あることを初めて知りました
勉強になりました
ありがとうございます
参考urlは、私には難しく理解することができませんでした
 
simpleさん
DataoObjectを使用する必要はありませんがofficeのクリップボードの履歴を使用したいと思っています
一連の作業をvba化してショートカットに登録しているのですが、最後のこの部分だけがひと手間掛かっています
他のアプリケーションに任意のタイミングでコピーするのでクリップボードの履歴が必要となります
 
セルに値を入力してctrl+cだと履歴に反映されるのですがcopyメソッドだと反映されません
こちらも仕様になるのでしょうか
 
ActiveXのテキストボックスも
Me.TextBox1.Copy
だと履歴に反映されません
テキスト情報をofficeクリップボードに送信する方法があるならヒントをいただけますでしょうか
 
よろしくお願いいたします
 
 
 

回答
投稿日時: 20/09/27 19:06:12
投稿者: simple

ちょっと外出した先からコメントで恐縮ですが、
ActiveXのテキストボックスも
Me.TextBox1.Copy
だと履歴に反映されません

そのコードを一式アップしておいてもらえまえせんか?
戻ってから確認させていただきたいので。

投稿日時: 20/09/27 20:04:43
投稿者: Bingo!

simpleさん
返答ありがとうございます
 
ワークシートの1にテキストボックスを張り付けています
そして
test1
test2
と値を設定しています
 
Private Sub Worksheet_Activate()
Me.TextBox1.Copy
End Sub
 
クリップボードの履歴に反映するか確認するのが目的のため
この様な簡単なコードにしています
 
よろしくお願いいたします
 

回答
投稿日時: 20/09/27 20:16:39
投稿者: simple

TextBoxオブジェクトのCopyメソッドのヘルプを見ると、

Private Sub CommandButton1_Click()
    'クリップボードにコピーする前にテキストを選択する必要があります。
    TextBox1.SelStart = 0
    TextBox1.SelLength = TextBox1.TextLength
    TextBox1.Copy
とされていますが、この点はいかがですか?

投稿日時: 20/09/27 21:22:17
投稿者: Bingo!

simpleさん
回答ありがとうございます
 
シートに直接TEXTBOXを張り付けたときは値の文字列ではなくTEXTBOXごとコピーされました
 
USERFORMを使用してTEXTBOXに値を入力してコピーすると履歴に反映されました
 
シートに直接TEXTBOXを張り付けると文字列だけコピーするのは難しいのでしょうか
 
もしご存じでしたらご教示お願いいたします
 
 

回答
投稿日時: 20/09/27 22:28:15
投稿者: WinArrow
投稿者のウェブサイトに移動

横からしつれいします。
ユーザーフォームのテキストボックスと
 
ActiveXコントロールのテキストボックスは
似ているようですが、少し違います。
 
ActiveXコントロールのテキストボックスには
LinkedCell
というプロパティがあります。
 
これお利用してクリップボードへ複写したらいかがでしょうか?
 
こちらでテストした結果のコードです。
Sheet1モジュールに記述しています。
Sub test()
    With Me
        .Range(.TextBox1.LinkedCell).Copy
        .Range(.TextBox1.LinkedCell).Offset(2, 2).Select
        .Paste
    End With
End Sub
 

回答
投稿日時: 20/09/27 23:42:11
投稿者: simple

> DataObjectオブジェクトを使う事情が書かれていませんが、
> Officeクリップボードに履歴を残すことが優先され、
> しかも単なる値貼付で実現できることなら、
> いったんセルに書き込んでからコピーしたうえで、貼付すればよいと思います。
と書いたとおりですが、
どうしてもセルの利用でなく、TextBox利用ということなら、下記のようになります。
 

Sub test()
    Dim txtBox As Object
    Dim myObj As Object
    
    'TextBoxの利用(なければ作成)
    On Error Resume Next
    Set txtBox = ActiveSheet.Shapes("TextBox1").DrawingObject.Object
    If txtBox Is Nothing Then
        Set myObj = ActiveSheet.OLEObjects.Add(ClassType:="Forms.TextBox.1", Link:=False, _
                    DisplayAsIcon:=False, Left:=600#, Top:=30#, Width:=70#, Height:=20#)
        txtBox.Name = "TextBox1"
        Set txtBox = ActiveSheet.Shapes("TextBox1").DrawingObject.Object
    End If
    On Error GoTo 0
    
    '選択中のセルをTextBox経由でコピー
    With txtBox
        .MultiLine = True
        .Value = Selection.Text
        .SelStart = 0
        .SelLength = Len(.Text)
        .Copy
    End With
    
    '例えばB1セルに貼付
    Range("B1").Select
    Selection.PasteSpecial Paste:=xlPasteAll
End Sub

むろん、.Value = buf としてもOKでしょう。

投稿日時: 20/09/28 03:49:43
投稿者: Bingo!

WinArrowさん simpleさん
回答ありがとうございます
 
こちらでやりたい事が出来そうです
ありがとうございました
 
最後に、セルに値にを入力してctrl+cだと履歴に反映するのですが
copyメソッドだと反映されません
 
一連の作業をvbaでしているのですが最後の作業がひと手間掛かっていました
 
セルの値をvbaでクリップボードの履歴に残す方法があるのならご教示いただけますと幸いです
 
よろしくお願いいたします
 

回答
投稿日時: 20/09/28 06:11:18
投稿者: simple

早起きですね。
 
# やはり、昨日のうちに訂正しておけばよかった。
コード間違えていたので、訂正してください。

    'TextBoxの利用(なければ作成)
    On Error Resume Next
    Set txtBox = ActiveSheet.Shapes("TextBox1").DrawingObject.Object
    On Error GoTo 0
    If txtBox Is Nothing Then
        Set myObj = ActiveSheet.OLEObjects.Add(ClassType:="Forms.TextBox.1", Link:=False, _
                    DisplayAsIcon:=False, Left:=600#, Top:=30#, Width:=70#, Height:=20#)
        myObj.Name = "TextBox1"
        Set txtBox = ActiveSheet.Shapes("TextBox1").DrawingObject.Object
    End If
なんかしっくりこない使い方なんですが。
 
引用:
最後に、セルに値にを入力してctrl+cだと履歴に反映するのですが
copyメソッドだと反映されません

[A1].Copy [B1] は履歴に残らないが、
[A1].Copy
[B1].PasteSpecial とするとよい、といったことですか?

回答
投稿日時: 20/09/28 09:13:05
投稿者: Suzu

目的と手段に乖離があると思います。
既に WinArrowさんが

引用:
クリップボードには、2種類あります。
  
1つは、OSのクリップボード
こちらは、直前に「コピー」したものしか保存されないと思います
  
もう一つは、OFFICEのうリップボード
こちらは、複数のコピーが保存可能です。

 
補足として、
OSのクリップボードは、OSレベルなので、他のアプリケーションからでも読み取ることが可能です。
Officeのクリップボードは、Office製品からでしか読み取れません。
 
引用:
他のアプリケーションに任意のタイミングでコピーするのでクリップボードの履歴が必要となります

引用:
DataoObjectを使用する必要はありませんがofficeのクリップボードの履歴を使用したいと思っています

他のアプリケーションと言うのがOffice以外なのであれば、Officeのプリップボードは利用できません。
利用できるのは、OSのクリップボード(直前のコピー)ですから複数履歴は利用できません。
 
Office製品なのであれば、ExcelのVBAからそのOffiece製品が操作可能(逆もしかり)ですから
クリップボードを経由する必要がありません。
 
 
他のアプリケーションがOffice製品なのかどうなのか。
そのアプリケーションから「Officeクリップボード」が利用できるのか。
確認されたほうが良いと思います。

投稿日時: 20/09/28 22:01:13
投稿者: Bingo!

simpleさん、Suzuさん
ご回答ありがとうございます
 
ActiveXのテキストボックスでやりたい事が出来そうです
 
今までご回答くださった皆様本当にありがとうございました
 
解決済みとさせていただきます。