首先我想使用 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
不过,您可能想添加一个关于要更新什么的选项,所以它不会全部更新。