jrichall - この回答は、問題を解決するための例を示すフレームワークを提供することです。あなたが設計したものとまったく同じものを敷くわけではありません。私はこの方法でそれを分解しました
...
- リストはAllIdeasテーブル上に存在し、一意の名前、ステータス、アイデア番号など、必要とされます。これらのリストは、フィルタリングのためのエンドユーザーの選択を制限するために使用されますが、コンテンツが変更されたときに最新の状態に保つ必要があります。
- 名前、ステータス、アイデア番号など、エンドユーザーを一度に1種類のフィルタに制限しています。つまり、もう一方が選択されたときに1種類のフィルタを削除する方法が必要です。
- 新しいフィルタが適用される前に、AllIdeasの古いフィルタリングを削除する必要があります。
- フィルタ結果をダッシュボードに表示すると、ダッシュボードの外観が維持されます。
注:私の例では、私はコンボボックスを使用していません。しかし、そのコンセプトは容易に移送可能です。 、AllIdeasの単純なモックアップが生成された
コードをテストするための簡単なAllIdeas
...
単純なダッシュボード
シンプルなダッシュボードもまとめました。その中で、セルA2、B2、およびC2は、データ検証を使用してその入力が保護されています。
名前付き範囲は、有効なデータを定義します。上記の図は、名前のRange "Names"です。
リストと有効な名前、ステータス、および番号(名前付き範囲)の
リストは、「ドロップダウン」という名前のタブ上に保持され、それらを維持します。それはあなたがこれらのリストはAllIdeasテーブルに含まれるすべての情報が含まれていない見ることができ、次の...
のように見えます。以下は、 "Names"リストを更新するための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
今、ユーザーが最新であるドロップダウン・リストがある(同様の方法が最新の状態にコンボボックスを維持するために使用することができます)。.. 。
フィルタリング - 1つだけすることができます!何かがセルB2に指定された、または3つのフィルタ仕様変更の他のすべての組み合わせをされている場合、ダッシュボード用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
使用されたセルA2でフィルタリングをクリアし管理するには
これで、1つのフィルタを選択すると、自動的にもう一方のフィルタがクリアされます...
フィルタリングと
"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データを置きます「Idea Owners」のAllIdeasシートと「Status」のフィールド。あなたが「アイデア番号」のために働いているものを持っているならば、それは他の2人にとって似ているはずです。課題は、ユーザーがドロップダウンリストから自分の名前を選んでもらいたいのか、それとも他の方法で彼/彼女を識別できるのかということです。 AllIdeasワークシートのサンプルとIdea Numberコードを少しずつ投稿することをお勧めします。 – OldUgly
あなたは正しいですか、オールド犬です、アイデアの所有者、ステータスなどの列があります。ユーザーがコンボボックスで名前を選択し、「フィルターのアイデア」を押して、「AllIdeas」シートを非表示にしたい選択された名前でフィルタリングされます。 ダッシュボードの「アイデアクエリ」に使用しているコードは次のとおりです: '= IFERROR(INDEX(AllIdeas!D:D、MATCH(Dashboard!D13、AllIdeas!B:B、0))、 ) ' - 私はインデックス一致を実行しているので、ユーザーはアイデアの説明、解決策、およびステータスを見ることができます。彼らがアイディア番号を知っている限り。私は最初の質問の終わりに私のダッシュボードの例を掲示しました。 – jrichall