2017-12-05 19 views
1

"Main"シートにピボットテーブルがあります。 PivotField "レポートフィルタ"には200カ国を含む "国コード"があります。 InputBoxを使用して、そのフィルタから1つ以上の国を表示する必要があります。Excel VBAで複数のPivotItemを表示する方法

問題は、フィルタで1つ以上の国またはALLを手動で選択してこのプログラムを実行する必要があることです。私はこれを行うことによって正しいデータを得ることができません。 すべての国の選択を解除してから、実行する必要があります。

マイコード

Sub Addcountries() 

Dim ws As Worksheet 
Dim str1 As Variant 
Dim Data As Variant 
Dim pf As PivotField 
Dim target As PivotTable 

Set ws = Sheets("Main") 
str1 = Application.InputBox("Enter the Country - comma separated") 

If str1 = False Then 
    MsgBox "Please Enter one Country", , "Filter Country" 
    Exit Sub 
Else 
    If InStr(1, str1, ",") > 0 Then 
     Data = Split(str1, ",") 
     For i = LBound(Data) To UBound(Data) 
      ws.PivotTables("MainTable").PivotFields("Country Code").PivotItems(Data(i)).Visible = True 
     Next i 
    Else 
     ws.PivotTables("MainTable").PivotFields("Country Code").PivotItems(str1).Visible = True 
    End If 
End If 

End Sub  
+0

このコードでエラーが発生していますか?または機能が欠けていますか? –

+0

私は問題が彼がInputboxで使っているデータであると思います。また、「ピボットテーブル」は、実際の参照値を使用し、手動入力からではありません。 @デパパク:入力項目のExcelを使ってみましたか? –

+0

@shimエラーが発生していません。私はこのコードを改善する必要があります。私はフィルターのすべての項目をdeselctする必要があります。 – Deepak

答えて

1

することはできPivotItemsコレクションをループし、それがData配列内の選択のcountiresのいずれかに一致する場合は、各PivotItem.Nameをチェック - あなたが達成できることMatch機能を使用して。

コード

If str1 = False Then 
    MsgBox "Please Enter one Country", , "Filter Country" 
    Exit Sub 
Else 
    If InStr(1, str1, ",") > 0 Then ' more than 1 country >> create array 
     Data = Split(str1, ",") 
    Else ' single country 
     Data = Array(str1) '<-- create array with 1 element (for Match to work) 
    End If 

    ' === You need a different loop, loop through all Pivot-Items, then look for a match with Data (array) === 
    Dim pi As PivotItem 

    ' clear previous Filter 
    ws.PivotTables("MainTable").PivotFields("Country Code").ClearAllFilters 

    For Each pi In ws.PivotTables("MainTable").PivotFields("Country Code").PivotItems 
     ' check if current Pivot-Item equals one of the elements of the array (use Match function) 
     If Not IsError(Application.Match(pi.Name, Data, 0)) Then ' Match successful 
      pi.Visible = True 
     Else 
      pi.Visible = False 
     End If 
    Next pi 
End If 

' rest of your code 
+0

あなたのコードはほとんど動作しています。 2小さな問題。 1)私は1つの国を選択しているときにそれはまだ動作していないとすべてを選択します。 2、私はフィルタをクリアする必要があるプログラムを2回目に実行しているとき。どうすればいいですか – Deepak

+0

@Deepak私はあなたのポストに基づいてコードを書いた、私は同様に2番目のオプションを変更します。 –

+0

@Deepak編集したコード –

0

あなたのフィルタが動作するために使用すると、1つのあなたがそうするようにピボットあなたが見たいと思っていないアイテムだけでなく、真の値にFalseの可視値を与える必要がありますすべてのピボットアイテムをTrueまたはFalseに設定していることを確認します。

ここにいくつかのコードを示します。

Sub Addcountries() 
    Dim ws As Worksheet 
    Dim str1 As Variant 
    Dim Data() As Variant 
    Dim pf As PivotField 
    Dim target As PivotTable 
    Dim PivotItem As Object 
    Dim ShowMe As Boolean 


    Set ws = Sheets("Main") 
    str1 = Application.InputBox("Enter the Country - comma separated") 

    If str1 = False Then 
     MsgBox "Please Enter one Country", , "Filter Country" 
     Exit Sub 
    Else 
     If InStr(1, str1, ",") > 0 Then 
      Data = Split(str1, ",") 
     Else 
      'Make Single Item Array 
      ReDim Data(1) 
      Data(0) = str1 
     End If 
     For Each PivotItem In ws.PivotTables("MainTable").PivotFields("Country Code").PivotItems 
      'Default Visibility Is False 
      ShowMe = False 
      For i = LBound(Data) To UBound(Data) 
       'Loop Through Each Item In Data To See If You Should ShowMe 
       ShowMe = (PivotItem.Name = Data(i)) 
       If ShowMe Then 
        'Quit Early If You ShowMe 
        Exit For 
       End If 
      Next i 
      PivotItem.Visible = ShowMe 
     Next PivotItem 
    End If 

End Sub 
関連する問題