Excel VBA 正则表达式:如果以三个空格开头,则将单元格格式设置为粗体



我正在尝试扫描"A"列并将粗体字体应用于以三个空格开头的所有单元格,然后继续使用任何其他字符。 如果单元格字符串以四个或更多空格字符开头;不应对其应用粗体字体。

这就是我到目前为止所拥有的;它导致A列的所有单元格都变得粗体。

Sub Macro1() 
Dim regEx As New RegExp
NumRows = Range("A2", Range("A2").End(xlDown)).Rows.Count
regEx.Pattern = "(s{3})(S)"
regEx.Global = False
Sheets("1022_CPU").Activate
Range("A2").Activate
Application.ScreenUpdating = False
Do Until IsEmpty(ActiveCell)
    If regEx.Test(ActiveCell.Value) Then
        ActiveCell.Font.Bold = True
    Else
        ActiveCell.Font.Bold = False
    End If
    ActiveCell.Offset(1, 0).Activate
Loop
Range("A1").Select
Application.ScreenUpdating = True
End Sub

编辑:示例数据:

   org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process()
    org.apache.coyote.http11.Http11Processor.process()
     org.apache.catalina.connector.CoyoteAdapter.service()
      org.apache.catalina.core.StandardEngineValve.invoke()

考虑到上述数据,我想在第一行应用粗体字体("org."前面有三个空格,但在其他三行不适用。 这就是为什么内置函数(如"LEFT"功能)不起作用的原因;因为它将在所有行上应用粗体字体。

它以三个空格开头,然后继续使用任何其他字符。

我认为这种正则表达式模式符合您的标准:

regEx.Pattern = "^s{3}.*$"

如果没有一些示例数据,很难判断 A 列中的所有单元格是否应该加粗。

顺便说一句,您不需要该If块:

If regEx.Test(ActiveCell.Value) Then
    ActiveCell.Font.Bold = True
Else
    ActiveCell.Font.Bold = False
End If

regEx.Test(ActiveCell.Value) 是布尔值,ActiveCell.Font.Bold 也是布尔值 - 因此您可以将其分配给regEx.Test调用的结果:

ActiveCell.Font.Bold = regEx.Test(ActiveCell.Value)

这不会解决您的问题,但肯定看起来更干净;)


也就是说,我认为你不需要VBA,更不需要正则表达式来做到这一点。尝试条件格式:选择列 A,然后使用公式确定格式=LEFT(A1,3)=" " ,并使其加粗。


考虑到提供的示例数据,您似乎分析/措辞错误地陈述了问题陈述:

它以三个空格开头,然后继续使用任何其他字符非空格字符

如果数据始终至少有 4 个字符长,我不明白为什么条件格式方法不起作用:

=AND(LEFT(A1,3)="   ",MID(A1,4,1)<>" ")

将粗体行,其中前 3 个字符是空格第 4 个字符不是空格。

如果你想避免正则表达式,试试这个: (它修剪删除所有前导和尾随空格的单元格。 如果 3 个空格的长度 + 3 与原始长度匹配,则单元格变为粗体)

Sub Macro1() 
Dim LastRow as Long
Dim CurRow As Long
Sheets("1022_CPU").Activate
LastRow = Range("A" & Rows.Count).End(xlUp).Row
Application.ScreenUpdating = False
For CurRow = 2 to LastRow
    If Len(Cells(CurRow, 1).Value) = Len(Trim(Cells(CurRow, 1).Value))+3
        Cells(CurRow, 1).Font.Bold = True
    Else
        Cells(CurRow, 1).Font.Bold = False
    End If
Next CurRow
Range("A1").Select
Application.ScreenUpdating = True
End Sub

相关内容

最新更新