2

アクティブなブックで動作する Excel 用の COM アドインがありますが、ほとんどの場合は機能しますが、特定のシナリオで問題が発生します。

[挿入] -> [グラフ] を使用して作成した Word 2010 ドキュメントにグラフがある場合、[グラフ ツール] -> [デザイン] -> [データの編集] をクリックすると、グラフのデータを含むブックが開きます。私のアドインは、(ほとんど) そのブックで動作します。

ただし、アドインはブックが保存されているフォルダーを認識する必要があり、このシナリオでは、含まれているドキュメント(Word ドキュメントまたは PowerPoint プレゼンテーション) が保存されているフォルダーを使用したいと考えています。しかし、コンテナー ドキュメントに関する情報を取得する方法が見つかりません。実際、扱っているブックがドキュメントに埋め込まれていることを確認する方法さえ見つかりませ

コンテナ ドキュメントにアクセスできる方法はありますか?

4

2 に答える 2

1

これをもう一度試してみましょう...

別のアドイン (XLAM の例を示します) を作成するか、COM アドインをこれに変更するか、この新しいアドインが確実に実行されるようにすることができます。このアドインは、アプリケーション レベルのApp_WorkbookActivateイベントをトラップし、新しいブック名をチェックして、Microsoft Word からのものである可能性があるかどうかを確認します。

ワークブックがこの基準を満たしている場合、それがイベントをトリガーしているため、MS WordApp_WorkbookActivateの現在のものがコンテナーであると想定するのはかなり安全と思われます。ActiveDocument

次に、いくつかのオブジェクト変数を設定して をキャプチャし、 、 it's 、および it'sWord.Applicationを取得するだけで、これらの値を Excel ワークブック内の名前付き変数に格納できます。 ActiveDocument.Path.Name

Namesマネージャーでそれらを表示するか、名前.Names("docPath")を参照してプログラムからアクセスすることができます.Names("docName").

コンテナー .DOC パスと名前を含む名前付き変数

これを XLAM ファイルの標準モジュールに入れます。

Sub Auto_Open()
    Application.Run "ThisWorkbook.Workbook_Open" 'just in case
End Sub

次のコードはThisWorkbook、XLAM ファイルのモジュールに入ります。

Option Explicit
Private WithEvents App As Application
Dim dictWorkbooks As Object
Private Sub Workbook_Open()
    '## Instantiate the public variables for this Add-in:
    Set App = Application
    Set dictWorkbooks = CreateObject("Scripting.Dictionary")
End Sub

Private Sub App_WorkbookActivate(ByVal Wb As Workbook)
    '## Attempt to determine if a Workbook is opened from MS Word,
    '   and if so, store the container document's path & name in
    '   named variable/range in the Workbook.
    Dim wdApp As Object
    Dim wdDoc As Object
    Dim docPath As String
    Dim docName As String
    Dim w As Integer

    If Wb.Name Like "Chart in Microsoft Word" Then
        'Get out of here if we already have this workbook activated.
        If dictWorkbooks.Exists(Wb.Name) Then Exit Sub
        Set wdApp = GetObject(, "Word.Application")
        Set wdDoc = wdApp.ActiveDocument
        docPath = wdDoc.Path
        docName = wdDoc.Name
        dictWorkbooks.Add Wb.Name, docName

        With Wb
            On Error Resume Next
            .Names("docPath").Delete
            .Names("docName").Delete
            On Error GoTo 0
            .Names.Add Name:="docPath", RefersToR1C1:=docPath
            .Names("docPath").Comment = "A variable stores the parent DOC file's path"
            .Names.Add Name:="docName", RefersToR1C1:=docName
            .Names("docName").Comment = "A variable stores the parent DOC file's name"
        End With
    End If

End Sub
Private Sub App_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
    '## If you open multiple charts from the word document, without closing the Workbook
    ' they will be assigned unique names. However, if you open & close multiple Workbook
    ' they will all have the same name "Chart in Microsoft Word".  This method will
    ' remove an existing Key from our Dictionary when a workbook is closed, in order to
    ' prevent false matches.
    If dictWorkbooks.Exists(Wb.Name) Then _
        dictWorkbooks.Remove Wb.Name
End Sub
于 2013-06-14T16:24:42.663 に答える