ChemistrySir 2019-02-28 12:24 采纳率: 50%
浏览 996
已采纳

word vba的查找通配符该如何写呢?

想实现题号的标注,就像这样的方式,通过搜索每一行的开头,如果满足“数字+.”的形式,就把它标红 。

For i = 1 To 10000 'ActiveDocument.Paragraphs.Count
        If i = daan_d Then
            MsgBox "发现最大题号为:" & UBound(r)
            Exit For
        End If
        Set a = ActiveDocument.Paragraphs(i).Range
        If Not a.Information(12) Then
            Debug.Print a.Text
            a.SetRange a.Start, a.Start + 3
            a.Select
            With a.Find
                .ClearFormatting
                .MatchByte = False
                .Forward = True
                .Wrap = wdFindStop
                .Text = "[0-9]{1,2}[..]"
                .MatchWildcards = True
                .Execute
                If .Found = True Then
                    a.Select
                    a.Font.Fill.ForeColor = vbRed
                    Set a = Nothing
                End If
        '       MsgBox UBound(r)
            End With
        End If        
    Next

通过查找,希望这样呈现结果。
希望这样呈现

可是,每次就会出现这样的情况。

图片说明

从第一题到第九题,都可以正确查找到。到第十题就会出现问题,她会把表格中的数字和标点 查找到。

不知道问题出在哪里了?

  • 写回答

2条回答 默认 最新

  • VBA-守候 2021-11-29 19:13
    关注

    代码稍作了修改,除了第10段匹配不到,其他没问题。不知是不是其他什么问题

    Sub 通配符查找改变颜色()
        For i = 1 To ActiveDocument.Paragraphs.Count
            If i = daan_d Then
                MsgBox "发现最大题号为:" & UBound(r)
                Exit For
            End If
            Dim aRng As Range
            Set aRng = ActiveDocument.Paragraphs(i).Range
            If Not aRng.Information(12) Then
                Debug.Print aRng.Text
                aRng.SetRange aRng.Start, aRng.Start + 3
                aRng.Select
                With aRng.Find
                    .ClearFormatting
                    .MatchByte = False
                    .Forward = True
                    .Wrap = wdFindStop
                    .Text = "<[0-9]{1,2}[..]"
                    .MatchWildcards = True
                    .Execute
                    If .Found = True Then
                        aRng.Select
                        Selection.Font.Fill.ForeColor = vbRed
                        Set aRng = Nothing
                    End If
            '       MsgBox UBound(r)
                End With
            End If
        Next
    End Sub
    

    执行结果

    img

    在这里提供一个其他方法,遍历段落,正则进行字符串比较:

    
    
    
    ```vb.net
    Sub 遍历段落_正则匹配字符串_改颜色()
        Dim pa As Paragraph, Re As Object, paStr As String
        Set Re = CreateObject("vbscript.regexp")    '创建正则对象,外部创建
        With Re
            .Pattern = "\d+?\." '匹配模式
            .Global = False     '最多匹配1End With
        Dim paText As String, Result, Results, myCap
        For Each pa In ActiveDocument.Paragraphs
            paText = Trim(pa.Range.Text)
            If Not Left(paText, 1) Like "[0-9]" Then GoTo 1 '如果段落不以数字开头,就判断下一段
            Set Results = Re.Execute(paText)    '执行正则匹配
            If Results.Count > 0 Then           '匹配结果数量大于0才执行then下面代码
                Set Result = Results(0)
                Debug.Print Result.firstindex, Result.Length    'Result.firstindex为匹配项的开头的索引,Result.Length为结果的字符串长度
                'Debug.Print ActiveDocument.Range(Result.firstindex, Result.firstindex + Result.Length).Text
                pa.Range.Select                 '选中段落
                With Selection
                    .Collapse 1                 '光标定位到段落开头
                    .MoveRight wdCharacter, Result.Length, wdExtend '从光标位置(段落开头)扩展选区,长度为匹配到的字符串长度(Result.Length.Font.Fill.ForeColor = vbRed
                End With
            End If
            Set Results = Nothing
    1:  Next
        Set Re = Nothing
    End Sub
    执行结果
    

    img

    有VBA/办公自动化问题,欢迎联系我,大家可以一起交流!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 请详细说明问题背景 12月15日
  • 已采纳回答 5月12日

悬赏问题

  • ¥100 求用matlab求解上述微分方程的程序代码
  • ¥15 请问各位,如何在Jetson nano主控板的Ubuntu系统中安装PyQt5
  • ¥15 MAC安装佳能LBP2900驱动的网盘提取码
  • ¥400 微信停车小程序谁懂的来
  • ¥15 ATAC测序到底用什么peak文件做Diffbind差异分析
  • ¥15 安装ubantu过程中第一个vfat 文件挂载失败
  • ¥20 GZ::CTF如何兼容一些靶机?
  • ¥15 etcd集群部署问题
  • ¥20 谁可以帮我一下问一下各位
  • ¥15 为何重叠加权后love图的SMD与svyCreateTableOne函数绘制基线表的不一致