[[20160627102939]] 『クリップボード』(アスカ) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『クリップボード』(アスカ)

クリップボードへの登録(コピー)をしたいのですが。できません。

下記リンク先のコードをテストしておりますが、結果は??が表示されます

http://www.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

過去の投稿も確認致しましたが、解決策が見つかりませんでした。

http://www.excel.studio-kazu.jp/kw/20131126100627.html

win10 64ビットです。
C:\Windows\SysWOW64\FM20.DLL を参照設定しております。

何かご存知の方がおりましたら助けて下さると嬉しいです。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 悩ましいですよねぇ。

 たとえば、この学校内でQ/A資料としてシートレイアウトをコピペでアップする際には
[[20110209184943]] 『[談]シートレイアウトの投稿どうしてますか?』(momo)
 このmomoさんのユーティリティを皆さん重宝して使っているんですけど、βの環境では
 win7+xl2010 までは問題なく使えますが win8.1+xl2013 以降では それが使えません。
 (たまぁ〜に使える場合があります。PC再立ち上げ後の最初の実行時等)

 過去投稿には

[[20160508160454]] 『集計』(みっちゃん)
[[20160505004601]] 『入出荷一覧入力データを在庫推移表に反映を軽くし』(よむちん)

 これらでも話題になりましたけど、ピリっとした解決にはなっていませんね。

 βも、このトピに寄せられる上級者さんのコメントを、期待しつつROMしております。

(β) 2016/06/27(月) 11:02


 私がアップした

[[20160326092004]] 『xl2013 での momoさんのレイアウトアップユ=x(β)

 これも、ご参考まで。

 なお、ここで、【いつの間にかOKになった】ということで締めましたが
 実は、そのあと、また NG になって、現在に至っています。

(β) 2016/06/27(月) 11:06


ご連絡ありがとうございます。
解決策があれば嬉しいのですが・・・
(アスカ) 2016/06/27(月) 12:15

念のため、環境の確認です。64bit版WIN10との事ですが、WOWを使っているということは、Excel2013は32bit版をご使用でしょうか?

まず試してみたいことは、「参照設定」でのFM20.DLLを解除し、UserFormを追加することによる自動宣言。多分、チェックのオフはエラーになると思うので、新規ブックで試してみてください。
この方法ならば、Excelが32bit,64bitどちらであっても、適切なFM20.DLLを参照するはずです。

次に試してみたいことは、以下のコーディングに変えてみるとどうなるか、です。
クリップボードは汎用であり、他が同時に使用することも考慮し、テキストのみ反応してみています。

 Sub test()
    Dim buf As String, buf2 As String, CB As New DataObject
    Dim vw As Variant
    Dim i As Long

    buf = "漢字"
    With CB
        .SetText buf
        .PutInClipboard
        DoEvents
        vw = Application.ClipboardFormats
        For i = 1 To UBound(vw)
            If vw(i) = xlClipboardFormatText Then
                .GetFromClipboard
                buf2 = .GetText
                Exit For
            End If
        Next i
        If i <= UBound(vw) Then
            MsgBox buf2
        End If
    End With
 End Sub

これでも同じように文字化けする場合、ちょっとお手上げです。WOWが32bitをエミュレーションする際にコード変換を間違える場合があるのだろうなぁ、とは予測しますが、これを避ける方法があるのかどうか。可能かどうか判りませんが、テキストモードではなく、バイナリモードで値をセットすれば…、とか?
(???) 2016/06/27(月) 13:49


 To ??? さん

 ??? さんがアップされたコードを、そのまま使って、実行しますと、確かにクリップボードには "漢字"が書きこまれ
 .GetFromClipboard で値を取得すると、(当たり前ですが)"漢字" が返ってきます。
 .GetFromClipboard を使わず、.PutInClipboard だけにして 実行後、Ctrl/v でも "漢字" がペーストされます。

 一方、βが引き合いに出したmomoさんのユーティリティ、ここでは参照設定せず
 Const DataObjectID As String = "1C3B4210-F441-11CE-B9EA-00AA006B1A69"
 と規定した上で
 直接 With GetObject("new:" & DataObjectID) としています。
 また、それを、(試行錯誤の過程で)
 With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
 として、処理していますが、いずれも、NGのケースが多い、この場合、.GetFromClipboard でおかしくなっているのではなく
 .PutInClipboard でクリップボードに書きこんだ、そのクリップボードの中身自体がすでに化けています。

 なやましいのは、このmomoさんのコード、これを 実行時バインディングではなく参照設定にするとうまくいくのかもということで
 今、まずは、momoさんのコードのオリジナルのまま実行すると、なぜか(?)何度やっても、問題なくペーストできてしまいます。

 なので、これを参照設定してうまくいっても、参照設定に変えたからうまくいったのか、たまたまうまくいっているのか
 その見極めがなかなかつかないというところです。

 momoさんのコードを、???さんご指摘のように参照設定ベースにかえて、しばらく運用してみます。
 もし、それで安定した結果が得られるなら、参照設定で問題解決ということになり、ハッピーですね。

(β) 2016/06/27(月) 15:06


 報告です。

 先ほどまで何度やっても、問題なくペーストできていたmomoさんのコード、急に、文字化けするようになりました。
 問題解決の段階としては、めでたしめでたし??なんですが。

 で、momoさんのコードを参照設定ベースにして、実行してみました。
 これでうまくいけば解決! というところだったんですが、参照設定にしてもNGでした。

 悩みます・・・・

 ちなみに 当方、Windows は 64Bit ですが エクセルは 32Bit です。

(β) 2016/06/27(月) 15:13


βさん、私の方では容易に再現環境を作れないので、ダメ元で試してみてください。

momoさん作ソースのGetObjectを、CreateObjectに変えるとどうなるでしょう?
もひとつ、.SetText後、.PutInClipboard前にDoEventsを入れるとどうなるでしょう?
(???) 2016/06/27(月) 16:28


 報告します。

 コメントしましたように、ブックを開いて、最初はうまくいく場合が少なくないのですが
 すぐに、NGになります。

 で、いったん NG になった環境で

 1.GreateObject あるいは GetObject のみ(もともとのコード)
 2.1.+ ご指摘の DoEvents 追加
 3.1. + 参照設定(Microsoft Forms 2.0 Object Library)      
 4.3.+ ご指摘の DoEvents 追加

 いずれもNG でした。

(β) 2016/06/27(月) 17:10


 最初はOKだけど、何かコピペ操作を繰り返すうちにNGになっているようにも思えましたので
 おなじくダメもとで、

 Private Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
 Private Declare Function CloseClipboard Lib "User32" () As Long
 Private Declare Function EmptyClipboard Lib "User32" () As Long

 を宣言し、処理の最初に

    OpenClipboard (0&)
    EmptyClipboard
    CloseClipboard

 これをいれて、クリップボードを空っぽにしてみましたが、結果他同じく、NGでした。

 さらに、ダメ元の二乗で、Application.CutCopyMode = False を追加してもNGでした。

(β) 2016/06/27(月) 17:17


βさん、ありがとうございました。う〜ん、予想通りとはいえ、難しい現象ですねぇ。
オブジェクトの確保タイミングに関係なく発生し、出始めるとずっと駄目ということは、OS(WOW周り?)に問題があるのでしょうね。

発生後はどう初期化しても回復しない、CreateObjectのレイトバインディングでもNGなりっぱなし、ということは、クリップボードを管理しているプロセス自体を再起動するしか…。
(???) 2016/06/27(月) 17:23


コメント返信:

[ 一覧(最新更新順) ]


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