Frage

Ich habe eine solche Excel-Tabelle

id | data for id
   | more data for id
id | data for id
id | data for id
   | more data for id
   | even more data for id
id | data for id
   | more data for id
id | data for id
id | data for id
   | more data for id

Jetzt möchte ich die Daten einer ID gruppieren, indem ich die Hintergrundfarbe der Zeilen abwechsele

var color = white
for each row
    if the first cell is not empty and color is white
        set color to green
    if the first cell is not empty and color is green
        set color to white
    set background of row to color

Kann mir jemand mit einem Makro oder VBA-Code helfen?

Danke

War es hilfreich?

Lösung

Ich denke, das erfüllt das, wonach Sie suchen.Ändert die Farbe, wenn die Zelle in Spalte A den Wert ändert.Wird ausgeführt, bis in Spalte B kein Wert mehr vorhanden ist.

Public Sub HighLightRows()
    Dim i As Integer
    i = 1
    Dim c As Integer
    c = 3       'red

    Do While (Cells(i, 2) <> "")
        If (Cells(i, 1) <> "") Then    'check for new ID
            If c = 3 Then
                c = 4   'green
            Else
                c = 3   'red
            End If
        End If

        Rows(Trim(Str(i)) + ":" + Trim(Str(i))).Interior.ColorIndex = c
        i = i + 1
    Loop
End Sub

Andere Tipps

Ich verwende diese Formel, um die Eingabe für eine bedingte Formatierung zu erhalten:

=IF(B2=B1,E1,1-E1))    [content of cell E2]

Dabei enthält Spalte B das Element, das gruppiert werden muss, und E ist eine Hilfsspalte.Jedes Mal, wenn die obere Zelle (in diesem Fall B1) mit der aktuellen Zelle (B2) übereinstimmt, wird der Inhalt der oberen Zeile aus Spalte E zurückgegeben.Andernfalls wird 1 minus diesem Inhalt zurückgegeben (d. h. das Ergebnis ist 0 oder 1, abhängig vom Wert der oberen Zelle).

enter image description here

enter image description here

enter image description here

Basierend auf der Antwort von Jason Z, die meinen Tests zufolge falsch zu sein scheint (zumindest unter Excel 2010), ist hier ein Code, der zufällig für mich funktioniert:

Public Sub HighLightRows()
    Dim i As Integer
    i = 2 'start at 2, cause there's nothing to compare the first row with
    Dim c As Integer
    c = 2       'Color 1. Check http://dmcritchie.mvps.org/excel/colors.htm for color indexes

    Do While (Cells(i, 1) <> "")
        If (Cells(i, 1) <> Cells(i - 1, 1)) Then 'check for different value in cell A (index=1)
            If c = 2 Then
                c = 34   'color 2
            Else
                c = 2   'color 1
            End If
        End If

        Rows(Trim(Str(i)) + ":" + Trim(Str(i))).Interior.ColorIndex = c
        i = i + 1
    Loop
End Sub

Muss man Code verwenden?Wenn die Tabelle statisch ist, warum nutzen Sie dann nicht die Funktion zur automatischen Formatierung?

enter image description here

Es kann auch hilfreich sein, wenn Sie Zellen derselben Daten „zusammenführen“.Wenn Sie also die Zellen von „Daten, mehr Daten, noch mehr Daten“ in einer Zelle zusammenführen, können Sie den klassischen Fall „Jede Zeile ist eine Zeile“ möglicherweise einfacher bewältigen.

Ich durchstöbere dies und habe versucht, es für meinen Gebrauch zu modifizieren.Ich habe Bestellnummern in Spalte a und einige Bestellungen nehmen mehrere Zeilen ein.Ich möchte nur Weiß und Grau je nach Bestellnummer abwechseln.Was ich hier habe, wechselt jede Zeile.

ChangeBackgroundColor() ' ChangeBackgroundColor Macro ' ' Keyboard Shortcut: Ctrl+Shift+B Dim a As Integer a = 1 Dim c As Integer c = 15 'gray Do While (Cells(a, 2) <> "") If (Cells(a, 1) <> "") Then 'check for new ID If c = 15 Then c = 2 'white Else c = 15 'gray End If End If Rows(Trim(Str(a)) + ":" + Trim(Str(a))).Interior.ColorIndex = c a = a + 1 Loop

