投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/9/6 19:50:17
> My.Computer.Clipboard.SetText() を使用しています。

上記だと、文字列データしか受け渡せませんね。

データを文字列としてだけではなく、「複数の形式」でコピーしたい場合は、
下記の構文を使うことができます。

Dim data As New DataObject()
data.SetData(形式1, 形式1のデータ)
data.SetData(形式2, 形式2のデータ)
data.SetData(形式3, 形式3のデータ)
Clipboard.SetDataObject(data, True)




> 数式(OMath)として貼り付けしたいのです。 

次は OMath の話。

現行の Word VBA で OMath を書くために、たとえばこんなコードを使えますよね。
Microsoft 数式エディタ時代の Word だとダメですが。


Dim objEq As Word.OMath
'摂氏と華氏の変換式 
objRange.Text = "Celsius=(5/9)(Fahrenheit-32)"
Set objRange = objRange.OMaths.Add(objRange)
Set objEq = objRange.OMaths(1)
objEq.BuildUp



Word 上に書いたこの数式をコピーしてみると、その時のクリップボード内には
MathML 形式、リッチテキスト形式、HTML 形式、Unicode テキスト形式、
メタファイル画像形式などなど、数多くの形式でコピーされていることを確認できるかと思います。

格納されている形式を確認する方法は、既に何通りか紹介しているので
先の回答をご覧いただければと思います。


でもって、Word の数式で扱われるクリップボードデータでは、
主となる形式は MathML 形式となっています。
これは下記のような XML データとして保持されています。

<?xml version="1.0" encoding="UTF-16"?>
<mml:math
 xmlns:mml="http://www.w3.org/1998/Math/MathML"
 xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">
  <mml:mi mathvariant="normal">Celsius</mml:mi>
  <mml:mo>=</mml:mo>
  <mml:mfenced separators="|">
    <mml:mrow>
      <mml:mfrac>
        <mml:mrow>
          <mml:mn>5</mml:mn>
        </mml:mrow>
        <mml:mrow>
          <mml:mn>9</mml:mn>
        </mml:mrow>
      </mml:mfrac>
    </mml:mrow>
  </mml:mfenced>
  <mml:mfenced separators="|">
    <mml:mrow>
      <mml:mi mathvariant="normal">Fahrenheit</mml:mi>
      <mml:mo>-</mml:mo>
      <mml:mi mathvariant="normal">32</mml:mi>
    </mml:mrow>
  </mml:mfenced>
</mml:math>



上記をコピーして、Word に貼ってみてください。同じ数式が現れるかと思います。
(この時、先頭の <?xml の前に改行や空白等が入らないように注意してください)

といっても、ブラウザーから直接 Word にコピペすると、
『HTML 形式』が優先されて貼り付けられてしまう可能性がありますので、
一度、ただのテキスト形式に変換しておく必要があります。

ここでは上記を、一度「メモ帳」に貼りつけて、それをメモ帳で全選択してから
テキストしてコピーしなおし、それを Word 上に貼り付けてみてください。

これにより『テキスト形式』に変化しますので、数式が現れるかと思います。


この方法を応用すれば、Word VBA 単体でも
objRange.PasteSpecial , , , , WdPasteDataType.wdPasteText
のようにして、MathML から 数式(OMath) を貼り付けることが可能となります。
もしもこれを
objRange.PasteSpecial , , , , WdPasteDataType.wdPasteHTML
とすれば、HTML 形式で貼り付けられることになりますね。

ただし Word 2007 以降であったとしても、2003 までの旧型式(*.doc)のファイルに対して
呼び出した場合は、数式ではなく XML 文字列のまま貼り付けられてしまうという点と、
WdPasteDataType で指定した形式のデータがクリップボードに無い場合には
実行時エラーになってしまうという点については注意しておいてください。