我有一个 Excel 电子表格,我希望能够在其中创建具有唯一值的格式化单元格的“键”,然后在另一个工作表中使用该键格式来格式化单元格。
例如,我的键如下,每个单元格一个值,并以括号中所示的视觉格式显示:
A (red background)
B (green background)
C (blue background)
因此,它位于一张工作表上(或当前工作表的一个角落 — 以更方便的方式为准)。然后,在我标记为条件格式的区域中,我可以键入这三个字母中的一个,并根据键值对键入该字母的单元格进行视觉格式化。因此,如果我在其中一个条件格式的单元格中键入“B”,它将获得绿色背景。
(请注意,我在这里使用背景仅仅是为了便于解释:理想情况下,我希望复制所有视觉格式,无论是前景色、背景色、字体粗细、边框还是其他什么。但显然,我会采取我能得到的方法。)
而且——只是为了让它变得更加棘手——如果我更改键中的格式,该更改应该反映在引用该键的单元格中。因此,如果我将键中的“B”格式从绿色背景更改为紫色背景,主工作表中的任何“B”都应切换为新颜色。同样,应该可以从键中添加或删除值,并将这些更改应用于主数据集。
我同意通过单击按钮或其他东西来触发键盘更改时的格式更新。我怀疑如果这一切是可能的,它将需要 VBA,但我从未使用过它,所以如果是这样的话,我不知道从哪里开始。我希望没有 VBA 也可以实现。
我知道可以使用多种条件格式,但我的用例是,我试图为不熟悉条件格式的人创建上述功能。我想让他们能够定义一个键,在必要时更新它,然后继续工作,而不必我为他们重写电子表格的格式规则。
- - 更新 - -
所以我觉得我对最初的请求有点不清楚。让我用一张图片再试一次。
图像左侧显示“键”,其中使用键盘和鼠标输入定义值和样式。右侧显示应格式化以匹配键的数据。
因此,如果我在数据区域的单元格中输入“C”,它应该是蓝色背景的。此外,如果我将 Key 中的“C”格式更改为紫色背景,全部“C”单元格应该从蓝色变为紫色。更疯狂的是,如果我向 Key 添加更多内容(例如,带有黄色背景的“D”),则任何“D”单元格都将被设置为匹配的样式;如果我删除 Key 条目,则数据区域中的匹配值应恢复为默认样式。
那么。这样更清楚了吗?全部或部分都可行吗?我不必为此使用条件格式;事实上,目前我怀疑我可能不应该这样做。但我愿意接受任何方法!
答案1
这将使用 A1 中的单元格来设置 D1:D9 中单元格的条件 - 改变范围以满足您的需要:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Address = "$A$1" and Sh.Name="Sheet1" Then
Sheets(1).Range("D1:D9").FormatConditions(1).Font.Color = Target.Font.Color
Sheets(1).Range("D1:D9").FormatConditions(1).Interior.Color = Target.Interior.Color
End If
End Sub
改变颜色后,你必须改变通过编辑单元格并按下 Enter 键(从而触发更改事件),
格式条件将按规则应用的顺序排序。还有更多可以应用的更改,只需.FormatConditions(1).Whatever = Target.Whatever
在代码中添加另一个即可
此代码不会设置任何条件,它只会更改现有的条件。条件按屏幕上显示的规则顺序编号
如果您不想使用条件格式,而只想为单元格添加颜色,那么您可以通过以下方式循环遍历每个单元格:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Intersect(Target, Range("A:A")) Is Nothing Or Sh.Name <> "Sheet1" Then Exit Sub
' exit if not in key range (formatting key is A:A on sheet1
If VarType(Target) > vbArray Then Exit Sub
' if multiple cells are changed at once, then exit, as i'm not going to fight with multi cell change
Dim TargetRange As Range
Dim lCell As Object
Set TargetRange = Sh.Range("D1:D9")
' changing cells in this area
For Each lCell In TargetRange.Cells
If lCell.Value = Target.Value Then
' only change cells that match the edited cell
lCell.Font.Color = Target.Font.Color
lCell.Interior.Color = Target.Interior.Color
' copy whatever you feel needs to be copied
End If
Next
End Sub
答案2
以下是 Sean 所做工作的延伸(仅展示 Sub 的内部):
If Intersect(Target, Range("A:G")) Is Nothing Or Sh.Name <> "Sheet3" Then Exit Sub
' exit if not in key range (formatting key is A:A on sheet1
If VarType(Target) > vbArray Then Exit Sub
' if multiple cells are changed at once, then exit, as i'm not going to fight with multi cell change
Dim KeyRange As Range
Dim TargetRange As Range
Dim lCell As Object
Dim kCell As Object
Set KeyRange = Sh.Range("A1:A10")
' formatting key is here
Set TargetRange = Sh.Range("D1:F9")
' changing cells in this area
For Each kCell In KeyRange.Cells
If kCell.Value <> "" Then
For Each lCell In TargetRange.Cells
If lCell.Value = kCell.Value Then
' only change cells that match the edited cell
lCell.Font.Color = kCell.Font.Color
lCell.Interior.Color = kCell.Interior.Color
' copy whatever you feel needs to be copied
End If
Next
End If
Next
答案3
我的情况和你一模一样。KeyRange 是整个 B 列。DataSet 范围是从 C 到 AF 列。一开始,KeyRange 和 DataSet 端只有普通的字母数字数据。
以下是我的问题的链接和 1 个可能的答案。