我有一个循环,用于将文本填充到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
为什么第一个循环无法正常工作的任何想法?
答案 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...