我正在尝试扫描"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