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

Posted

技术标签:

【中文标题】如果范围没有填充颜色,则显示错误【英文标题】:Display error if range does not have fill color 【发布时间】:2019-11-11 19:20:09 【问题描述】:

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

我有一个错误处理程序,它会在出错时发送电子邮件:

    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,但随着它的变化,我将它设置到最后一行。

我的意思是MsgBox 1 / 0,所以逻辑不起作用

目前的问题是它一直在报错。即使没有填充颜色的单元格。什么可能是错的?

【问题讨论】:

错误是什么? .ColorIndex = xlNone 会告诉您单元格是否有阴影,但这仅在单个单元格上才真正可靠 ThisWorkbook.Worksheets("Main").Range("L2").End(xlDown).Row) 返回一行,因此您最终会得到类似 .Range("A2" & <some number> 的内容,而您将需要 .Range("A2:L" & <some number> 【参考方案1】:

要查找最后一行,请参阅This

正如@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

或者

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).DisplayFormat.Interior.ColorIndex = xlColorIndexNone Then
            MsgBox "There is no color"
        Else
            MsgBox "There is color"
        End If
    End With
End Sub

【讨论】:

关于xlNonexlColorIndexNone 的重点是——两者都是命名常量,都具有-4142 的值,因此从逻辑上讲,使用其中一个没有区别。 (也就是说,xlColorIndexNoneExcel.XlColorIndex 的成员,所以它是上下文“正确”的使用)。 有趣的是:Tim 关于 .ColorIndex = xlNone 仅在单个单元格上真正可靠的观点涉及这样一个事实,即只有当范围具有相同的颜色(可能是 xlNone / xlColorIndexNone)。如果范围内有多个颜色,则返回Null。 (这就是你的无循环代码有效的原因)【参考方案2】:

VBA 中很少有 Null 的东西——这些都是来自数据库服务器的查询结果。因此,IsNull() 将始终为 false。 (Null values for variables in VBA)

如果您在空工作表上尝试以下代码,它将显示如何检查带有Range("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

【讨论】:

填充白色!= 无填充 @chrisneilsen - 我错过了你的观点。如果我打开一个新的 Excel 并在即时窗口中写 ?activecell.Interior.Color = 256 ^ 3 - 1,它会给出 true。 虽然你说的是真的,但它没有抓住重点。 OP 正在寻找要设置为无填充的单元格。您的测试不区分无填充和填充白色。你需要 ColorIndex 来做到这一点。

以上是关于如果范围没有填充颜色,则显示错误的主要内容,如果未能解决你的问题,请参考以下文章

替换 JSFL 中的填充颜色

css有没有办法让background填充两种颜色啊?

Excel VBA:自动填充动态范围错误

dreamweaver cs3中,若给网页同时指定了背景图像和背景颜色,优先显示哪一个?

Excel使用VLOOKUP函数填充后有的单元格会出现 #N/A 这个符号,是怎么回事?

通过将活动单元格的范围提供给列的最后一行来显示自动填充命令范围中的错误