簡體   English   中英

帶有下拉列表的循環引用

[英]Circular Reference with drop-down list

有可能在MS。 Excel或VBA有一個帶有下拉列表的循環引用?

這就是我所追求的:我想在兩張紙(表1,表2)上生成一個下拉列表,其中顯示“完成”或“未完成”。 如果我將表1從完全更改為不完整,我希望表2說同樣的事情,但我也希望反之亦然
(如果我將表2從完全更改為不完整,我希望表1更改)。

這可能嗎?

對任何工作表的B5范圍進行更改似乎是一種可行的方法,但單個Worksheet_Change事件宏有一些限制。

代碼必須在許多工作表代碼表中重復,並且必須克隆任何修改。 新工作表要求將子過程合並到他們自己的代碼表中。

如果在編寫新值之前沒有禁用事件,則每個接收新值的工作表將啟動自己的Worksheet_Change事件宏,該宏又會重寫將觸發更多事件的值。 級聯事件失敗幾乎肯定會發生。

通過將Workheet_Change事件宏交換為ThisWorkbook代碼表中更通用的Workbook_SheetChange事件宏,可以將所有代碼本地化到單個位置。 調整在一個地方進行,新工作表將自動添加到要處理的工作表隊列中。 它們很容易添加到工作表數組中,也不能處理。

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事件的工作表被排除在外。

我將創建一個隱藏的工作表,其中包含輸入和鏈接單元格的范圍。 然后將下拉列表鏈接到列表和鏈接的單元格。 然后,當你改變一個,它將改變另一個。 這里的關鍵是Linked Cell。 這是假設Excel 2013,使用表單控件組合框。

請看看@ Jeeped的答案,因為它是最有效的答案。


經過一些試驗和錯誤后,我已經使用了一個帶有“數據驗證”下拉菜單的單元格。 在我的測試用例中,我有3張帶有數據驗證列表的單據$ B $ 5,每張工作表鏈接到隱藏表單上的列表以填充列表,帶有選項列表的表單是“Sheet3”並且不包含數據驗證清單。

下面的代碼需要復制到每個工作表模塊。

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

使用床單上的activeX組合框很容易

在工作簿模塊上添加以下代碼以填充組合框

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM