【问题标题】:VBA for MS Word not looping through all sentences in a paragraphMS Word 的 VBA 没有遍历段落中的所有句子
【发布时间】:2013-05-21 20:49:53
【问题描述】:

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

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

当我遍历段落.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

【问题讨论】:

    标签: vba ms-word text-segmentation


    【解决方案1】:

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

    使用 while...wend 和增量计数器对循环进行简单的改造,您可以使用它们的索引来引用这些项目。

    【讨论】:

    • 感谢您的回答。我注意到与“#”字符类似的东西,但大多数文本字符都可以。有点好奇为什么会这样。让我重写我的循环,看看我能不能让它工作。
    • 我很快就找到了关于转义序列的任何注释,但是有很多不相关的搜索结果。
    【解决方案2】:

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

    '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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多