End Sub

Wenn Sie unter dem Menüpunkt „Format“ die Menüoption „Bedingte Formatierung“ auswählen, wird ein Dialogfeld angezeigt, in dem Sie eine Logik erstellen können, die auf diese Zelle angewendet werden soll.

Ihre Logik ist möglicherweise nicht dieselbe wie Ihr Code oben, sie sieht möglicherweise eher so aus:

Zellwert ist | gleich | | und | Weiß ....Wählen Sie dann die Farbe.

Sie können auf die Schaltfläche „Hinzufügen“ klicken und die Bedingung so groß machen, wie Sie benötigen.

Ich habe Bartdudes Antwort für Hellgrau/Weiß basierend auf einer konfigurierbaren Spalte unter Verwendung von RGB-Werten überarbeitet.Eine boolesche Variable wird umgedreht, wenn sich der Wert ändert, und diese wird verwendet, um das Farbarray über die ganzzahligen Werte von True und False zu indizieren.Funktioniert bei mir ab 2010.Rufen Sie den Sub mit der Blattnummer an.

Public Sub HighLightRows(intSheet As Integer)
    Dim intRow As Integer: intRow = 2 ' start at 2, cause there's nothing to compare the first row with
    Dim intCol As Integer: intCol = 1 ' define the column with changing values
    Dim Colr1 As Boolean: Colr1 = True ' Will flip True/False; adding 2 gives 1 or 2
    Dim lngColors(2 + True To 2 + False) As Long   ' Indexes : 1 and 2
          ' True = -1, array index 1.    False = 0, array index 2.
    lngColors(2 + False) = RGB(235, 235, 235) ' lngColors(2) = light grey
    lngColors(2 + True) = RGB(255, 255, 255) '  lngColors(1) = white

    Do While (Sheets(intSheet).Cells(intRow, 1) <> "")
        'check for different value in intCol, flip the boolean if it's different
        If (Sheets(intSheet).Cells(intRow, intCol) <> Sheets(intSheet).Cells(intRow - 1, intCol)) Then Colr1 = Not Colr1
        Sheets(intSheet).Rows(intRow).Interior.Color = lngColors(2 + Colr1) ' one colour or the other
        ' Optional : retain borders (these no longer show through when interior colour is changed) by specifically setting them
        With Sheets(intSheet).Rows(intRow).Borders
            .LineStyle = xlContinuous
            .Weight = xlThin
            .Color = RGB(220, 220, 220)
        End With
        intRow = intRow + 1
    Loop
End Sub

Optionaler Bonus:Färben Sie für SQL-Daten alle NULL-Werte mit demselben Gelb wie in SSMS

Public Sub HighLightNULLs(intSheet As Integer)
    Dim intRow As Integer: intRow = 2 ' start at 2 to avoid the headings
    Dim intCol As Integer
    Dim lngColor As Long: lngColor = RGB(255, 255, 225) ' pale yellow

    For intRow = intRow To Sheets(intSheet).UsedRange.Rows.Count
        For intCol = 1 To Sheets(intSheet).UsedRange.Columns.Count
            If Sheets(intSheet).Cells(intRow, intCol) = "NULL" Then Sheets(intSheet).Cells(intRow, intCol).Interior.Color = lngColor
        Next intCol
    Next intRow
End Sub

Ich verwende diese Regel in Excel, um abwechselnde Zeilen zu formatieren:

  1. Markieren Sie die Zeilen, auf die Sie einen alternierenden Stil anwenden möchten.
  2. Klicken Sie auf „Bedingte Formatierung“ -> Neue Regel
  3. Wählen Sie „Eine Formel verwenden, um zu bestimmen, welche Zellen formatiert werden sollen“ (letzter Eintrag)
  4. Geben Sie die Regel im Formatwert ein: =MOD(ROW(),2)=0
  5. Klicken Sie auf „Formatieren“ und nehmen Sie die erforderliche Formatierung für abwechselnde Zeilen vor, z.Füllen -> Farbe.
  6. Drücken Sie OK, drücken Sie OK.

Wenn Sie stattdessen abwechselnde Spalten formatieren möchten, verwenden Sie =MOD(COLUMN(),2)=0

Voila!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top