实例需求:A列中有不确定行数的数据,现在需要将数据按照每4位一组间隔标记颜色,如下图所示。
示例代码如下。
Sub Demo()
Dim rngCell As Range
Dim rngData As Range
Dim i, res, intLen
Set rngData = Range("A1").CurrentRegion
rngData.Font.ColorIndex = 0
For Each rngCell In rngData
Debug.Print "==" & rngCell.Address & "=="
Debug.Print "LenOfDigits", "StartPos", "LenRedChar"
res = Len(Trim(rngCell)) Mod 8
For i = Len(rngCell) - 8 To -3 Step -8
If (i <= 0) And (res > 4) Then
intLen = res - 4
Else
intLen = 4
End If
rngCell.Characters(i + 1, intLen).Font.Color = vbRed
Debug.Print Len(rngCell), i + 1, intLen
Next i
Next rngCell
End Sub
【代码解析】
第11行代码获取A1单元格开始的数据区域。
第12行代码设置设置单元格字体颜色为默认黑色。
第13行代码循环变量数据单元格。
第14~15行代码输出标题行,便于大家理解代码的执行过程。
第16行代码使用Trim
去掉单元格内容中的前导和尾随空格,Len
获取字符长度,Mod
为取余数运算符。
第17~25行代码循环标记字符颜色。
第18~22行代码根据不同情况为变量intLen赋值,其中变量intLen为设置颜色的字符长度。
第23行代码设置字符字体颜色为红色。
第24行代码输出单元格字符长度,起始位置和设置颜色的字符长度。
代码逻辑并不复杂,其核心是如何获取起始位置和设置颜色的字符长度,运行代码【立即窗口】中输入结果如下。大家可以在VBE使用“逐语句”执行功能单步调试来进一步理解代码的执行过程。
==$A$1==
LenOfDigits StartPos LenRedChar
==$A$2==
LenOfDigits StartPos LenRedChar
5 -2 1
==$A$3==
LenOfDigits StartPos LenRedChar
10 3 4
==$A$4==
LenOfDigits StartPos LenRedChar
14 7 4
14 -1 2
==$A$5==
LenOfDigits StartPos LenRedChar
18 11 4
18 3 4
==$A$6==
LenOfDigits StartPos LenRedChar
21 14 4
21 6 4
21 -2 1
==$A$7==
LenOfDigits StartPos LenRedChar
24 17 4
24 9 4
24 1 4
==$A$8==
LenOfDigits StartPos LenRedChar
26 19 4
26 3 4
26 11 4