我在 Excel 文档中获得了来自命名范围 (data/validation/list source=MyNamedRange) 的一些单元格:
此处,A1:A3 范围名为 Foobar
B5:B6 正在进行数据验证,其源设置为“Foobar”
我希望能够更新单元格 A2 的内容(从 Bar 到 Quux),并自动看到 B5 单元格的内容更新为 Quux,因为它的源已更改。
它可能通过宏来执行,但我不知道如何编码。
请问有什么提示吗?
答案1
这看起来很危险,但我看不出有什么问题。基本上,如果你在 Foobar 中更改任何内容,它会搜索工作表上具有数据验证的每个单元格。如果 DV 指向 Foobar 并且值不在列表中,那么一定是更改的值。它在我有限的测试中有效。如果你发现任何缺陷,请告诉我。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rCell As Range
Dim rFound As Range
'Only run this when a cell in Foobar is changed
If Not Intersect(Target, Me.Range("Foobar")) Is Nothing Then
'Go through every data validation cell in the sheet
For Each rCell In Me.Cells.SpecialCells(xlCellTypeAllValidation).Cells
'if the DV in the cell points to foobar
If rCell.Validation.Formula1 = "=Foobar" Then
'See if the cell's value is in the Foobar list
Set rFound = Me.Range("Foobar").Find(rCell.Value, , xlValues, xlWhole)
'If it's not in the list, it must be the one that
'changed, so changed it
If rFound Is Nothing Then
Application.EnableEvents = False
rCell.Value = Target.Value
Application.EnableEvents = True
End If
End If
Next rCell
End If
End Sub
请注意,这位于工作表的模块中,而不是标准模块中。与往常一样,在工作簿的副本上测试代码。
答案2
您需要使用 VBA 来完成此操作,或者为 B5:B6 中的每一个单元格设置一个额外的计算单元格,以检测单元格值不再包含在命名范围内并对此进行标记。
我曾经必须维护一个包含数千个此类依赖项的庞大工作簿,调试起来真是一场噩梦。
此链接有更多关于如何解决验证源范围和目标单元格之间链接的单向性的方法。
答案3
您现在要做的是将 A2 的值存储在 B6 中。但您需要存储对 A2 的引用。然后,B6 将自动更新。我认为“=A2”(不带引号)作为字段值应该可以做到这一点。