在Excel中交替着色行组

时间:2008-08-25 22:11:31

标签: excel excel-vba vba

我有一个像这样的Excel电子表格

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

现在我想通过交替行的背景颜色

来对一个id的数据进行分组
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

任何人都可以帮我处理宏或一些VBA代码

由于

8 个答案:

答案 0 :(得分:38)

我使用此公式来获取条件格式的输入:

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

其中B列包含需要分组的项目,E是辅助列。每当上单元(在这种情况下为B1)与当前单元(B2)相同时,返回来自列E的上行内容。否则,它将返回1减去该内容(也就是说,outupt将为0或1,具体取决于上部单元格的值)。

enter image description here

enter image description here

enter image description here

答案 1 :(得分:4)

我认为这可以满足您的需求。当A列中的单元格更改值时,翻转颜色。运行直到B列中没有值。

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

答案 2 :(得分:2)

基于Jason Z的答案,我的测试似乎是错误的(至少在Excel 2010上),这里有一些恰好适合我的代码:

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

答案 3 :(得分:1)

你必须使用代码吗? 如果表是静态的,那么为什么不使用自动格式化功能?

enter image description here

如果您“合并”相同数据的单元格,它也可能会有所帮助。因此,如果将“数据,更多数据,甚至更多数据”的单元格合并到一个单元格中,您可以更轻松地处理经典的“每行是一行”的情况。

答案 4 :(得分:1)

我正在对此进行调整并尝试修改它以供我使用。我在列a中有订单号,有些订单需要多行。只想按订单号替换白色和灰色。我在这里交替每行。

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

答案 5 :(得分:0)

如果选择“格式”菜单项下的“条件格式”菜单选项,将为您提供一个对话框,允许您构建一些逻辑以应用于该单元格。

您的逻辑可能与上面的代码不同,它可能看起来更像:

细胞值是|等于| |和|白色....然后选择颜色。

您可以选择添加按钮,并根据需要调整条件。

答案 6 :(得分:0)

我根据可配置的列使用RGB值重写了Bartdude的答案,用于浅灰/白色。当值改变时,boolean var被翻转,这用于通过整数值True和False索引colors数组。在2010年为我工作。使用表格编号调用sub。

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

可选奖励:对于SQL数据,使用与SSMS中使用的黄色相同的任何NULL值着色

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

答案 7 :(得分:-1)

我在Excel中使用此规则来格式化交替的行:

  1. 突出显示要应用交替样式的行。
  2. 按&#34;条件格式&#34; - &GT;新规则
  3. 选择&#34;使用公式确定要格式化的单元格&#34; (最后一项)
  4. 以格式值输入规则: =MOD(ROW(),2)=0
  5. 按&#34;格式化&#34;,为交替的行制作所需的格式,例如。填充 - &gt;颜色。
  6. 按OK,按OK。
  7. 如果您希望格式化交替列,请使用 =MOD(COLUMN(),2)=0

    瞧!