2016-04-27 8 views
0

私は数日前から検索してきましたが、これを解決できないようです。コンボボックスを使用してExcelで別のシートのデータをフィルタリングする

私はAccessデータベースから "アイデア"のリストを収めたExcelブックを持っています。テーブルは「読み取り専用」モードで接続されています(Excelへの書き込みは絶対にAccessに戻ってはいけません!)

いくつかの注釈:「AllIdeas」シートは最初は表示されません。 VBAマクロは表示され、フィルタリングされます。

私は、以下の機能が必要な「ダッシュボード」と題したシートがあります。

  1. (動作しない)アイデア所有者はコンボボックスを使用し、この場合、「ボタン」(クリックすることができ、それは角丸長方形だがマクロを割り当てます)、AllIdeasの情報をフィルタリングして、割り当てられたアイデアのみを表示します。
  2. (動作しません)クリック可能な丸い四角形と共に、アイデアの「ステータス」(オープン、辞退、実装など)をリストする別のコンボボックスを表示します。この長方形のマクロは、アイデアオーナー(combobox1で識別される)とステータス(combobox2で識別される)のアイデアのみを取得する必要があります。この第2の「ボタン」マクロは、「アイディアオーナー」と「ステータス」の両方が選択されていなくても実行されません。
  3. (作業中)ユーザーはアイデア番号を入力し、ダッシュボードに情報をポップアップ表示させることができます。これはアイデア番号を知っていても詳細を必要とする場合に便利です。
  4. (作業中)ダッシュボードの一番下には、「AllIdeas」シートを外に出してテーブル全体を表示する、マクロが割り当てられたもう1つの丸い四角形があります。
  5. (Working) "AllIdeas"シートには、 "ここをクリックしてダッシュボードに戻る"というボタンがあります。このマクロは、ユーザーをダッシュ​​ボードに戻し、「AllIdeas」シートを非表示にします。

ここにいくつかのものがあります。私はAllIdeasシートおよびフィルタを再表示するためにクリックマクロと一緒に私のコンボボックスを使用する方法について完全に立ち往生しています

Sub AllIdeasBtn() 
Worksheets("AllIdeas").Visible = xlSheetVisible 
Worksheets("AllIdeas").Activate 
If Worksheets("AllIdeas").AutoFilterMode Then   Worksheets("AllIdeas").ShowAllData 
End Sub 

Sub Back() 
ActiveSheet.Visible = False 
Sheets("Dashboard").Select 
Sheets("AllIdeas").Visible = False 


End Sub 

:私はこれがいかに厄介なため、事前に謝罪...これはVBAへの私の最初のベンチャー企業でありますコンボボックスでの選択によってそれが表示されます。 AllIdeas Example

+0

...、フィルタを適用するダッシュボードをクリアし、ダッシュボードに新しいfilterdデータを置きます「Idea Owners」のAllIdeasシートと「Status」のフィールド。あなたが「アイデア番号」のために働いているものを持っているならば、それは他の2人にとって似ているはずです。課題は、ユーザーがドロップダウンリストから自分の名前を選んでもらいたいのか、それとも他の方法で彼/彼女を識別できるのかということです。 AllIdeasワークシートのサンプルとIdea Numberコードを少しずつ投稿することをお勧めします。 – OldUgly

+0

あなたは正しいですか、オールド犬です、アイデアの所有者、ステータスなどの列があります。ユーザーがコンボボックスで名前を選択し、「フィルターのアイデア」を押して、「AllIdeas」シートを非表示にしたい選択された名前でフィルタリングされます。 ダッシュボードの「アイデアクエリ」に使用しているコードは次のとおりです: '= IFERROR(INDEX(AllIdeas!D:D、MATCH(Dashboard!D13、AllIdeas!B:B、0))、 ) ' - 私はインデックス一致を実行しているので、ユーザーはアイデアの説明、解決策、およびステータスを見ることができます。彼らがアイディア番号を知っている限り。私は最初の質問の終わりに私のダッシュボードの例を掲示しました。 – jrichall

答えて

1

jrichall - この回答は、問題を解決するための例を示すフレームワークを提供することです。あなたが設計したものとまったく同じものを敷くわけではありません。私はこの方法でそれを分解しました

...

  1. リストはAllIdeasテーブル上に存在し、一意の名前、ステータス、アイデア番号など、必要とされます。これらのリストは、フィルタリングのためのエンドユーザーの選択を制限するために使用されますが、コンテンツが変更されたときに最新の状態に保つ必要があります。
  2. 名前、ステータス、アイデア番号など、エンドユーザーを一度に1種類のフィルタに制限しています。つまり、もう一方が選択されたときに1種類のフィルタを削除する方法が必要です。
  3. 新しいフィルタが適用される前に、AllIdeasの古いフィルタリングを削除する必要があります。
  4. フィルタ結果をダッシュ​​ボードに表示すると、ダッシュボードの外観が維持されます。

注:私の例では、私はコンボボックスを使用していません。しかし、そのコンセプトは容易に移送可能です。 、AllIdeasの単純なモックアップが生成された


コードをテストするための簡単なAllIdeas

...

enter image description here


単純なダッシュボード

シンプルなダッシュボードもまとめました。その中で、セルA2、B2、およびC2は、データ検証を使用してその入力が保護されています。

enter image description here

名前付き範囲は、有効なデータを定義します。上記の図は、名前のRange "Names"です。


リストと有効な名前、ステータス、および番号(名前付き範囲)の

リストは、「ドロップダウン」という名前のタブ上に保持され、それらを維持します。それはあなたがこれらのリストはAllIdeasテーブルに含まれるすべての情報が含まれていない見ることができ、次の...

enter image description here

のように見えます。以下は、 "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 

これらのルーチンを実行した後、名前付き範囲リストは次のようになり...

enter image description here

これらのルーチンは、のWorkbook_Openイベントコードに追加ので、彼らはのために最新の状態に滞在されていますユーザーは...

Private Sub Workbook_Open() 
    UpdateNamesList 
    UpdateStatusList 
    UpdateNumberList 
End Sub 

今、ユーザーが最新であるドロップダウン・リストがある(同様の方法が最新の状態にコンボボックスを維持するために使用することができます)。.. 。

enter image description here


フィルタリング - 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つのフィルタを選択すると、自動的にもう一方のフィルタがクリアされます...

enter image description here

enter image description here


フィルタリングと

"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 

それは私がフィールドがであることを仮定してい

enter image description here

enter image description here

enter image description here

+0

これは素晴らしいレスポンスです!ありがとうございました!私はあなたが私のワークブックに私に与えたことを働かせることができると思う。可能であれば、 "FetchIdeas"マクロを使用してAllIdeasシートを表示し、選択してフィルタリングしていきたいと思います。私が持っているデータは、ダッシュボードに大量のデータを入れる方法です。 FetchIdeasマクロに次のコードを追加できますか? 'Worksheets(" AllIdeas ")。Visible = xlSheetVisible ワークシート(" AllIdeas ")。アクティブにする ' – jrichall

+0

試してください。それがどのように機能するかを見てください – OldUgly

関連する問題