如何在简单的vba字符串替换中检测编号

时间:2019-05-29 12:32:30

标签: vba ms-word

我正在尝试替换编号(Word的1.,2等)。用简单的字符串替换搜索,但似乎找不到数字。

这是针对Word 365的,我在那里使用VB编辑器。

Sub ayaya()
Documents.Open FileName:=ActiveDocument.Path + "\Doc1.docm"
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
    .Text = "SSS"
    .Replacement.Text = "PPP"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
With Selection
    If .Find.Forward = True Then
        .Collapse Direction:=wdCollapseStart
    Else
        .Collapse Direction:=wdCollapseEnd
    End If
    .Find.Execute Replace:=wdReplaceAll
End With

End Sub

我的word文档如下:

SSS
SSS
1.  SSS 

然后转到

PPP
PPP
1.  PPP

但是当我将搜索替换为

的任何变体时
With Selection.Find
    .Text = "1. SSS"

找不到文字。

2 个答案:

答案 0 :(得分:3)

您找不到与段落文本关联的数字,因为它最有可能是ListLevelNumber,并且这些数字是由ListFormat样式自动生成的。换句话说,它们不是使用“搜索”可以找到的物理文本的一部分,至少不是您当前在代码中对其进行设置的方式。

需要使用单独的Search来查找正在使用的ListParagraph样式,然后如果要这样做,则需要一些其他代码来操纵ListLevelNumber。

下面是示例代码,该代码确定给定段落上的ListLevelNumber,然后根据实际级别进行一些操作:

Sub IsSelectionListParagraph()
    Dim i As Integer
    If Selection.Range.ListParagraphs.Count > 0 Then
        For i = 1 To Selection.Range.ListParagraphs.Count
            Select Case Selection.Range.ListParagraphs(i).Range.ListFormat.ListLevelNumber
                Case Is = 1
                    Debug.Print Selection.Range.Text
                Case Is = 2
                    Debug.Print Selection.Range.Text
                Case Else
                    Debug.Print Selection.Range.Text
            End Select
        Next
    End If
End Sub

答案 1 :(得分:-1)

编号是ListParagraphs对象,无法像纯文本一样进行搜索。