タイトル | : Re: Microsoft Formsでのクリップボード操作のバグ? |
記事No | : 14460 |
投稿日 | : 2010/02/10(Wed) 11:15 |
投稿者 | : 魔界の仮面弁士 |
> 最初にやろうとしてたのは、WinXP ProのExcel2003/2007の > セルの内容をVB6で作成されたアプリのテキストボックスに > クリップボード経由で貼り付けることでした。 念のため。 VB6 の TextBox は、日本語環境では Shift_JIS 専用であり、 Unicode には対応していません。
たとえば「立方メートル記号」などは、Excel 側には表示できても VB6 の標準コントロールでは表示できない事に注意してください。
> Microsoft Forms2.0のsettextの動きが変なのです。 VB6 の VB.Clipboard の SetText メソッドではなく、 Forms 2.0 の MSForms.DataObject の SetText メソッドですね。
> .SetText ActiveCell.Value Forms 2.0 の MSForms.DataObject の SetText メソッドを用いていた場合、 CF_TEXT 形式のデータが正しく出力されないようです。 (そのせいか VBA のサンプルを見ると、クリップボード API を使った例が屡見られます)
たとえば "aaa,bbb,ccc" という文字列なら、本来であれば CF_TEXT: 61,61,61,2C, 62,62,62,2C, 63,63,63(,00) CF_OEMTEXT: 61,61,61,2C, 62,62,62,2C, 63,63,63(,00) CF_UNICODETEXT: 61,00,61,00,61,00,2C,00, 62,00,62,00,62,00,2C,00, 63,00,63,00,63,00(,00,00) というバイナリが出力されるべきかと思いますが、MSForms 経由だと CF_TEXT: 61,61,61,2C, 62,62,62,2C, 63,63,63,00, 00,00,00,00, 00,00,00,00, 00,00,00,00 CF_OEMTEXT: 61,61,61,2C, 62,62,62,2C, 63,63,63,00 CF_UNICODETEXT: 61,00,61,00,61,00,2C,00, 62,00,62,00,62,00,2C,00, 63,00,63,00,63,00,00,00 という結果で出力されてしまいます。
CF_OEMTEXT や CF_UNICODETEXT の内容は問題無さそうですが、 CF_TEXT の内容が明らかにおかしいです。
また、上記は "aaa,bbb,ccc" という文字列でしたが、ここに日本語が含まれた場合、 CF_TEXT 内のデータが文字化けしたり、そもそも格納されなかったりします。
手元の下記の環境において再現したところをみると、 どうも昔から、こういう仕様だったみたいですね。
WinXP/SP3 + Excel 2007/SP2 + FM20.DLL (12.0.6514.5000) Win2000/SP無 + Excel 97/SR-1(8.0d) + FM20.DLL (2.1.3603.0)
> セルの内容の最後に改行が入るし セルそのものを Ctrl + C でコピーした場合、「タブ区切りテキスト」形式で 取得されることになるからです。 (数式バーから Ctrl + C で文字列をコピーした場合には入らないと思います)
複数のセル範囲を Ctrl + C すると分かりますが、CF_TEXT/CF_OEMTEXT には ・エンコードは Shift_JIS で行われる(Unicode 文字は化ける)。 ・列と列の間はタブ(0x09)で区切られる。 ・行の末尾には改行(0x0D,0A)が挿入される。 ・改行を含むセルの場合、両端が"(0x22)で囲まれる。 ・テキストデータの末尾は 0x00 で終わる。 というデータ形式で格納されます。
> VB6で同じソースでテストをしようとしましたが、 VB6 の場合、VB.Clipboard オブジェクトを利用できるので、 通常は、MSForms.DataObject の出番は無いと思います。
ただし、Unicode テキストの転送を必要とする場合には、 (案1) IE の clipboardData オブジェクトを利用する。 (案2) クリップボード API を利用する。 といった対処が必要となるかと思います。
> Microsoft Forms2.0は既に指定されている、とか言われて参照設定出来ないんですね。 [プロジェクト]-[コンポーネント]で、『デザイナ』あるいは『コントロール』で 追加されたライブラリは、参照設定に加えられない可能性があります。
また、参照設定の一覧に表示されないライブラリの場合、vbp を直接操作しないと 設定を削除できない事があるようです。
なお、先のコードを参照設定せずに利用するなら、 With GetObject("new:1C3B4210-F441-11CE-B9EA-00AA006B1A69") .Clear .SetText "TestData" .PutInClipboard End With という構文が使えます。
> しかしVB6のアプリ側でCTRL+Vで貼り付けしても何も起こらないんですね。 先述したとおり、MSForms で 日本語文字を SetText した際に、 CF_TEXT が 0 バイトになってしまう(ことがある)ためです。
> 他にもいくつか試してみたら、メモ帳や秀丸エディタには貼り付け出来ましたが、 これらは、CF_TEXT ではなく、CF_UNICODETEXT を利用するためです。 CF_UNICODETEXT のデータについては、MSForms.DataObject でも問題ありません。
> どうもすっきりしないです。これってMicrosoft Forms2.0のバグでしょうか? Microsoft に問い合わせた方がよさそうですね。
|