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