为每个循环迭代书签集合

时间:2015-10-20 12:02:56

标签: vb.net collections foreach ms-word bookmarks

我有一个循环,用于将文本填充到MS Word文档中的书签中。似乎循环每次都会重新启动,并且永远不会进入“下一个”书签。

以下是代码(我使用.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

如上所述,循环继续在Collection中的第一个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

为什么第一个循环无法正常工作的任何想法?

1 个答案:

答案 0 :(得分:1)

我从来没有玩过单词,文档,书签等东西,但根据我的理解,书签是一个可枚举的集合,并且它的成员在循环中修改它可能会导致问题。简单来说,只需尝试迭代索引,例如

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...