2017-11-06 168 views
0

以下は私のスライサーの値を更新するために使用しているコードです。VBAを使用してスライサー値を更新できません

Sub country_select() 

Application.ScreenUpdating = False 

country_selected = ActiveSheet.Shapes(Application.Caller).Name 
ActiveWorkbook.SlicerCaches("Slicer_Country").ClearManualFilter 

For Count = 1 To 13 'countries 
country = Sheet5.Range("E2").Offset(Count, 0).Value 
If country = country_selected Then 
ActiveWorkbook.SlicerCaches("Slicer_Country").SlicerItems(country).Selected = True 
Else 

ActiveWorkbook.SlicerCaches("Slicer_Country").SlicerItems(country).Selected = 
False 
    End If 
Next Count 

Application.ScreenUpdating = True 

End Sub 

国変数は、(のみ値を取る)、その値を更新していません。 私はこれの理由を理解していません。 マップにマクロをリンクしようとしています。

+0

あなたは最近、かなりの数の質問をしてきましたが、まだ受け入れられていません任意の答え。あなたが尋ねた質問をどのように取り戻し、あなたの問題に最善の答えを受け入れるのですか? stackoverflow.com/help/someone-answersを参照してください。 – jeffreyweir

答えて

0

なぜE3:E14の範囲を介在する必要があるのか​​わかりません。あなたがしたいすべてのユーザが選択した形状に対応する項目を表示するようにスライサーを設定している場合、私はちょうどこのようなものを使用します:

Option Explicit 

Sub country_select() 

Dim si As SlicerItem 
Dim Country As String 

Dim sc As SlicerCache 

Application.ScreenUpdating = False 

Country = ActiveSheet.Shapes(Application.Caller).Name 
Set sc = ActiveWorkbook.SlicerCaches("Slicer_Country") 

With sc 
    .ClearAllFilters 
    For Each si In sc.SlicerItems 
     If si.Name <> Country Then si.Selected = False 
    Next si 
End With 


Application.ScreenUpdating = True 

End Sub 

注意をそのスライサーは(ピボットテーブルのためだった場合とPivotTableの.ManualUpdateプロパティをループの前にTRUEに設定し、後にFALSEに設定して、各SlicerItemが選択された後にPivotTableが更新しようとしなかったようにします。

これがピボットテーブル(テーブルではない)の場合は、スライサーを何度も繰り返す必要はありません(非効率的/遅い)。代わりに、ちょうどPageFieldとしてピボットに国フィールドを入れて、ちょうど直接PageFieldの.CurrentPageを設定し、そのよう:

Sub FilterPivot() 

Dim pf As PivotField 

Set pf = ActiveSheet.PivotTables("PivotTable1").PivotFields("Country") 
pf.CurrentPage = Application.Caller 

End Sub 
関連する問題