【问题标题】:Excel: copy cell' conditional formatting colour to all cells with same valueExcel:将单元格的条件格式颜色复制到具有相同值的所有单元格
【发布时间】:2021-06-13 06:46:56
【问题描述】:

Reference Image

目标:图像显示左侧的“键”,其中单元格将使用鼠标输入手动着色。 A(红色背景) B(绿色背景) C(蓝色背景) 在右侧,您会看到“数据”内容匹配单元格应该被格式化以匹配它们的键(正如我已经为图像中的表示目的所做的那样)

初始情况:没有单元格以任何方式着色或格式化。 Excel 电子表格的 A 列具有某些值,其余列(从 C 开始)以随机方式具有相同/不同的值(某些单元格甚至为空)。并非“关键”区域中的所有值都将在“数据”区域中找到,反之亦然。任何区域都没有添加新数据。用户只会根据自己的意愿为“键”区域中的某些值着色。

因此,当关键区域中的“C”为蓝色时,数据区域中的所有“C”单元格都应为蓝色。此外,如果我将 Key 中“C”的格式更改为紫色背景,则所有“C”单元格都应从蓝色变为紫色。此外,如果我向键添加更多内容(例如,带有黄色背景的“D”),那么任何“D”单元格都应该变成黄色;如果我删除一个 Key 条目,那么 Data 区域中的匹配值应该恢复为默认样式。

我对不同的触发技术持开放态度,例如通过快捷方式手动运行宏等。 我怀疑如果有任何可能,它将需要 VBA,但我从未使用过它,所以如果是这种情况,我不知道从哪里开始。找到了与我的问题最接近的答案here,但并不完全适合我:

【问题讨论】:

    标签: excel vba formatting conditional-formatting


    【解决方案1】:

    首先我想使用 Worksheet.Change 事件,将类似这样的内容放入工作表中:

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim area As Range, c As Range
    If Not Intersect(Target, Range("A:A")) Is Nothing And Target.Count = 1 Then
        Set area = Range("B1:F20")
        For Each c In area
            If c.Value = Target.Value Then c.Interior.Color = Target.Interior.Color
        Next c
    End If
    End Sub
    

    这只是一个非动态的草稿,但它“有点”有效。
    问题是颜色的变化不会触发 change 事件,有趣的是,将字母更改为相同的字母 - 所以根本没有变化 - 会触发事件,如下图所示:

    我们可以改用Worksheet_SelectionChange 事件,但是直到下次我们选择要更新的单元格时它才会更新。

    我们可以改为强制它在下一次选择时更新。这也不是最佳的:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim reference As Range, refCell As Range, area As Range, areaCell As Range
    Set reference = Range("A1:A3")      'Reference range
    Set area = Range("B1:F20")          'Search range
        For Each refCell In reference   'Loop through the references
            For Each areaCell In area   'Loop through search range for each reference
                If areaCell.Value = refCell.Value Then areaCell.Interior.Color = refCell.Interior.Color
            Next areaCell
        Next refCell
    End Sub
    

    显然,使用按钮或类似工具来运行相同的代码也可以,但我不完全确定我们是否可以让它立即运行。

    要手动运行它,把它作为一个普通的子放在一个模块中。 (但它仍然可以在工作表中使用)。

    Sub fillColor()
    Dim reference As Range, area As Range, areaCell As Range
    Application.ScreenUpdating = False
    Set reference = Range("A1")
    Set area = Range("B1:E25")
            For Each areaCell In area
                If areaCell.Value = reference.Value Then
                    areaCell.Interior.Color = reference.Interior.Color
                    areaCell.Interior.Pattern = reference.Interior.Pattern
                End If
            Next areaCell
    Application.ScreenUpdating = True
    End Sub
    

    不过,您可能想添加一个关于要更新什么的选项,所以它不会全部更新。

    【讨论】:

    • 嗨克里斯托弗,感谢您的及时回复!应用这两种方法后的观察结果: 1. 由于 Key 条目是 2500+ 并且数据端有 30 列(所以 30 x 2500+ 数据);每次我在键中为单元格着色时,方法 2 都会冻结工作表。 2. 由于代码检查数据端的每个单元格,我猜即使在 i7、16GB ram 3 上它的计算量也很大。我将这两个代码都放在 VBAProject-->Microsoft Excel Objects-->Sheet1 的“工作表”部分中。我希望那是正确的地方?
    • 4.方法 1 像您演示的那样工作,并且需要一个单元格编辑触发器。我们可以制作一个可执行的宏快捷方式,用户可以在为单元格着色后输入吗? 5. 同样在方法1中,如果key中已经填充颜色的单元格更改为无填充,则数据侧的所有相同单元格都切换为白色填充(而不是无填充)。
    • 是的,这是放置它们的正确位置。是的,对于大量数据,它可能会变得非常繁重,尤其是第二个选项,其中绝对所有的东西都一直在计算,不是很有效。您可以改为从按钮调用宏。最好将它放在一个模块中,并像常规子一样使用。我可以稍后添加。
    • No-fill 似乎不适用于仅使用 interior.color,但如果您也使用 .Interior.Pattern 也可以。
    • 好的,这就是我需要一些入门级指导的地方。我在颜色行之后添加了代码c.Interior.Pattern = Target.Interior.Pattern 作为新行(在 Mehots 1 中)。但这似乎不起作用。调试说'Next without For'。其次,调试说您添加的普通子代码的第 6 行存在语法错误。在删除区域后写的“参考”一词时,代码运行但工作表冻结。
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2011-09-11
    相关资源
    最近更新 更多