5

Word 文書に埋め込まれた Excel テーブルをプログラムで変更しようとしています。これを行うために、docx ファイルと埋め込まれた Excel ファイルを変更しました。

主なドキュメントの重要な部分は次のとおりです。

<w:object w:dxaOrig="8406" w:dyaOrig="2056">
  <v:shape id="_x0000_i1028" type="#_x0000_t75" 
    style="width:390.75pt;height:95.25pt" o:ole=""><v:imagedata r:id="rId14" 
    o:title=""/>
  </v:shape>
  <o:OLEObject Type="Embed" ProgID="Excel.Sheet.12" ShapeID="_x0000_i1028" 
    DrawAspect="Content" ObjectID="_1349794876" r:id="rId15" 
    UpdateMode="Always"/>
</w:object>

Word ドキュメントは、OLEObject を使用して、埋め込まれた Excel ドキュメントにリンクします。表示目的で、.wmf ファイルが使用されます (v:shape要素を使用)。このプレビューより古い Excel ドキュメントを修正しました。

これにより、ドキュメントで奇妙な動作が発生します。

  • 埋め込み (Excel) テーブルのプレビューに間違ったデータが表示される
  • 埋め込まれたテーブルをダブルクリックすると、埋め込まれた Excel でテーブルが開き、正しいデータが表示されます
  • 埋め込みエディターを閉じると、新しいプレビューの生成がトリガーされ、正しいデータが表示されます

もちろん、ドキュメントを開いたときにテーブルに正しいテーブルが表示されるようにします。Word で画像を破棄してプレビューを再描画するにはどうすればよいですか?

私にとって理想的な解決策は、docx の内容を変更するだけでプレビューの再生成をトリガーすることですが、小さなスクリプトを使用した解決策も役立ちます。

4

2 に答える 2

5

これに対する完全な解決策はありませんが、ほとんどの場合に機能するのは、を強制的に開閉することOLEFormat.Objectです。埋め込まれたExcelワークシートをWordの外部から再水和する(つまり、Open XML形式を操作する)か、オブジェクトモデルを介して行うかは関係ありません。これには、Word内から埋め込みExcelスプレッドシートを開き、そのオブジェクトを閉じて、画像を埋め込みスプレッドシートの現在の値に変更し、新しい画像を作成する必要があります。

これを多くのWord文書で行うのか、1つだけで行うのかは、少し異なります。前者の場合、グローバルテンプレート(normal.dotや、作成してSTARTUPフォルダーに配置したカスタムテンプレートなど)、または後者の場合は、1つのドキュメントの背後でコードを実行するだけです。どちらも実行方法が異なりますが、基本的にはDocument_Openイベントをフックし、そこから現在のドキュメントにOLE Embeddedオブジェクトがあるかどうかを確認し、ある場合はそれらを開いたり閉じたりします。

私が言ったように、フックに入らなければ、コードはきれいではありません。基本的にはを使用しているためSendKeysです。ほとんどの場合、これは機能します。時々、そうではありません。SendKeysこれが、同意なしにフォーカスを受け取る他のプログラム(インスタントメッセンジャープログラムなど)の性質です。

Wordにフォーカスがある場合(つまり、VBEを開いてを押すことができない場合F5)、このコードでうまくいくはずです。

Sub UpdateEmbeddedXLSX()
Dim workbook As InlineShape
    For Each workbook In ActiveDocument.InlineShapes
        With workbook
            If .Type = wdInlineShapeEmbeddedOLEObject Then
                ''# Excel.Sheet.12 for Excel 2007
                If .OLEFormat.ClassType = "Excel.Sheet.12" Then
                    ''# Open Object as spreadsheet
                    .OLEFormat.DoVerb wdOLEVerbPrimary
                    ''# If you want, you can also do any updates here like
                    .OLEFormat.Object.ActiveSheet.Cells(2, 2).Value = ".1"
                    ''# Nasty - but it works - SendKeys
                    SendKeys "{ESC}", True
                End If
            End If
        End With
    Next
End Sub

少なくとも、このコードをnormal.dotに配置し、それをQATに割り当てて、マクロとして実行することができます。

コードはExcelを開き、値を変更してから閉じることを回避しないことに注意してください。これは、埋め込みオブジェクトの使用の一部です。埋め込みの代わりにリンクを使用することは、これらすべてを行うためのはるかにスムーズな方法ですが、それが常にオプションであるとは限らないことを私は理解しています。

于 2011-03-25T07:03:07.167 に答える
1

私のように誰かがこれに出くわした場合に備えて、古い投稿に追加するだけです。

上記のコードはうまく機能しますが、SendKeys を使用する代わりにブックマークを使用するように変更しました。SendKeys ステートメントは、キーボードの NumLock を実際に混乱させます。そのコマンドの癖の 1 つにすぎません。

私がしたことは、Word Doc テンプレートにブックマークを作成することでした。次に、私のコードで、ブックマークへのポインターを作成しました。

Dim bMark as bookmark
Set bMark as ActiveDocument.Bookmarks("NameOfBookmark")

次に、SendKeys ステートメントの代わりに、次のことを行いました。

bMark.Range.Select
Selection.EndKey

これにより、基本的に、埋め込まれたワークシートからフォーカスが引き出され、ページのブックマークに移動しました。次に、.EndKey ステートメントは単に選択を削除しました。あなたは本当にそれを必要としません。

お役に立てれば!

于 2013-05-07T15:12:20.673 に答える