循环引用和下拉列表

MS可以吗? Excel或VBA有一个下拉列表的循环引用?

这就是我所追求的:我想在两张纸(第一张,第二张)上生成一个表示“完成”或“不完整”的下拉列表。 如果将“工作表1”从“完成”更改为“未完成”,我希望工作表2expression相同的内容,但是我也希望反之亦然
(如果将“工作表2”从“完成”更改为“未完成”,我希望工作表1更改)。

这可能吗?

对任何工作表的B5范围进行更改似乎是一种可行的方法,但个别的Worksheet_Change事件macros有一些限制。

该代码必须在许多工作表代码表中重复,并且任何修改都必须在相同的情况下进行克隆。 新的工作表需要将子程序合并到他们自己的代码表中。

在写入新值之前不禁用事件,每个接收新值的工作表都将启动自己的Worksheet_Change事件macros,而该macros将重写将触发更多事件的值。 级联事件失败几乎肯定会发生。

通过将Worksheet_Change事件macros交换为位于ThisWorkbook代码表中更通用的Workbook_SheetChange事件macros,可以将所有代码本地化为单个位置。 调整在一个地方进行,新的工作表将自动添加到工作表队列进行处理。 他们可以很容易地添加到工作表数组处理。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$B$5" And Sh.Name <> "Sheet3" Then On Error GoTo bm_Safe_Exit Application.EnableEvents = False Dim w As Long For w = 1 To Worksheets.Count With Worksheets(w) 'skip this worksheet and Sheet3 If CBool(UBound(Filter(Array(Sh.Name, "Sheet3"), _ .Name, False, vbTextCompare))) Then .Range("B5") = Target.Value '.Range("B5").Interior.ColorIndex = 3 '<~~testing purposes End If End With Next w End If bm_Safe_Exit: Application.EnableEvents = True End Sub 

任何不接收对其自己的B5单元格中的值的更新的工作表都可以添加到Filter函数中使用的数组中。 目前,Sheet3和发起Workbook_SheetChange事件的工作表被排除在外。

我会创build一个包含input范围和链接单元格的隐藏表单。 然后将两个下拉列表链接到列表和链接的单元格。 那么当你改变一个会改变另一个。 这里的关键是链接单元格。 这是假设Excel 2013,使用窗体控件combobox。

请看看@ Jeeped的答案,因为这是最有效的答案。


经过一些试验和错误,我已经得到这个与“数据validation”下拉菜单单元格的工作。 在我的testing案例中,每张工作表上的单元格为$ B $ 5的数据validation列表中有3张表单链接到隐藏表单上的列表以填充列表,表单中包含选项列表“Sheet3”,并且不包含数据validation列表。

下面的代码需要复制到每个工作表模块。

 Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet If Target.Address = "$B$5" Then For Each ws In ThisWorkbook.Worksheets If Not ws.Name = Me.Name And Not ws.Name = "Sheet3" Then If Not ws.Range(Target.Address) = Me.Range(Target.Address) Then ws.Range(Target.Address) = Me.Range(Target.Address) End If End If Next ws End If End Sub 

使用表单上的activeXcombobox,这是相当简单的

在工作簿模块上添加下面的代码来填充combobox

 Private Sub Workbook_Open() With ThisWorkbook With .Worksheets("Sheet1").ComboBox1 .AddItem "Complete" .AddItem "Incomplete" End With With .Worksheets("Sheet2").ComboBox1 .AddItem "Complete" .AddItem "Incomplete" End With End With End Sub 

在“Sheet1”模块上添加

 Private Sub ComboBox1_Change() If Me.ComboBox1 = "Complete" Then ThisWorkbook.Worksheets("Sheet2").ComboBox1.Value = "Complete" ElseIf Me.ComboBox1 = "Incomplete" Then ThisWorkbook.Worksheets("Sheet2").ComboBox1.Value = "Incomplete" End If End Sub 

在“Sheet2”模块上添加

 Private Sub ComboBox1_Change() If Me.ComboBox1 = "Complete" Then ThisWorkbook.Worksheets("Sheet1").ComboBox1.Value = "Complete" ElseIf Me.ComboBox1 = "Incomplete" Then ThisWorkbook.Worksheets("Sheet1").ComboBox1.Value = "Incomplete" End If End Sub