0

我正在编写一个 vba 宏来逐行搜索 word 文档并尝试在文档中查找某些名称。循环工作正常,除了当它到达文档末尾时,它只是从顶部继续并重新开始。这是代码:

Application.ScreenUpdating = False
 Dim i As Integer, Rng As Range
 With ActiveDocument.Range
   With .Find
     .ClearFormatting
     .Replacement.ClearFormatting
     .Text = "?"
     .Replacement.Text = ""
     .Forward = True
     .Wrap = wdFindStop
     .Format = False
     .MatchWildcards = True
     .Execute
   End With
   Do While .Find.found
     i = i + 1
     Set Rng = .Duplicate
     Set Rng = Rng.GoTo(What:=wdGoToBookmark, Name:="\line")
     MsgBox "Line " & i & vbTab & Rng.Text
     If Rng.Bookmarks.Exists("\EndOfDoc") Then Exit Do
     .start = Rng.End
     .Collapse wdCollapseEnd
     .Find.Execute
   Loop
 End With
 Set Rng = Nothing
 Application.ScreenUpdating = True

我也试过这段代码:

Dim appWD As Word.Application
 Dim docWD As Word.Document
 Dim rngWD As Word.Range
 Dim strDoc As String
 Dim intVal As Integer
 Dim strLine As String
 Dim bolEOF As Boolean

bolEOF = False

' Set strDoc here to include the full
 ' file path and file name

On Error Resume Next
 Set appWD = GetObject(, "Word.Application")
 If Err.Number <> 0 Then
 Set appWD = CreateObject("Word.Application")
 End If
 Err.Clear
 On Error GoTo 0

strDoc = "c:\KenGraves\Project2\output\master.doc"
Set docWD = appWD.Documents.Open(strDoc)
 appWD.Visible = True

docWD.Characters(1).Select

Do
 appWD.Selection.MoveEnd Unit:=wdLine, Count:=1
 strLine = appWD.Selection.Text
 Debug.Print strLine
 intVal = LineContainsDescendant(strLine)
 If intVal = 1 Then
    MsgBox strLine
 End If
 appWD.Selection.Collapse wdCollapseEnd

If appWD.Selection.Bookmarks.Exists("\EndOfDoc") Then bolEOF = True
 Loop Until bolEOF = True

两者似乎都无法识别书签(“\EndOfDoc”)。哪一个开始工作并不重要。我的文档是否可能不包含此书签?

4

2 回答 2

0

不是非常优雅,但是对第一个过程的一行的更改似乎会在适当的时候停止它。我相信如果你想引用它们,你实际上必须在你的文档中插入书签。它们不是自动生成的。

     If i >= ActiveDocument.BuiltInProperties("NUMBER OF LINES") Then Exit Do

干杯,LC

于 2013-06-14T02:16:31.257 回答
0

除非您有损坏的文档,否则所有 Word 文档都应该有\EndOfDoc书签。您可以简单地使用ActiveDocument.Range.Bookmarks("\EndOfDoc").Exists. 如果没有,那么您需要提供有关 Word 版本的更多详细信息,并在可能的情况下通过 Dropbox 等提供示例文档。

我不确定你为什么要循环到 Word 文档的开头,当我运行代码时它工作正常。但是,如果我在文档末尾添加脚注,它会陷入死循环,根据您的文档,您可能会遇到类似这样的其他情况,即您的代码无法处理文档设置。

我建议稍微修改一下您检查文档结尾的方式,以使您的代码更加健壮。我仍然会使用书签“\EndOfDoc”,但是我会根据您当前的搜索范围检查范围的限制。

因此,在代码的顶部声明一个范围变量并将其设置为文档末尾的范围,例如:

Dim rEnd As Range
Set rEnd = ActiveDocument.Bookmarks("\EndOfDoc").Range

然后在你的循环中,而不是这一行:

If Rng.Bookmarks.Exists("\EndOfDoc") Then Exit Do

使用这一行:

If Rng.End >= rEnd.End Then Exit Do
于 2013-06-14T03:42:17.793 回答