Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba MS Word更新链接:为什么更改.LinkFormat属性会重置字段索引_Vba_Ms Word - Fatal编程技术网

Vba MS Word更新链接:为什么更改.LinkFormat属性会重置字段索引

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,因此

我希望我的第一篇帖子可以,不会冒犯别人(我已经试着按照指南做了很多搜索)

我已经修改了Greg Maxey()中的以下代码,将Word文档中的链接更新为Excel工作簿。它似乎是用于此目的的最常用的代码。我更改他的代码的原因是为了避免像I这样的计数器变量,并使用
将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技术人员讨论类似问题(如内容控件更新时发生的情况)时学到的东西。