Excel 带下拉列表的循环引用

Excel 带下拉列表的循环引用,excel,vba,Excel,Vba,在MS.Excel或VBA中,是否可以使用带有下拉列表的循环引用 以下是我的目标:我想在两张纸(第1页,第2页)上生成一个下拉列表,显示“完成”或“不完整”。如果我将第1页从“完成”更改为“不完整”,我希望第2页显示相同的内容,但我也希望反之亦然 (如果我将表2从完整更改为不完整,我希望更改表1) 这可能吗?我将创建一个隐藏的工作表,其中包含输入范围和链接的单元格。然后将两个下拉列表链接到列表和链接的单元格。那么当你改变一个,它就会改变另一个。这里的关键是链接的单元格。这是假设Excel 201

在MS.Excel或VBA中,是否可以使用带有下拉列表的循环引用

以下是我的目标:我想在两张纸(第1页,第2页)上生成一个下拉列表,显示“完成”或“不完整”。如果我将第1页从“完成”更改为“不完整”,我希望第2页显示相同的内容,但我也希望反之亦然
(如果我将表2从完整更改为不完整,我希望更改表1)


这可能吗?

我将创建一个隐藏的工作表,其中包含输入范围和链接的单元格。然后将两个下拉列表链接到列表和链接的单元格。那么当你改变一个,它就会改变另一个。这里的关键是链接的单元格。这是假设Excel 2013,使用表单控件组合框。

请查看,因为这是最有效的答案。
经过一点尝试和错误,我已经得到了这个工作与一个“数据验证”下拉菜单单元格。在我的测试用例中,我有3张工作表,每个工作表上的单元格$B$5中有一个数据验证列表,链接到隐藏工作表上的列表以填充列表,带有选项列表的工作表是“Sheet3”,不包含数据验证列表

下面的代码需要复制到每个图纸模块

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

使用工作表上的activeX组合框,这相当容易

在工作簿模块上,添加下面的代码以填充组合框

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
在“表1”模块中添加

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
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
在“Sheet2”模块上添加

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
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

对任何工作表的B5范围中的更改进行操作似乎是一种可行的方法,但单个事件宏有一些限制

代码必须在多个工作表代码表中重复,任何修改都必须在同一工作表中克隆。新工作表要求将子程序纳入其自身的代码表中

在写入新值之前,如果不禁用事件,每个接收到新值的工作表都将启动自己的事件宏,该宏将重写将触发更多事件的值。级联事件故障几乎肯定会发生

通过将事件宏替换为此工作簿代码表中更通用的事件宏,可以将所有代码本地化到单个位置。在单个位置进行调整,新工作表将自动添加到要处理的工作表队列中。它们也可以轻松地添加到工作表数组而不是中进行处理

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
Private子工作簿\u SheetChange(ByVal Sh作为对象,ByVal Target作为范围)
如果Target.Address=“$B$5”和Sh.Name“Sheet3”,则
错误转到bm_安全出口
Application.EnableEvents=False
暗w长
对于w=1的工作表。计数
带工作表(w)
'跳过此工作表和工作表3
如果CBool(UBound)(过滤器(数组(Sh.Name,“Sheet3”)_
.Name,False,vbTextCompare)),然后
.Range(“B5”)=目标.Value

'.Range(“B5”).Interior.ColorIndex=3'这是可能的。到目前为止,您尝试了什么?如果您使用的是下拉表单控件,只需为这两个下拉列表指定相同的链接单元格,我正在尝试做相同的事情。以下是我关于SU的问题:“循环引用”不能从Excel公式精确地转换为VBA。在VBA中,您可以[例如]使x=y,然后使y=x+1,然后使x=y+x。这是因为每一行都是按顺序完成的,所以它不会在重新计算时来回运行。不能使用Excel公式执行此操作,因为所有单元格都会同时更新;单元格之间没有“操作顺序”。所以你不能让A1=B1,然后让B1=A1+1,因为它会永远循环。所以这个问题基本上是问:一个子单元对一个单元的影响是否会因该单元的值不同而有所不同?是的。这是我一直在努力的方向,但是如果你有几十个这样的链接下拉列表,使用表单控件会很困难。如果所有的组合框都要引用同一个链接单元格,那么一个简单的UDF自动链接就可以了。需要更多关于组合框的信息,以及它们是如何联系在一起的。在我的场景中,它们都是不同的值。可能有几百个。目前我只使用验证列表和单向链接,因此我必须告诉人们不要更改仪表板选项卡上的值。这更优雅、更高效。虽然我通过检查值是否相同来捕获级联事件失败,但如果值相同,则不会进行任何更改,因此不会出现新事件;仅仅是从广泛的角度澄清一个潜在的问题领域。希望没有采取错误的方式。一点也没有。这是我遇到的一个问题,说实话。