使用Word宏来确定段落的最后一个字符

时间:2017-11-14 04:50:51

标签: vba ms-word word-vba

我一直在使用此代码对我的单词doc中的所有标题进行粗体加下划线:

Sub Underline_Headers()
Dim p As Paragraph
For Each p In ActiveDocument.Paragraphs
    If Len(p.Range.Text) < 70 Then
        p.Range.Font.Underline = True
        p.Range.Font.Bold = True
    End If
Next p
End Sub

这很有效 - 只要每个标题长度少于70个字符,并且其下面的段落是70个或更多字符。

但很多时候标题可以超过70个字符,标题下的段落可以少于70个字符。

然而,标题永远不会以任何标点符号结束,例如&#34;。&#34;但是他们下面的段落总是如此。

我正在尝试修复上面的代码,以查找未以&#34;结尾的所有段落。&#34;然后加粗 - 强调它们。换句话说,我想改变规则。

我尝试了唯一对我有意义的事情。代码没有破坏,但最终以粗体为下划线整个文档:

Sub Underline_Headers()
Dim p As Paragraph
For Each p In ActiveDocument.Paragraphs
    If Right(p.Range.Text,1) <> "." Then
        p.Range.Font.Underline = True
        p.Range.Font.Bold = True
    End If
Next p
End Sub

这应该会查找最后一个字符不是&#34;。&#34;的所有段落,如果有效,将隔离所有标题并且只加粗 - 加下划线,但显然不会工作

1 个答案:

答案 0 :(得分:1)

每个段落中的最后一个字符是回车符,Chr(13)。在此之前,文本结束了一个字符。下面的代码还考虑了某人用一个或多个空格结束段落文本的可能性。它接受“clean”字符串并查找可能异常字符串中的最后一个字符,例如.?!。您可以将此字符串缩减为单个句点,或将其扩展为包含更多用于例外的cnadidates。

Private Sub UnderlineTitles()

    Dim Para As Paragraph
    Dim Txt As String

    Application.ScreenUpdating = False
    For Each Para In ActiveDocument.Paragraphs
        Txt = Para.Range.Text
        Txt = RTrim(Left(Txt, Len(Txt) - 1))
        ' you can extend the list to include characters like ")]}"
        If InStr(".?!", Right(Txt, 1)) = 0 Then
            ' to choose a different style of underline, remove
            ' "= wdUnderlineSingle", type "=" and select from the dropdown
            Para.Range.Font.Underline = wdUnderlineSingle
        End If
    Next Para
    Application.ScreenUpdating = True
End Sub