[英]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的答案,因為它是最有效的答案。
下面的代碼需要復制到每個工作表模塊。
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.