文档中链接对象的文件路径的VBA列表

Bor*_*orn 5 excel vba ms-word excel-vba word-vba

我有许多大型Microsoft Word文档,其中包含许多Microsoft Excel电子表格中的许多链接文件.打开Word文档时,即使未选中"打开时更新链接文件"选项:

在此输入图像描述

Word仍会通过打开和关闭每个链接的相关Excel电子表格来检查其源头的每个链接(因此,对于x个链接,即使来自同一个电子表格,Word也会打开并关闭电子表格x次).这意味着打开文档需要很长时间.

我发现如果包含链接对象源的电子表格已经打开,文档打开得更快,因此Word不会保持打开,关闭,重新打开它们.

到目前为止,我所拥有的解决方案的开头是创建链接对象的所有文件路径的列表,通过以下VBA代码完成:

Sub TypeArray()

Dim List(), Path As String
Dim i, x As Integer
Dim s As InlineShape
Dim fso As FileSystemObject, ts As TextStream

Set fso = New FileSystemObject
Set ts = fso.OpenTextFile("C:\MyFolder\List.txt", 8, True)

With ts
    .WriteLine (ActiveDocument.InlineShapes.Count)
End With

For Each s In ActiveDocument.InlineShapes
        Path = s.LinkFormat.SourcePath & "\" _
        & s.LinkFormat.SourceName
        With ts
            .WriteLine (Path)
        End With
Next s
End Sub

'--------------------------------------------------------------------------------------
Private Sub WriteStringToFile(pFileName As String, pString As String)

    Dim intFileNum As Integer

    intFileNum = FreeFile

    Open pFileName For Append As intFileNum
    Print #intFileNum, pString
    Close intFileNum

End Sub
'--------------------------------------------------------------------------------------
Private Sub SendFileToNotePad(pFileName As String)

    Dim lngReturn As Long

    lngReturn = Shell("NOTEPAD.EXE " & pFileName, vbNormalFocus)

End Sub
Run Code Online (Sandbox Code Playgroud)

哪个效果很好,但只能文档已经打开才能使用,这会破坏其目的.

所以,最后,我的问题是这些:

1)打开Word文档并等待从源头检查每个链接的漫长过程之前,是否有办法运行此代码(或任何更好,更有效的代码 - 欢迎提出建议)?

2)有没有办法避免这一切,只是让Word 在打开文档时检查链接?

很抱歉这个问题很长,谢谢你的帮助!

ex-*_*man 1

如果我没记错的话,根据msdn应该有Document_Open事件。这实际上应该是一个打开之前的文档,并且应该在更新链接之前触发(至少在 Excel 中它是在计算之前触发的)。

尝试在文档打开时打开文件。然后你将面临另一个问题,什么时候关闭文件,但这是一件容易得多的事情。(可能是 document_close 事件...)

编辑:

正如评论所说,这已经太晚了。您可以创建一个单词开场白(作为单个应用程序或作为插件)。逻辑基本上是:

'1) on something_open run GetOpenFileName dialog
'2) before opening the real thing, open all files accompanied
'3) open the document itself
'4) close all files
'5) close the opener itself
Run Code Online (Sandbox Code Playgroud)

这不是最简单的方法,但我使用此逻辑来确保我的应用程序始终在 Excel 等的新副本中运行。但我知道这是一种解决方法,而不是解决方案。