如何根据输入为单元格着色?找到了一个代码,但不了解“如何”

时间:2019-06-24 13:22:21

标签: excel vba

我需要根据该单元格中的内容为单元格着色。

  • 硬编码数字:蓝色
  • 另一个工作表参考:绿色
  • 公式:黑色
Sub mcrFinancial_Color_Codes()
    Dim rng As Range
    Dim rErr As Range

    On Error Resume Next
    For Each rng In Intersect(ActiveSheet.UsedRange, Selection)
        If rng.HasFormula Then
            Set rErr = Range(Mid(rng.Formula, 2, Len(rng.Formula) - 1)) 'Somehow sees if formula references another sheet???
            If CBool(Err) Then
                rng.Font.ColorIndex = 1 'black
            Else
                rng.Font.ColorIndex = 10 'green
            End If
            Err = 0
        ElseIf CBool(rng.Value) Then
            rng.Font.ColorIndex = 5 'blue
        Else
            rng.Font.ColorIndex = xlAutomatic 'default
        End If
    Next rng
    Set rErr = Nothing
End Sub

我找到了这段代码,但在If rng.HasFormula

之后我不明白

1)Set rErr的作用是什么,它如何通过包含感叹号(!)的单元格引用来区分公式。

2)rErr是一个变量,但除Err外没有实际引用。 r代表什么吗?

3)If CBool(Err)。对于Err,这将以某种方式返回true,并将其标记为黑色,否则将其标记为绿色。它是如何从Err获取布尔值的?

1 个答案:

答案 0 :(得分:1)

此过程通过错误处理起作用

Mid(rng.Formula, 2, Len(rng.Formula) - 1)

此部分从单元格中的公式中提取地址,例如,如果您有公式=Sheet1!$A$1,它将检索Sheet1!$A$1,这是范围地址。

Set rErr = Range(Mid(rng.Formula, 2, Len(rng.Formula) - 1))

在这里,我们使用检索的地址设置范围。通常,如果地址无效,VBA编辑器将引发错误,但是使用On Error Resume Next(可用于禁用错误处理例程),我们有意忽略此错误,并且过程不会停止。

Err Object包含有关运行时错误的信息。 Err的默认属性是.Number,它指定运行时错误。如果没有发生错误(在这种情况下,地址是有效的)Err.Number = 0Err = 0,否则它大于零。

CBool(Err)

CBool是类型转换功能。它将0转换为FALSE,并将其他任何数字转换为TRUE。如果发生错误,则该数字将大于0 => CBool(Err) = True

r中的

rErr最有可能代表Range,但这只是猜测。


您仍然可以尝试这样的操作,尽管它仍然很笨拙:

Sub mcrFinancial_Color_Codes()

    Dim LoopCell As Range
    Dim Checker As Range

    For Each LoopCell In Intersect(ActiveSheet.UsedRange, Selection)
        With LoopCell
            Select Case True
                Case .HasFormula
                    On Error Resume Next
                    Set Checker = Range(Mid(rng.Formula, 2, Len(rng.Formula) - 1))
                    On Error GoTo 0
                    If Checker Is Nothing Then
                        .Font.ColorIndex = 1
                    Else
                        .Font.ColorIndex = 10
                    End If

                Case .Value <> 0
                    .Font.ColorIndex = 5

                Case Else
                    .Font.ColorIndex = xlAutomatic
            End Select
        End With
    Next LoopCell

End Sub