2017-01-25 1 views
0

Ich verwende den unten gezeigten Code, um im Wesentlichen die erste Zeile der Kalkulationstabelle Farbe grau basierend darauf, ob die Zelle leer ist oder nicht. Zum Beispiel ist Zelle A1 nicht leer, also färbe sie grau, Zelle B1 ist nicht leer, also färbe sie Grau, aber Zelle C1 ist leer, also färbt sie überhaupt nicht. Bisher färbt mein Skript die ganze Reihe grau basierend auf A1. Gibt es dafür eine Alternative?VBA Farbe Zeilenzellen, wenn sie ungleich leer sind

Sub test() 
Dim c As Integer 
c = Application.WorksheetFunction.CountA(ActiveSheet.Range("A1")) 
If c > 0 Then 
    ActiveSheet.Range("A1").EntireRow.Interior.ColorIndex = 48 
End If 
End Sub 

Antwort

1

Wenn mit Excel-VBA arbeitet, ist es enorm hilfreich, um die Idee von Objects und Collections und wie zu erfassen, sie zu Schleife.

Das Watch-Fenster ist hier der beste Freund, genauso wie das Schlüsselwort With beim Schreiben von Code.

In Ihrem Fall: ein Cell ist ein Objekt innerhalb des Worksheet.Cells -collection (in Ihrem Fall auch ein Objekt im ActiveSheet.Rows(1).Cells -collection

Das tut, was Sie wollen, auf der Grundlage der Informationen, die Sie uns gegeben haben. (Sie didnt angeben, dass Sie nicht wollen, die ganze Reihe Schleife;))

Option Explicit 

Sub ColorCells() 
    Dim objCell As Object 
    With ActiveSheet 
     With .Rows(1) 
      For Each objCell In .Cells 
       With objCell 
        If .Value > 0 Then .Interior.ColorIndex = 48 
       End With 
      Next objCell 
     End With 
    End With 
End Sub 

Dies sollte Ihnen eine Idee geben, wie Excel- Objects Arbeit.

Natürlich können wir diese kürzer schreiben:

Sub ColorCells() 
    Dim objCell As Object 
    For Each objCell In ActiveSheet.Rows(1).Cells 
     If objCell.Value > 0 Then objCell.Interior.ColorIndex = 48 
    Next objCell 
End Sub 

Hinweis:

  • Dieser Code wird in Ihrem alle 16k Cells Schleife. Natürlich könnten wir bei Ihrem letzten gebrauchten Cell anhalten. Da dies jedoch in weniger als einer Sekunde ausgeführt wird, habe ich das bewusst weggelassen, um den Code sauber zu halten.

  • Während Sie dies mit bedingter Formatierung tun können, unterstütze ich die Idee, dies mit Code ONCE zu tun, ohne Spuren (das heißt, Ihre bedingten Formate), links.

  • Ich verstehe, was Sie versucht haben, mit .CountA und .EntireRow zu tun, dies funktioniert hier nicht.

+0

Vielen Dank für Ihre Antwort, ich bin zu VBA nur neu und es ist in meinem Kopf getan, funktioniert dies sehr gut. – Hosey93

+0

Ich bin froh, dass ich helfen konnte. Achten Sie darauf, die Frage als beantwortet zu markieren. Überlegen Sie auch, ob 'objCell.Value> 0 'wirklich das tut, was Sie brauchen, oder ob Sie etwas wie' IsEmpty 'brauchen. –

0

Sie könnten auch so etwas mit einer Formel tun. Sie könnten die Funktion ändern, um mehr Logik und Farben zu behandeln.

Dies wird die Zeile grün färben, wenn der Ausdruck wahr ist. Sie geben die Farbe als RGB an.

=ColorRowIF(A1=B1, 1, 181, 0)

Oder in Ihrem Fall

=ColorRowIF(ISBLANK(B2), 1, 181, 0)

Public Function ColorRowIF(Condition As Boolean, r As Integer, g As Integer, b As Integer) As String 
    Dim row As Integer 
    row = Application.Caller.row 

    If Condition = True Then 
     ActiveSheet.Evaluate "ColorRow(" & row & ", " & r & ", " & g & ", " & b & ")" 
    Else 
     'ws.Rows(r).Interior.Color = vbRed 
    End If 

    ColorRowIF = Condition 
End Function 


Public Sub ColorRow(row As Integer, r As Integer, g As Integer, b As Integer) 

    Dim ws As Worksheet 
    Set ws = ActiveSheet 
    ws.Rows(row).Interior.Color = RGB(r, g, b) 

End Sub 


Function IsDate(CellDate As Date) As Boolean 
    If CellDate >= 1 And CellDate <= #12/31/2199# Then 
    ' 1 is equal to January 1, 1900 
     IsDate = True 
    Else 
     IsDate = False 
     End If 
End Function 
Verwandte Themen