MS Word的VBA不循环遍历段落中的所有句子

时间:2013-05-21 20:49:54

标签: vba ms-word word-vba text-segmentation

我试图遍历Word文档中的所有句子并将它们解析为半HTML代码。在测试期间,我遇到了一个有趣的情况,其中任何句子后跟一个非封闭的句子都会被跳过。例如,如果我有以下两句话:

  

这是带有特殊字符的段落中的第一句话   应该还有一句话。这是第二句话   应该在那里。**

当我遍历paragraph.range.sentences中的每个句子时,我只得到第一句和段落末尾的“。**”。但是,如果我在句点和astriks之间添加一个空格,那么代码就会工作“。**”。

如果宏读取句子中的所有文本,即使句点之后没有空格,我该如何确保?我的示例代码如下:

Public Sub ParseDoc()
Dim paras As Paragraphs
Dim para As Paragraph
Dim sents As Sentences
Dim sent As Range


    Set paras = ActiveDocument.Paragraphs
    For Each para In paras
        Set sents = para.Range.Sentences
        For Each sent In sents
            MsgBox (sent.Text)
        Next
    Next
End Sub

2 个答案:

答案 0 :(得分:1)

第一个星号似乎有问题。将第一个星号更改为其他任何内容,此代码按照您的希望运行。我不知道这是否是一种特殊行为,但是如果你引用ActiveDocument.Paragraphs(1).Range.Sentences(2).text,那么句子的全文就像你期望的那样。

使用while ... wend和incremental计数器对循环进行简单的重新处理,您可以使用它们的索引来引用项目。

答案 1 :(得分:0)

我无法弄清楚如何以“words.special_character”的格式“读取”句子中的所有字符,但我意识到如果我替换了Word文档中的所有句点+ special_character实例,那么我的所有每个循环都有效。我在子模块的最开始使用了以下代码,一切都按预期工作:

'Adds a <SPACE> between a period and a non-alphanumeric character
With ActiveDocument.Range.Find
    .Text = ".([!0-9A-z ])"
    .Replacement.Text = ". \1"
    .MatchWildcards = True
    .Execute Replace:=wdReplaceAll
End With