2017-06-20 4 views
1

私は手動で作成されたピボットテーブルを持っています。ユーザーがレポートフィルタやスライサーでフィルタリングできないようにする必要がある方法がありますので、VBAを使用する方法を考えました。私はスケルトンのユーザフォームを作成しました。そして、その背後にあるコードを書くのは難しい段階です。VBAユーザーフォームを使用してピボットテーブルをフィルタリングする(特に、レポートフィルタとスライサーではできない方法で)

PivotFilters関数を使用しようとしていますが、これは機能しません。私はVBAの完全な初心者であることを認めます。それは私が作った単純なエラーかもしれません。あるいは、Pivo​​tFiltersは仕事の正しいツールではないでしょうか?次に例を示します。

'ok button - this is the big one, telling the button what to do with the selected options! 

Private Sub CommandButton1_Click() 

'targeting our familiar pivot table 

Dim pvt As PivotTable 
Set pvt = ActiveSheet.PivotTables("PivotTable1") 

'Whether to filter out low sample size brands 
Dim pvtFieldSasz As PivotField 
Set pvtFieldSasz = pvt.PivotFields("SampleSize") 

If OptionButton1 = True Then 

pvt.pvtFieldSasz.PivotFilters.ClearAllFilters 
pvt.pvtFieldSasz.PivotFilters.Add2 Type:=xlCaptionEquals, Value1:="Reliable Sample" 

End If 





End 

上記の例はレポートフィルタまたはスライサーで行うことができますものですが、私はそれをワンストップにするために、ユーザーフォームに関連するすべてのオプションをつけたかったですユーザーのための-shop。

「実行時エラー '438':オブジェクトがプロパティまたはメソッドをサポートしていません」というエラーメッセージが表示されます。

私は基礎を習得したいので、まだ難しいものにはまだ移行していません。

フィルターは、ユーザーが選択したオプションに応じて、3つの別々の列のいずれかを参照します。ユーザーには3つのオプションボタンがあり、そのうちの1つだけを選択できます。彼らがOptionButton1を選択した場合、ピボットテーブルをフィールドX = 1でフィルタリングしたいと思います。OptionButton2を選択すると、フィールドY = 1でフィルタリングする必要があります。OptionButton3は、Field Z = 1に対応します。 Zは実際にピボットテーブルに行または列として表示されますが、ソースデータの一部であり、ピボットテーブルの背後の選択に含まれます。

このつまずきの初心者を手助けしてくれてありがとう - どのヒントにも非常に感謝しています!

+0

エラーメッセージ –

+0

私はあなたの問題を発見し、答えを書いていますが、将来、エラーメッセージが表示されている行に、エラーメッセージの内容を追加する必要があります。 – OpiesDad

+0

良い点は、あります - ありがとう。 –

答えて

1

問題は、これらの2株である:

pvt.pvtFieldSasz.PivotFilters.ClearAllFilters 
pvt.pvtFieldSasz.PivotFilters.Add2 Type:=xlCaptionEquals, Value1:="Reliable Sample" 

まず、pvtFieldSaszは既にピボットフィールドを表します。 はピボット・テーブルのプロパティまたはメソッドではないため、で指定しようとすると機能しません。pvt代わりに、pvtFieldSaszを使用してください。これは直後の声明でも問題になります。

第2に、ClearAllFiltersメソッドは、pivotフィールドのPivotFiltersプロパティには適用されません。代わりに、pivotField自体に適用されます。動作するコードのためにこれらの2つの問題を組み合わせる

:問題を持つことができる追記として

pvtFieldSasz.ClearAllFilters 
pvtFieldSasz.PivotFilters.Add2 Type:=xlCaptionEquals, Value1:="Reliable Sample" 

、私はまた、代わりにActiveSheetとしてActiveSheetを使用してのシートを指定したいので、追加して編集し

Set pvt = Sheets("Sheet1").PivotTables("PivotTable1") 
+0

あなたの助けていただきありがとうございます - あなたの提案に続いて、エラーメッセージを排除しました。しかし、私のUserFormを送信しても、ピボット・テーブルは実際にはフィルタリングされません。私はフィルタリングしようとしているフィールドがピボットの行ではないので、これが問題なのかどうか疑問に思っていましたが、Microsoftのドキュメントでは「隠しフィールド」(つまり、「行、列、ページまたはデータ」フィールドとしては使用されません) PivotFieldsコレクションに属しています。私は、フィールド名と値が有効であることを確認していると思われるので、私はちょっと立ち往生しています... –

+0

上記の私のコメントに加えて、私は新しい質問をExcelフォーラムでは、ピボットテーブルに表示されていないフィールドでピボットフィルタが実際に動作しないようです。恥。 https://www.mrexcel.com/forum/excel-questions/1010679-visual-basic-applications-pivotfilters-no-effect-pivot-table-puzzled.html#post4851382 –

+1

この場合、新しい質問があります助けが必要です。ただし、これを実現するには、データセットに「ヘルパー」列を使用することをお勧めします。ボタンが非表示のセルをある値に変更するので、OptionButton1は別のシートのセルA1を「X」に変更します。あなたのデータの "ヘルパー"列には、IF(ヘルパー!$ A $ 1 = "X"、IF(フィールドXColumn2 = "1"、1、0)、IF(ヘルパー!$ A $ 1 = "Y "、IF(FieldYColumn2 =" 1 "、1,0)、....))'その後、「ヘルパー」列のピボットテーブルをフィルタリングします。非表示のセルを設定した後、ピボットテーブルを更新します。 – OpiesDad

関連する問題