为每个循环迭代书签集合

Iterate bookmarks collection in for each loop

我在将文本填充到 MS Word 文档书签中的循环中遇到了这个问题。似乎循环每次都在重新启动,永远不会到达 'next' 书签。

这是代码(我使用.StartsWith的原因是我有几个书签需要用相同的文本填充):

For Each bm As Word.Bookmark In oDoc.Bookmarks
    Select Case True
        Case bm.Name.StartsWith("A")
            Call UpdateBookmarks(oDoc, bm.Name, TextA)
        Case bm.Name.StartsWith("B")
            Call UpdateBookmarks(oDoc, bm.Name, TextB)
        Case bm.Name.StartsWith("C")
            Call UpdateBookmarks(oDoc, bm.Name, TextC)
            'etc...
    End Select
Next

如前所述,循环在集合中的第一个 bm 上不断重新启动。如果我这样做:

For Each bm As Word.Bookmark In oDoc.Bookmarks
    MsgBox(bm.Name)                    
Next

循环正常工作(我得到了所有书签的书签名称)。被调用的子看起来像这样:

Public Sub UpdateBookmarks(ByVal Doc As Microsoft.Office.Interop.Word.Document, ByVal BookmarkName As String, ByVal Text As String)
    Dim BMrange As Word.Range = Doc.Application.ActiveDocument.Bookmarks(BookmarkName).Range
    BMrange.Text = Text
    Doc.Application.ActiveDocument.Bookmarks.Add(Name:=BookmarkName, Range:=BMrange)
End Sub

知道为什么第一个循环无法正常工作吗?

我从来没有玩过单词、文档、书签等东西,但据我了解,书签是一个可枚举的集合,由其成员在循环中修改它可能会导致问题。简单来说,就是尝试遍历索引,例如

For intI As Integer = oDoc.Bookmarks.Count - 1 To 0 Step -1
    Dim stName As String = ""
    stName = oDoc.Bookmarks(intI).Name
    Select Case stName.Substring(0, 1)
        Case "A"
            Call UpdateBookmarks(oDoc, stName, TextA)
        Case "B"
            Call UpdateBookmarks(oDoc, stName, TextB)
        Case "C"
            Call UpdateBookmarks(oDoc, stName, TextC)
            'etc...
    End Select
Next

我以相反的顺序迭代了循环,这样删除集合中的任何项目都不会导致任何异常,例如Index out of...