Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 检查整列的颜色_Excel_Vba - Fatal编程技术网

Excel 检查整列的颜色

Excel 检查整列的颜色,excel,vba,Excel,Vba,我试图创建一个if语句来检查B列的颜色 如果我以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.")

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

如果我以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

由于我们得到了许多高质量的答案,下面是最优化的代码。最快的,我打赌:)

如果您使用的是excel的一个古老版本,它将不起作用。任何2007+都可以

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

旧答案

Sub FOO()

    Dim answer As Range
    Dim cell   As Range

    '/ This will show message if at least one cell is found with red color

    Set answer = Range("b:b")
    For Each cell In answer.Cells

        If answer.Interior.Color = vbRed Then

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

        End If
    Next

End Sub

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

如果VB统一属性,则它将统一列中所有单元格的属性。然后,您可以将该属性与一个值进行比较,如果所有rhe项目都具有该(相同)值,则该值为真。否则,比较将是错误的

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


我相信VB和VB对象模型是这样工作的,但我也不确定。

我会在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
Sub-FOO()
暗淡的LR一样长,我一样长
LR=findLastRow(“表1”、“B”)
对于I=1至LR
如果范围(“B”&I).Interior.Color=vbRed,则
MsgBox(“B列有问题,请查看”)
退出
如果结束
接下来我
端接头
函数findLastRow(shtName作为字符串,colLetter作为字符串)的长度
带图纸(shtName)
如果Application.WorksheetFunction.CountA(.Cells)为0,则
findLastRow=.Cells.Find(What:=“*”_
之后:=.范围(夹头和“1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
其他的
findLastRow=1
如果结束
以
端函数

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

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

你不能这么说,除非你检查整列都是红色的。查看是否存在循环,包括下一个循环和每个循环。这会有帮助的。谢谢,唯一的事情是我还没有学会如何做循环,工作中的excel人员离开了,我的任务是学习VB lol。你会一直使用循环,所以看看它们都在做什么。while..wend等。另外,不要使用B:B,因为它太大,使用一个定义的范围,即使它是整个范围。范围(“b1:b100”)感谢您的帮助,我一直在尝试让它在我定义的范围内循环,但您是对的,如果B列中的另一个单元格是不同的颜色,则消息框不会出现。不会出现,
Worksheets(shtName)。范围(colleter&Worksheets(shtName)。Rows.Count)。End(xlUp).Row
findLastRow就足够了?如果搜索值,为什么不搜索颜色本身。Killshot.:@Nathan_Sav,我避免以这种方式找到最后一行。查看答案了解更多详细信息。@cyboashu这不是一个坏主意。我发现您已经“优化”了“你的回答。”nps,这就是为什么我使用工作表的最后一个单元格,而不是范围,然后使用up而不是down.:)这是伟大的工作现在,你是一个传奇!我必须在这里工作的时候学习VB,今天是我的第一天。