Excel 如果范围没有填充颜色,则显示错误

Excel 如果范围没有填充颜色,则显示错误,excel,vba,Excel,Vba,我试图创建一个代码来检查单元格的填充颜色。如果没有颜色,代码应继续前进。如果有填充颜色,则代码应给出一个错误 我有一个错误处理程序,它正在发送关于错误的电子邮件: On Error GoTo ErrorHandlerColor ErrorHandlerColor: 这是我的密码: With ThisWorkbook.Worksheets("Main").Range("A2" & ThisWorkbook.Worksheets("Main").Range("L2").End(x

我试图创建一个代码来检查单元格的填充颜色。如果没有颜色,代码应继续前进。如果有填充颜色,则代码应给出一个错误

我有一个错误处理程序,它正在发送关于错误的电子邮件:

    On Error GoTo ErrorHandlerColor

ErrorHandlerColor:
这是我的密码:

With ThisWorkbook.Worksheets("Main").Range("A2" & ThisWorkbook.Worksheets("Main").Range("L2").End(xlDown).Row)
    If IsNull(.DisplayFormat.Interior.ColorIndex) Then
    Else
      MsgBox 1 / 0
      Exit Sub

          End If
    End With
我的范围实际上是某个
A2:L1343
,但随着它的变化,我将其设置到最后一行

我所说的错误是指
msgbox1/0
,因此逻辑不起作用


目前的问题是,它总是给出一个错误。即使没有填充颜色的单元格。可能有什么问题

VBA中很少有东西是Null——这些都是来自数据库服务器的查询结果。因此,
IsNull()。()

如果在空工作表上尝试以下代码,它将显示如何检查具有
范围(“A1”)的单元格中是否存在无颜色。Interior.ColorIndex=xlColorIndexNone

Sub TestMe()

    With Worksheets(1).Range("A1")
        'True, because it is w/o color
        Debug.Print CBool(.Interior.ColorIndex = xlColorIndexNone)
        'always False
        Debug.Print IsNull(.Interior.Color)
        'changing interior to red
        .Interior.Color = vbRed
        'False, because it is red
        Debug.Print CBool(.Interior.ColorIndex = xlColorIndexNone)
         'always False
        Debug.Print IsNull(.Interior.Color)
    End With

End Sub

VBA中很少有Null——这些都是来自数据库服务器的查询结果。因此,
IsNull()。()

如果在空工作表上尝试以下代码,它将显示如何检查具有
范围(“A1”)的单元格中是否存在无颜色。Interior.ColorIndex=xlColorIndexNone

Sub TestMe()

    With Worksheets(1).Range("A1")
        'True, because it is w/o color
        Debug.Print CBool(.Interior.ColorIndex = xlColorIndexNone)
        'always False
        Debug.Print IsNull(.Interior.Color)
        'changing interior to red
        .Interior.Color = vbRed
        'False, because it is red
        Debug.Print CBool(.Interior.ColorIndex = xlColorIndexNone)
         'always False
        Debug.Print IsNull(.Interior.Color)
    End With

End Sub

要查找最后一行,请参见


正如@TimWilliams所提到的,
.ColorIndex=xlNone
仅在单个单元上是真正可靠的。因此,请使用
.ColorIndex=xlColorIndexNone
。这就是你想要的吗这不需要循环

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim lRow As Long

    Set ws = ThisWorkbook.Worksheets("Main")

    With ws
        lRow = .Range("L" & .Rows.Count).End(xlUp).Row

        If .Range("A2:L" & lRow).Interior.ColorIndex = xlColorIndexNone Then
            MsgBox "There is no color"
        Else
            MsgBox "There is color"
        End If
    End With
End Sub


要查找最后一行,请参见


正如@TimWilliams所提到的,
.ColorIndex=xlNone
仅在单个单元上是真正可靠的。因此,请使用
.ColorIndex=xlColorIndexNone
。这就是你想要的吗这不需要循环

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim lRow As Long

    Set ws = ThisWorkbook.Worksheets("Main")

    With ws
        lRow = .Range("L" & .Rows.Count).End(xlUp).Row

        If .Range("A2:L" & lRow).Interior.ColorIndex = xlColorIndexNone Then
            MsgBox "There is no color"
        Else
            MsgBox "There is color"
        End If
    End With
End Sub


错误是什么?
.ColorIndex=xlNone
会告诉您单元格是否有阴影,但这仅在单个单元格上才是真正可靠的
此工作簿。工作表(“Main”).Range(“L2”).End(xlDown.Row)
返回一行,因此您会得到类似
.Range(“A2”&
,而您需要
.Range(“A2:L”&
发生了什么错误?
.ColorIndex=xlNone
会告诉您单元格是否有阴影,但这仅在单个单元格上才是真正可靠的
此工作簿。工作表(“Main”).Range(“L2”).End(xlDown).Row
返回一行,因此您会得到类似于
范围(“A2”)和
的内容,而您需要
范围(“A2:L”&
填充白色!=否fill@chrisneilsen-我没有领会你的意思。如果我打开一个新的Excel并在即时窗口中写入
?activecell.Interior.Color=256^3-1
,它会给出true。虽然你说的是true,但它没有领会你的意思。OP正在寻找设置为不填充的单元格。你的测试没有区分不填充和填充led为白色。您需要使用颜色索引来执行此操作。填充为白色!=否fill@chrisneilsen-我没有领会你的意思。如果我打开一个新的Excel并在即时窗口中写入
?activecell.Interior.Color=256^3-1
,它会给出true。虽然你说的是true,但它没有领会你的意思。OP正在寻找设置为不填充的单元格。你的测试没有不要区分无填充和填充白色。要做到这一点,您需要ColorIndex。这是关于
xlNone
vs
xlColorIndexNone
-两者都是命名常量,都有值-4142,因此从逻辑上讲,使用其中一个或另一个没有区别。(也就是说,
xlColorIndexNone
Excel.XlColorIndex
的成员,因此它是上下文上“正确”的一个)。值得注意的是:Tim关于
.ColorIndex=xlNone
的观点仅在单个单元格上是可靠的,因为只有当范围内的所有单元格都具有相同的颜色(可能是xlNone/xlColorIndexNone)时,它才会返回颜色值。如果范围内有多个颜色,它将返回
Null
。(这就是无循环代码工作的原因)关于
xlNone
xlColorIndexNone
的重点-两者都是命名常量,都有-4142的值,因此从逻辑上讲,使用其中一个或另一个没有区别。(也就是说,
xlColorIndexNone
Excel.XlColorIndex
的成员,因此它是上下文索引“正确”一个使用)。有趣的是:Tim关于
.ColorIndex=xlNone
的观点仅在单个单元格上是真正可靠的,这与以下事实有关:只有当范围内的所有单元格都具有相同的颜色(可能是xlNone/xlColorIndexNone)时,它才会返回颜色值。如果范围中有多个颜色,则返回
Null
(这就是无循环代码工作的原因)