Excel VBA在字符串

时间:2017-12-04 17:14:14

标签: excel vba excel-vba formatting

我正在处理一个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试验了几个月,所以我的技能仍然相当有限。我怎样才能更好地编码,以便将所有红色和红色字符加粗?

2 个答案:

答案 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