2017-01-20 7 views
2

Ich versuche, eine if-Anweisung zu erstellen, die die Farbe der Spalte B prüftüberprüfen Farbe der gesamten Spalte

Es funktioniert, wenn ich eine einzelne Zelle in Spalte B zielen nicht auf, wenn ich versuche („B: B“).

Das ist was ich habe.

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 
+0

man kann nicht sagen, dass, wenn Sie die ganze Spalte Überprüfung rot ist. Betrachten Sie FOR-Schleifen, sowohl für die nächste als auch für jede. Das wird helfen. –

+0

Danke, nur die Sache ist, ich habe noch nicht gelernt, wie man Schleifen macht, der Excel-Typ in der Arbeit ging und ich wurde damit beauftragt, VB lol zu lernen. – Hosey93

+0

Sie werden die ganze Zeit Schleifen verwenden, also schauen Sie sich alle an. Währenddessen ... usw. –

Antwort

2

Da wir viele qualitativ hochwertige Antworten erhalten, ist hier der am besten optimierte Code. Schnellste, ich wette :)

Es wird nicht funktionieren, wenn Sie eine der alten Versionen von Excel verwenden. alles 2007+ ist in Ordnung.

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 

Alte Antwort

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 
+1

Das funktioniert jetzt groß, sie ist eine Legende! ich habe VB zu lernen, während bei der Arbeit hier und heute mein erster Tag. – Hosey93

1

Ich bin nicht sicher, aber geben Sie meine beste Vermutung.

Wenn VB die Eigenschaften vereint, dann vereint es die Eigenschaften aller Zellen der Spalte. Sie können dann die Eigenschaft mit einem Wert vergleichen, und dies ist True, wenn alle Prozesse denselben (gleichen) Wert haben. Andernfalls wird der Vergleich falsch sein.

So If answer.Interior.Color = vbRed wird wahr sein, wenn alle Zellen vbRed dieses propety Wert haben. Wenn Sie überprüfen möchten, ob der Zellen diese Farbe haben, müssen Sie möglicherweise über alle Zellen iterieren.

ich VB und VB-Objektmodell arbeiten wie diese glauben, aber auch hier bin ich nicht sicher.

0

Ich würde letzte Zeile in Spalte B finden und als Schleife durch sie.

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 
+0

würde nicht, 'Worksheets (shtName) .Range (colLetter & Arbeitsblätter (shtName) .Rows.Count) .End (xlUp) .Row' für findLastRow genügen? –

+0

Wenn für Wert Searching, warum nicht für die Farbe suchen selbst. Killshot. :) – cyboashu

+0

@Nathan_Sav, ich vermeide es, die letzte Zeile auf diese Weise zu finden.Kontrolliere [diese] (http://Stackoverflow.com/a/11169920/1652222) Antwort für weitere Details .. – ManishChristian

0

Sie könnten etwas tun, mit dem Autofilter, so etwas wie diese

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 

Gebraucht wie so

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