如何在LINK字段中指定工作簿的相对路径?

How to specify the relative path to the workbook in the LINK field?

在对从 Excel 到 Word (2013) 的一系列单元格进行特殊粘贴 link 后,字段如下所示:

{ LINK Excel.Sheet.12 "D:\RelativePath\1\work\tmp.xlsx" Sheet1!NamedRange \a \p }

如果将源 (.xlsx) 和接收者 (.docx) 移动到 2 文件夹,则需要更改 LINK 字段中的 link,使其看起来像这样:

{ LINK Excel.Sheet.12 "D:\RelativePath\2\work\tmp.xlsx" Sheet1!NamedRange \a \p }

当这样的字段很多时,不方便

这两个我都试过了:

{ LINK Excel.Sheet.12 "...\...\work\tmp.xlsx" Sheet1!NamedRange \a \p }

还有那个:

{ LINK Excel.Sheet.12 "~\work\tmp.xlsx" Sheet1!NamedRange \a \p } 但没有任何效果。

这也不行:

How to create absolute hyperlinks and relative hyperlinks in Word documents

是否可以在LINK字段中指定不是绝对的,而是相对的源地址?

Upd @Cindy Meister 提出了一个解决方案,经过一些改进后代码工作正常。

他在这里:

Sub updateLINKs()
Dim doc As Word.Document
Dim fld As Word.Field
Dim sFilePath As String, sFileName As String
Set doc = ActiveDocument
sFilePath = doc.Path
For Each fld In doc.Fields
    If fld.Type = wdFieldLink Then
      If fld.Result.InlineShapes.Count > 0 And _
         InStr(fld.OLEFormat.ClassType, "Excel") And _
         fld.LinkFormat.SourcePath <> sFilePath Then
           sFileName = fld.LinkFormat.SourceName
           fld.LinkFormat.SourceFullName = sFilePath & "\" & sFileName
      End If
    End If
Next
End Sub

不能在LINK字段中指定相对路径。这将需要在 LINK 字段中嵌入另一个字段,但正如我之前所说,您不能使用 LINK 字段来做到这一点。您发布的 link 仅涉及 hyperlink 的 hyperlink 基数的设置,这也不会导致真正的相对 link.

LINK 字段的唯一解决方法是使用更新绝对路径的宏。

无法在 Link 字段中使用相对路径。字段代码中的路径需要是updated/changed。这可以通过使用 LinkFormat 属性.

提供的可能性以相当直接的方式完成

例如,假设相对路径与 Word 文档的路径相同,则以下代码:

  1. Document.Path属性
  2. 获取路径
  3. 循环文档中的所有字段并确定它们是否是来自显示 InlineShape(对象,而不是文本)的 Excel 源的 LINK 字段。这些字段以相反的顺序循环,因为更改路径会导致 Word 在后台删除并重新创建 LINK。这意味着从文档开头开始的循环将重复 "hit" 相同的字段,从而导致无限循环。
  4. 使用 LinkFormat.SourceName
  5. Link 字段确定链接对象的当前文件名
  6. 连接信息并将其分配给 LinkFormat.SourceFullName 属性

请注意 LinkFormat.SourcePathLinkFormat.SourceName 属性是只读的,因此只能使用 SourceFullName 更改路径。

Sub UpdateLinks()
    Dim doc As Word.Document
    Dim fld As Word.Field, nrFields As Long, i As Long
    Dim sFilePath As String, sFileName As String

    Set doc = ActiveDocument
    sFilePath = doc.path
    nrFields = doc.Fields.Count
    For i = nrFields To 1 Step -1
        Set fld = doc.Fields(i)
        If fld.Type = wdFieldLink Then
          If fld.result.InlineShapes.Count > 0 And _
             InStr(fld.OleFormat.ClassType, "Excel") Then
               sFileName = fld.LinkFormat.SourceName
               fld.LinkFormat.SourceFullName = sFilePath & "\" & sFileName
          End If
        End If
    Next
End Sub