【问题标题】:How to specify the relative path to the workbook in the LINK field?如何在 LINK 字段中指定工作簿的相对路径?
【发布时间】:2018-12-30 07:13:14
【问题描述】:

在将一系列单元格从 Excel 粘贴到 Word (2013) 后,该字段如下所示:

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

如果您将源 (.xlsx) 和接收器 (.docx) 移动到 2 文件夹,则需要更改 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字段中指定不是绝对的,而是相对的源地址?

更新 @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

【问题讨论】:

    标签: excel ms-word word-field


    【解决方案1】:

    不能在Link 字段中使用相对路径。需要在字段代码中更新/更改路径。这可以通过使用LinkFormat 属性提供的可能性以相当直接的方式完成。

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

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

    【讨论】:

    • 感谢您为我打开 .SourceFullName,解释只读的 .SourcePath 和 .SourceName,否则我将使用替换搜索。我有一个编译器发誓如果没有 Then,所以添加了 Then。也将 "> 1" 替换为 "> 0",因为用户可以在只添加一个 LINK 时移动文件。在这种情况下,会发生无限循环。也许,有必要使用的不是“>”,而是 ForEach?
    • AndIf 添加了额外的检查 - Then 不属于第一行的末尾。但是_ 需要将If 扩展到第二行——也许你把它漏掉了。是的,&gt;0 实际上是正确的(对不起!)此代码只是一个示例,以提供一个起点。这并不是最终的解决方案,因为我们无法确切地知道您需要如何使用它。有些部分你可能不需要,有些东西你可能还需要。主要目的是展示什么是可能的,以便您可以集成/扩展它 - 而不是为您提供最终解决方案。
    • 这是screenshot。编译器发誓上线If fld.Type = wdFieldLink,想要Then。添加Then 后会出现无限循环。
    • 啊,那里。您所做的编辑在And 之后的下一行。是的,当然需要Then 在该行中 - 我很抱歉。我已经更正了这个例子。
    • 新年快乐!是的,现在Then 一切都很好,但无休止的循环仍然存在。这是很自然的,因为代码不会检查 LINK 是否已更改。我认为我们需要再添加一个变量 - newPath 和另一个 If。只有oldPath不等于newPath才会启动后续的操作链,否则退出。
    【解决方案2】:

    不能在 LINK 字段中指定相对路径。这需要在 LINK 字段中嵌入另一个字段,但正如我之前所说,您不能使用 LINK 字段来执行此操作。您发布的链接仅涉及超链接的超链接基础设置,这也不会产生真正的相对链接。

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

    【讨论】:

    • 谢谢,但很遗憾。目前尚不清楚为什么开发人员没有预见到这一刻。好的,然后是VBA。我看到这样的算法: a) 读取 ThisWorkbook 的路径。 b) 阅读名称 ThisWorkbook。 c) 构造一个新的完整路径(路径 + 名称) d) 在第三和第四个空格之间读取文本。 e) 循环替换链接。有什么不明显的障碍吗? Word 中是否有类似 ThisWorkbook 的内容?
    • 对于在 Word 中实现相对路径的宏,请查看附加到:msofficeforums.com/word/…forums.windowssecrets.com/showthread.php/… 的宏。请注意,宏对所有外部链接采用相同的方法,即使线程描述了 INCLUDETEXT 字段等的其他方法。
    • 谢谢。您的代码使用替换搜索。在我看来, .SourceFullName 效率更高,代码更短。但主要的是代码应该解决问题。如果替换搜索解决了,那很好。我还不能测试它,因为下载需要注册。你能把适合这个任务的代码放在这里吗?
    • 我的代码使用了一种替换方法,因为它不仅仅是假设新文件夹与代码运行所在的文件夹相同(即,所需的文件夹可能是不同的文件夹,但始终是相对的位置到当前位置)。我不建议“调整”代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多