根据列中的多个值设置行格式

时间:2018-06-19 11:59:42

标签: vba conditional-formatting

我是VBA的新手,大多数时候,我要么在这里找到代码,要么记录一个宏,然后根据需要进行更改。这次我找不到合适的代码来更改,因此需要您的帮助。

假设我有一个如下表;

      A       B      C
   Account  Name  Surname
 1   111      AA    BB
 2   111      AA    BB
 3   111      AA    BB
 4   222      CC    DD
 5   333      EE    FF
 6   333      EE    FF

如果“帐户”列包含相同的值,我想用不同的颜色(即2种颜色,如表格格式)填充整行。例如,此处的第1-2-3行将为红色,第4行将为绿色,第5-6行将再次为红色。当宏到达最后一个单元格时,它将停止。

我试图修改条件格式代码,但是我无法对其进行管理。通常,它们会根据某些条件处理列中的单元格。

任何帮助将不胜感激。

非常感谢!

3 个答案:

答案 0 :(得分:1)

这也可以在不使用VBA的情况下完成。

我们可以通过使用RANKMOD来标识“备用组”,因为条件格式可以与仅返回TRUE / FALSE的任何公式一起使用,因此我们可以偷偷摸摸。

使用示例数据(为适应标题而调整的行号除外):

image


说明:

  1. 选择A2:C2;将填充颜色设置为浅红色。 然后仍选择A2:C2:
  2. 主页(功能区菜单)> 条件格式> 新规则…
  3. 选择使用公式来确定要格式化的单元格
  4. 选择设置此值为true的单元格的格式,然后输入公式:
    =MOD(RANK($A2,$A:$A,1),2)=1
  5. 点击 Format > 填充(标签)>浅绿色> 确定> 确定
  6. Ctrl + C 复制(仍在A2:C2上)
  7. 选择A2:C7特殊粘贴> 格式

答案 1 :(得分:0)

条件格式仍然是解决问题的方法。

我必须指出,您的着色逻辑(“相对于行A中previos单元的颜色行”)不适用于第一行,因此必须失败。

如果您绝对需要使用VBA,这是您要遵循的逻辑路径:

  1. 将A列设置为范围
  2. 对于此范围内的每个单元格,请将其与上一个单元格进行比较(同样,第1行在此无效)
  3. 根据此比较为行着色

如果您需要编码方面的帮助,请使用到目前为止的尝试来更新您的问题。

答案 2 :(得分:0)

您似乎只需要一个简单的If-Then语句。尝试遵循以下代码的操作:

Sub ColorCode()

Dim thisAccount, lastAccount As String
Dim NumRows, colorValue As Integer
Dim isFirstRow As Boolean

NumRows = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
lastAccount = ""
isFirstRow = True

With Sheets("Sheet1")
    For i = 1 To NumRows
        thisAccount = .Range("A" & i).Value
        If isFirstRow = False Then
            If thisAccount <> lastAccount Then
                If .Range("A" & i - 1).Interior.ColorIndex = 3
                    .Range("A" & i).EntireRow.Interior.ColorIndex = 4
                Else
                    .Range("A" & i).EntireRow.Interior.ColorIndex = 3
                End If
            Else
                colorValue = .Range("A" & i - 1).Interior.ColorIndex
                .Range("A" & i).EntireRow.Interior.ColorIndex = colorValue
            End If
        Else
            .Range("A" & i).EntireRow.Interior.ColorIndex = 3
        End If
        lastAccount = .Range("A" & i).Value
        isFirstRow = False
    Next
End With

End Sub

与上一个答案相反,这应该通过使用初始If语句询问它是否为第一行来说明第一行,并且由于我们稍后更改了它的值,因此它将运行的唯一时间是第一行

简单地说,我遍历数据中的总行数,询问其帐号是否与上一个帐号相同,如果是,则对它们进行相同的颜色编码,如果不是,我用不同的颜色标记它们。我只是自己用一些编造的数据运行了它,似乎运行完美。

祝您编程愉快,下一次尝试提出一个更具体的代码问题!