jrichall - 這個答案是提供一個框架和示例,以幫助解決您的問題。它不會完全按照您的設計進行佈置。
我打破了下來,這樣......都需要唯一的名稱,狀態,思想號碼等,在AllIdeas表存在
- 列表。這些列表用於限制最終用戶的篩選選擇,但它們需要在內容更改時保持最新。
- 你限制了最終用戶的一種過濾器在同一時間 - 無論是按名稱,狀態,數量理念,還是其他什麼東西。這意味着您需要一種方法來消除另一種選擇時的一種過濾器。
- 在應用新過濾器之前,需要消除AllIdeas的舊過濾。
- 在儀表板上顯示過濾結果意味着保持儀表板外觀。
注意:在我的示例中,我沒有使用組合框。但是,這些概念很容易運輸。
簡單AllIdeas
要測試的代碼,產生AllIdeas的一個簡單的樣機......
一個簡單的儀表板
一個簡單的儀表盤也放在一起。其中,單元格A2,B2和C2使用數據驗證來保護其輸入。
命名範圍定義了有效的數據。上面所示的是名爲範圍「名稱」。
列表和維護他們
有效的名稱,狀態和號碼(指定範圍)的列表是維持一個名爲「下拉菜單」選項卡上。它看起來像下面...
你可以看到這些列表不包含所有包含在AllIdeas表中的信息。以下是更新「名稱」列表的VBA代碼。類似的更新「狀態」列表和「數字」列表。
Sub UpdateNamesList()
Dim IdeaSht As Worksheet, ListSht As Worksheet
Dim IdeaRng As Range, myRng As Range
Dim iCount As Long, NameCol As Long
Dim myDict As Object, myKey As Variant
Dim namedRange As Name
' Initial
Set IdeaSht = Worksheets("AllIdeas")
Set ListSht = Worksheets("DropDowns")
Set myDict = CreateObject("Scripting.Dictionary")
' Find the column with the user names
For Each myRng In IdeaSht.Range(IdeaSht.Cells(1, 1), IdeaSht.Cells(1, IdeaSht.Cells(1, IdeaSht.Columns.Count).End(xlToLeft).Column))
If myRng.Value = "Idea Owner" Then
NameCol = myRng.Column
Exit For
End If
Next myRng
' Pull out unique user names
For Each myRng In IdeaSht.Range(IdeaSht.Cells(2, NameCol), IdeaSht.Cells(IdeaSht.Range("A" & IdeaSht.Rows.Count).End(xlUp).Row, NameCol))
If Not myDict.exists(myRng.Value) Then
myDict.Add myRng.Value, myRng.Value
End If
Next myRng
' Change "Names" list to contain the unique user names
For Each myRng In ListSht.Range(ListSht.Cells(1, 1), ListSht.Cells(1, ListSht.Cells(1, ListSht.Columns.Count).End(xlToLeft).Column))
If myRng.Value = "Names" Then
NameCol = myRng.Column
Exit For
End If
Next myRng
iCount = 0
For Each myKey In myDict
ListSht.Cells(2 + iCount, NameCol).Value = myKey
iCount = iCount + 1
Next myKey
Set namedRange = ActiveWorkbook.Names("Names")
namedRange.RefersTo = ListSht.Range(ListSht.Cells(2, NameCol), ListSht.Cells(1 + iCount, NameCol))
' clean up
Set IdeaSht = Nothing
Set ListSht = Nothing
Set myDict = Nothing
Set namedRange = Nothing
End Sub
運行這些程序後,命名範圍列表現在看起來如下...
這些程序被添加到WorkBook_Open事件代碼,使他們掌握最新的用戶...
Private Sub Workbook_Open()
UpdateNamesList
UpdateStatusList
UpdateNumberList
End Sub
現在,用戶有下拉列表是最新的(類似的方法可以用來保持組合框爲最新)。 。
過濾 - 只能有一個!
爲了管理當在單元格B2,或者在這三個過濾器規格的變化的所有其它組合中指定的東西清除單元格A2濾波,用於儀表板的WorkSheet_Change事件代碼...
Private Sub Worksheet_Change(ByVal Target As Range)
Dim iLoop As Long
If Intersect(Target, ActiveSheet.Range("A2:C2")) Is Nothing Then Exit Sub
Application.EnableEvents = False
For iLoop = 1 To 3
If Target.Column <> iLoop Then ActiveSheet.Cells(2, iLoop).Value = ""
Next iLoop
Application.EnableEvents = True
End Sub
現在,選擇一個過濾器會自動清除其他...
過濾和顯示
的 「FetchIdeas」 按鈕被連接到下面的一段VBA代碼...
Sub FetchAllIdeas()
Dim IdeaSht As Worksheet, DshbrdSht As Worksheet
Dim myRng As Range
Dim lstRow As Long, lstCol As Long
Dim FltrVal() As Variant, FltrCol As Long
Dim myField As Long, iLoop As Long
'Initial
Set IdeaSht = Worksheets("AllIdeas")
Set DshbrdSht = Worksheets("Dashboard")
'Determine which filter we are using
ReDim FltrVal(1 To 1)
myField = 0
For Each myRng In DshbrdSht.Range("A2:C2")
If myRng.Value <> "" Then
FltrVal(1) = myRng.Value
If myRng.Offset(-1, 0).Value = "GetByName" Then myField = 2
If myRng.Offset(-1, 0).Value = "GetByStatus" Then myField = 3
If myRng.Offset(-1, 0).Value = "GetByNumber" Then myField = 1
Exit For
End If
Next myRng
'Clear the dashboard
lstRow = DshbrdSht.Range("A" & DshbrdSht.Rows.Count).End(xlUp).Row
For iLoop = lstRow To 5 Step -1
DshbrdSht.Cells(iLoop, 1).EntireRow.Delete
Next iLoop
'Filter the AllIdeas tab
If myField > 0 Then
lstRow = IdeaSht.Range("A" & IdeaSht.Rows.Count).End(xlUp).Row
lstCol = IdeaSht.Cells(1, IdeaSht.Columns.Count).End(xlToLeft).Column
With IdeaSht
.Cells.AutoFilter
With .Range(IdeaSht.Cells(1, 1), IdeaSht.Cells(lstRow, lstCol))
.AutoFilter field:=myField, Criteria1:=FltrVal
' and display on the dashboard
.SpecialCells(xlCellTypeVisible).Copy Destination:=DshbrdSht.Range("A5")
End With
End With
End If
End Sub
它適用於過濾器,清除儀表盤,並把儀表盤上的新filterd數據...
我假設有在一個領域AllIdeas爲「創意主人」提供表格,併爲「狀態」提供一個字段。如果你有什麼工作的「想法編號」,它應該是相似的另外兩個。挑戰在於,你是否希望用戶從下拉列表中選擇他的名字,或者你是否有其他方法來識別他/她。我建議你發佈一個小樣本的AllIdeas工作表和你的想法編號代碼。 – OldUgly
你是對的,OldUgly,我有專欄的主意,狀態等等。我希望用戶在組合框中選擇他們的名字,然後點擊「過濾器想法」,並且讓「AllIdeas」表單變得不被隱藏,按所選名稱過濾。 以下是我用於儀表板上「Idea查詢」的代碼:'= IFERROR(INDEX(AllIdeas!D:D,MATCH(Dashboard!D13,AllIdeas!B:B,0)),「」 )' - 我正在運行索引匹配,因此用戶可以看到想法描述,解決方案和狀態;只要他們知道想法編號。我在最初的問題結尾處張貼了我的儀表板示例。 – jrichall