Excel 检查整列的颜色
我试图创建一个if语句来检查B列的颜色 如果我以B列中的单个单元格为目标,而不是在尝试(“B:B”)时,它就可以工作 这就是我所拥有的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.")
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,今天是我的第一天。