Vba MS Word更新链接:为什么更改.LinkFormat属性会重置字段索引
我希望我的第一篇帖子可以,不会冒犯别人(我已经试着按照指南做了很多搜索) 我已经修改了Greg Maxey()中的以下代码,将Word文档中的链接更新为Excel工作簿。它似乎是用于此目的的最常用的代码。我更改他的代码的原因是为了避免像I这样的计数器变量,并使用Vba MS Word更新链接:为什么更改.LinkFormat属性会重置字段索引,vba,ms-word,Vba,Ms Word,我希望我的第一篇帖子可以,不会冒犯别人(我已经试着按照指南做了很多搜索) 我已经修改了Greg Maxey()中的以下代码,将Word文档中的链接更新为Excel工作簿。它似乎是用于此目的的最常用的代码。我更改他的代码的原因是为了避免像I这样的计数器变量,并使用将I=1转换为.Fields.Count,然后。。。下一步是结构 当我按原样运行它时,它陷入了一个循环中,只更新Word文档中的第一个字段。为了查看这一点,我输入了Debug.Print wrdField.Index行。它重复输出1,因此
将I=1转换为.Fields.Count,然后。。。下一步是结构
当我按原样运行它时,它陷入了一个循环中,只更新Word文档中的第一个字段。为了查看这一点,我输入了Debug.Print wrdField.Index
行。它重复输出1,因此它不会像我预期的那样移动到下一个wrdField
(代码实际上只是使用了下一个
,但如果我使用下一个wrdField
,结果是相同的)
当我注释掉.AutoUpdate=False
时,它工作正常:
Public Sub UpdateExternalLinksToCurrentFolder()
Dim wrdDocument As Word.Document
Dim wrdField As Word.Field
Dim strCurrentLinkedWorkbookPath, strNewLinkedWorkbookPath As String
Dim strCurrentLinkedWorkbookName, strNewLinkedWorkbookName As String
Dim strCurrentLinkedWorkbookFullName, strNewLinkedWorkbookFullName As String
Dim strThisDocumentPath As String
'On Error GoTo ErrorHandler_UpdateExternalLinksToCurrentFolder
Application.ScreenUpdating = False
Set wrdDocument = ActiveDocument
strThisDocumentPath = wrdDocument.Path & Application.PathSeparator
strNewLinkedWorkbookPath = strThisDocumentPath
With wrdDocument
For Each wrdField In .Fields
With wrdField
If .Type = wdFieldLink Then
With .LinkFormat
Debug.Print wrdField.Index
strCurrentLinkedWorkbookPath = .SourcePath & Application.PathSeparator
strCurrentLinkedWorkbookName = .SourceName
strNewLinkedWorkbookName = strCurrentLinkedWorkbookName
strNewLinkedWorkbookFullName = strNewLinkedWorkbookPath & strNewLinkedWorkbookName
.AutoUpdate = False
End With
.Code.Text = VBA.Replace(.Code.Text, Replace(strCurrentLinkedWorkbookPath, "\", "\\"), Replace(strNewLinkedWorkbookPath, "\", "\\"))
End If
End With
Next
End With
Set wrdDocument = Nothing
Application.ScreenUpdating = True
Exit Sub
有人能告诉我为什么会这样吗?当我设置
.AutoUpdate=False
时,我是在更改链接字段的某些内容,还是在对Word文档执行某些操作,从而导致.wrdField.Index重置为1?我在网上找不到任何记录这种行为的东西,这让我抓狂。在幕后,发生的是Word重新创建了内容和字段。删除原始链接内容并插入新内容。因此,这基本上破坏了场并重新创建了场。用户不会注意到这一点,但VBA会注意到
当处理使用索引且循环项被删除的循环情况时,通常会向后循环(从文档末尾到开头)。这是每个人都做不到的。谢谢辛迪,这很有道理。是否仅在特定情况下发生(例如更改.AutoUpdate属性)?仅仅使用
.Fields.Update
或Replace(.code.Text…
似乎没有同样的效果。我真的不知道,在@Punter的细节。这正是我多年来与MS技术人员讨论类似问题(如内容控件更新时发生的情况)时学到的东西。