检查整列的颜色

时间:2017-01-20 14:57:29

标签: excel vba

我试图创建一个检查B列颜色的if语句。

如果我在B栏中定位单个单元格而不是在我尝试时(" B:B"),它会起作用。

这就是我所拥有的。

Sub FOO()

    Dim answer As Range

    Set answer = Range("b:b")

    If answer.Interior.Color = vbRed Then

        MsgBox ("There is an issue with column B, please review.")

    End If

End Sub

4 个答案:

答案 0 :(得分:2)

由于我们获得了许多质量答案,因此这里是最优化的代码。最快,我打赌:)

如果您使用的是excel的古老版本之一,它将无法工作。 2007 +的任何事都没问题。

UPDATE DB2.paperworks
SET DB2.paperworks.contact_id = (
    SELECT MAX(DB1.contacts.code)
    FROM DB1.contacts
    WHERE DB2.paperworks.name = DB1.contacts.name
)

旧答案

Sub OptimizedFOO()

    Dim rngTemp

    With Application.FindFormat.Interior
        .Color = vbRed
    End With

    '/ Sheet1 is example sheet name
    Set rngTemp = Sheet1.Columns(2).Find(What:="", SearchFormat:=True)

    If Not rngTemp Is Nothing Then
          MsgBox ("There is an issue with column B, please review.")
    End If

End Sub

答案 1 :(得分:1)

我不确定,但请给我最好的猜测。

如果VB统一属性,则它统一列的所有单元格的属性。然后,您可以将该属性与值进行比较,如果所有的属性都具有相同的值,则该值将为True。否则比较将为False。

如果所有单元格都具有此值If answer.Interior.Color = vbRed,则vbRed将为True。如果要检查任何单元格是否具有该颜色,则可能需要遍历所有单元格。

我相信VB和VB对象模型的工作原理如下,但我不确定。

答案 2 :(得分:0)

我会在B列上找到最后使用的行,而不是循环遍历它们。

Sub FOO()

    Dim LR As Long, I As Long

    LR = findLastRow("Sheet1", "B")

    For I = 1 To LR
        If Range("B" & I).Interior.Color = vbRed Then

            MsgBox ("There is an issue with column B, please review.")
            Exit For

        End If
    Next I

End Sub

Function findLastRow(shtName As String, colLetter As String) As Long

    With Sheets(shtName)
        If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
            findLastRow = .Cells.Find(What:="*", _
                          After:=.Range(colLetter & "1"), _
                          Lookat:=xlPart, _
                          LookIn:=xlFormulas, _
                          SearchOrder:=xlByRows, _
                          SearchDirection:=xlPrevious, _
                          MatchCase:=False).Row
        Else
            findLastRow = 1
        End If
    End With

End Function

答案 3 :(得分:0)

您可以使用自动过滤器执行某些操作,例如

Function AnyRedCells(rngRangeToInspect As Excel.Range) As Boolean

Application.ScreenUpdating = False
rngRangeToInspect.AutoFilter
rngRangeToInspect.AutoFilter field:=1, Criteria1:=RGB(255, 0, 0), Operator:=xlFilterCellColor
'   Using >1 as assuming header on column
AnyRedCells = (ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Cells.Count > 1)
rngRangeToInspect.AutoFilter
Application.ScreenUpdating = True

End Function

像这样使用

Sub OptimizedFOO2()
    If AnyRedCells(Range("b23:b26")) Then
          MsgBox ("There is an issue with column B, please review.")
    End If
End Sub