我正在处理一个Excel宏,它将遍历单元格并将每个已格式化为红色的文本中的所有文本加粗。每个单元格都包含一个自动黑色文本字符串,但突出显示为红色的关键字除外。我只是希望这些红色关键字也加粗。
我现在设置它的方式,它单独遍历每个字符,虽然不是最快的,但对于我的目的来说很好,因为它一次只能在几个单元格上运行。 我最初把它编码为:
Sub redTxtBold2()
Dim i As Integer
For Each currentCell In Selection
SearchString = currentCell.Value
If IsNull(currentCell.Font.ColorIndex) Then
For i = 1 To Len(SearchString)
If currentCell.Characters(i, 1).Font.ColorIndex = 3 Then
currentCell.Characters(i, 1).Font.Bold = True
End If
Next i
End If
Next currentCell
End Sub
我遇到的问题是,虽然它对大多数单元格工作正常,但如果单元格中的第一个字符为红色,则会加粗该字符并删除单元格其余部分中的红色文本格式。找出它为什么这样做并阻止它将是最好的解决方案,但我想出了一个解决方法:
Sub redTxtBold1()
Dim i, tstart As Integer
Dim redTxt As String
Dim BoldText As String
For Each currentCell In Selection
SearchString = currentCell.Value
If IsNull(currentCell.Font.ColorIndex) Then
For i = 1 To Len(SearchString)
If currentCell.Characters(i, 1).Font.ColorIndex = 3 Then
redTxt = redTxt & currentCell.Characters(i, 1).Text
Debug.Print redTxt
End If
Next i
End If
tstart = InStr(currentCell.Text, redTxt)
Debug.Print tstart
currentCell.Characters(tstart, Len(redTxt)).Font.Bold = True
redTxt = ""
Next currentCell
End Sub
现在问题在于,如果字符串包含多个间隔开的红色关键字,则redTxt会将它们收集并合并在一起,从而导致InStr找不到子字符串。因此,粗体为Len(redTxt)的前几个字符加粗,无论哪个都是红色。
我现在只用VBA试验了几个月,所以我的技能仍然相当有限。我怎样才能更好地编码,以便将所有红色和红色字符加粗?
答案 0 :(得分:0)
这可能是一个长期存在的问题,例如见here。这种解决方法,即使它不太优雅,也应该解决它。
Sub redTxtBold2()
Dim i As Integer, currentCell As Range, SearchString As String, b As Boolean
For Each currentCell In Selection
SearchString = currentCell.Value
If IsNull(currentCell.Font.ColorIndex) Then
For i = 2 To Len(SearchString)
If currentCell.Characters(i, 1).Font.ColorIndex = 3 Then
currentCell.Characters(i, 1).Font.Bold = True
End If
Next i
End If
If currentCell.Characters(1, 1).Font.ColorIndex = 3 Then
currentCell.Characters(1, 1).Font.Bold = True
End If
Next currentCell
End Sub
答案 1 :(得分:0)
我无法解释原因。但是这里有一个似乎适合你引用的案例的解决方法。
Option Explicit
Sub redTxtBold2()
Dim i As Integer
Dim currentCell As Range
Dim SearchString As String
Dim Col As Collection, V As Variant
For Each currentCell In Selection
SearchString = currentCell.Value
If IsNull(currentCell.Font.ColorIndex) Then
Set Col = New Collection
For i = 1 To Len(SearchString)
If currentCell.Characters(i, 1).Font.ColorIndex = 3 Then _
Col.Add i
Next i
With currentCell
For Each V In Col
.Characters(V, 1).Font.Bold = True
.Characters(V, 1).Font.ColorIndex = 3
Next V
End With
End If
Next currentCell
End Sub