【问题标题】:How to alternate row color in a table when cell value changes?如何在单元格值更改时交替表格中的行颜色?
【发布时间】:2022-12-25 20:42:33
【问题描述】:

我有一个通过 Power Query 引入数据表的电子表格。
每次刷新,表的长度都可能改变。

当值与上一行不同时,我需要 C 列和 D 列交替突出显示颜色。

每次通过 Power Query 刷新表格和运行 VBA 代码时表格的外观。

【问题讨论】:

  • 我会将条件格式设置为 shade alternating rows,因为这可能比将该代码添加到 VBA 更容易。
  • @PeterT:您的链接正在每隔一行格式化,而不是按照 OP 的要求查找值
  • 我尝试使用条件格式,但每次更新表格时都会弄乱引用并破坏条件格式中的公式。
  • 只是出于好奇:这个条件格式是什么样子的?也许您可以将其添加到您的问题中并说明失败的原因。
  • 我根据行值创建了一个包含 1 和 0 的辅助列。每次更新表时,它都会引入新数据并更改表中的行数(有时比上一次导入的行数少或多)。当发生这种情况时,无论我是否锁定公式中的引用单元格,公式都会根据之前导入的表格停止的位置跳转。

标签: excel vba formatting excel-tables


【解决方案1】:

(1)尝试条件格式:
(注意:只有当值不能出现在该列表的后面时,这才会正常工作)。

基于公式创建一个规则(或两个规则,准确地说)。根据您的屏幕截图,我假设您的数据从第 3 行开始并且您想查看 C 列。
有一个相当简单的公式可用于计算列表中唯一值的数量。基本公式是从ExcelJet“借来”的,是=SUMPRODUCT(1/COUNTIF(data,data))。现在的诀窍是使用C$3:C3 范围查看从列表开头到实际行的范围。如果向下复制公式,起始行将保留,而结束行将更改。现在简单地在公式周围放一个IsOdd resp IsEven

因此,“绿色”行的公式为 =ISODD(SUMPRODUCT(1/COUNTIF(C$3:C3,C$3:C3))),黄色行的公式为 =ISEVEN(SUMPRODUCT(1/COUNTIF(C$3:C3,C$3:C3)))。将规则应用到范围=$C$3:$C$1048576

但是,我不知道这种条件格式是否会在查询更新后“存活下来”。

(2)使用 VBA 格式化很简单。以下代码格式化表格的一列(VBA 中的表格是ListObject 类型。将列表对象和列号作为参数传递:

Sub ColorRows(table As ListObject, columnNumber As Long)
    Dim cell As Range, isOdd As Boolean
    For Each cell In table.DataBodyRange.Columns(columnNumber).Cells
        With cell
            If .Offset(-1, 0) <> .Value Then isOdd = Not isOdd
            ' On a standard Office color scheme, 10 is kind of green and 8 is a dirty yellow
            .Interior.ThemeColor = IIf(isOdd, 10, 8)
            .Interior.TintAndShade = 0.8
        End With
    Next
End Sub

这就是调用的样子(根据您的需要调整工作表和 listObject):

Sub test()
    ColorRows ThisWorkbook.Sheets(1).ListObjects(1), 3
End Sub

现在自动调用此代码是另一回事,不幸的是相当复杂 - 如果您想要/需要,请尝试https://stackoverflow.com/search?q=vba+QueryTable+After+Refresh 以获得一些见解。一个简单的替代方法是手动触发格式化,例如通过在您的工作表上放置一个调用代码的按钮(或形状)。

【讨论】:

  • 太感谢了!我得到了工作代码。我在哪里可以找到如何更改突出显示颜色的列表?我还有几个需要不同颜色的选项卡需要执行此操作。
  • 最简单的方法是用你想要的颜色填充工作表上的单元格,而不是使用 vba 编辑器中的即时窗口:?selection.interior.color 这将为你提供要使用的颜色代码
  • 添加 Ike 所写的内容:可以通过三种不同的方式指定颜色。 Color 给出 RGB 值(如 Long)。 ColorIndex 是调色板的索引,这是在 Excel 中使用 RGB 之前使用的。 ThemeColor 是一个代表当前主题颜色的数字(TintAndShade 改变亮度)。当您使用ThemeColor并更改您的Excel主题时,可见颜色会自动改变,而当您使用Color时,颜色将保持不变。
【解决方案2】:

为交替着色应用格式条件的 VBA 将是:

Public Sub alternatingColorSizeAndKind(rg As Range)

Dim fc As FormatCondition
With rg.FormatConditions
    .Delete
    Set fc = .Add(xlExpression, , "=($C1=$C2)+($C2=$C3)")
    fc.Interior.Color = 14348258
    
    Set fc = .Add(xlExpression, , "=($C1<>$C2)")
    fc.Interior.Color = 13431551
End With
    
End Sub

您必须将表格的范围传递给此子。

如果你有一个列表对象/表,那么你可以这样称呼它:

Public Sub update()


Dim lo As ListObject
'>>> adjust the names to your needs
Set lo = ThisWorkbook.Worksheets("Sheet1").ListObjects("Pull_Data")

alternatingColorSizeAndKind lo.DataBodyRange

End Sub

【讨论】:

  • 谢谢!我是 VBA 的新手。有没有办法引用表格本身而不是一系列单元格?表名称是“Pull_Data”。我如何将其放入您提供的代码中?
  • 我添加了代码示例。
猜你喜欢
  • 2011-08-22
  • 1970-01-01
  • 2018-08-15
  • 2020-09-25
  • 2011-04-12
  • 2012-01-23
  • 2019-12-13
  • 1970-01-01
  • 2015-01-24
相关资源
最近更新 更多