tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: Microsoft Formsでのクリップボード操作のバグ?
投稿日: 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 に問い合わせた方がよさそうですね。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。