2017-05-31 172 views
0

組織の複数の異なる詳細を調べているスプレッドシートがあります。すべてのフィールドは、すべてのデータセットに存在する「コストセンター」とは別の異なるデータセットでは異なります。Excel 2010 VBA - スライサー値が存在するかどうかを確認します。

各データセットには、独自のピボットテーブルとスライサーのセットがあります。私は選択されたスライサーと一致する各テーブルのためのcostcentreスライサーを作るように探しています。

両方のスライサーが同じ値を持っていても、変更されたスライサーが選択されたスライサーの値を持たない場合はすべての値を選択しています。したがって、状態を変更する前に値が存在するかどうかをチェックし、状態が変化しない場合は複数の値を選択できますが、値が存在するかどうかを確認する方法はありませんそれ以外の場合は、コードの各ビットごとに次の値に移動します。どのように行うか、元の目標を達成するための簡単な方法についてのアドバイスは、非常に高く評価されます。

以下は私のVBAコードです。私は実際にVBAのいずれかの経験を持っていないのでご注意ください、これは、このサイト上で答えを検索し、でスロー試行錯誤の少しと関連するように見えたビットをコピーすることから構成されています。

Sub test() 
Dim sc1 As SlicerCache 
Dim sc2 As SlicerCache 
Dim si1 As SlicerItem 
Dim si2 As SlicerItem 

Set sc1 = ThisWorkbook.SlicerCaches("Slicer_CC1") 
Set sc2 = ThisWorkbook.SlicerCaches("Slicer_CC") 

Application.ScreenUpdating = False 
Application.EnableEvents = False 

sc2.ClearManualFilter 



For Each si1 In sc1.SlicerItems 
     sc2.SlicerItems(si1.Name).Selected = si1.Selected 
     On Error Resume Next 
Next si1 


    MsgBox "Update Complete" 

clean_up: 
     Application.EnableEvents = True 
     Application.ScreenUpdating = True 
     Exit Sub 

err_handle: 
     MsgBox Err.Description 
     Resume clean_up 
End Sub 
+0

スライサーは、ピボット・キャッシュを共有している限り、複数のピボット・テーブルに接続できます。ピボットテーブルの各セットは異なるデータセットに基づいているため、ピボットキャッシュは異なります。あるPivotCacheに値が存在し、他のPivotCacheに値がない場合は、CostCentreフィールドに問題が発生します。 N.b. PowerPivotへのアクセス権がある場合、PowerPivotを使用することができれば、データセットをリンクすることができるため、すぐに問題を解決できます。 –

+0

確かに、私の計画がパワーピボットに頼っていたのですが、私たちのITサポート機能がアドインを削除したことが判明しました(すべてパワーアドバンテージに対するランダムな復讐だけでなく、それらのいずれかをインストールします。したがって、私がVBAの世界を掘り下げる必要があるのはわかっています:-) – LCousins

+0

Slicerにはアイテムが存在し、最初に設定されたSlicerではなく(たとえば、どこから同期したいかなど)その項目を選択する必要がありますか?同じアイテムがない場合はどうなりますか? –

答えて

1

手始めに:次のようにループでパーツを変更してもエラーは発生しません。 slicer1の項目が更新中の項目に存在する場合は、その名前に基づいて最初のスライサーから選択されます。あなた場合は、sc2.ClearManualFilter

を使用して初期選択をクリアしかし、最初のものでは利用できない秒スライサーにある項目は、このシナリオではどんな選択されません

On Error Resume Next 
For Each si1 In sc1.SlicerItems 
    Set si2 = sc2.SlicerItems(si1.Name) 
    If Not si2 Is Nothing Then 
     si2.Selected = si1.Selected 
    End If 
Next si1 
On Error GoTo 0 

、その動作を反転したいが使用:

On Error Resume Next 
For Each si2 In sc2.SlicerItems 
    Set si1 = sc1.SlicerItems(si2.Name) 
    If Not si1 Is Nothing Then 
     si2.Selected = si1.Selected 
    Else 
     si2.Selected = False 
    End If 
Next si2 
On Error GoTo 0 

この場合には、何も(すべて選択)、フィルタが適用されません(該当する項目が存在しないため)は、第2のスライサーに選択されていない場合。

もちろん、sc2.ClearManualFilter行を省略することもできます。この方法では、上記の最初のオプションを使用して各項目をslicer1と等しくするようにトリガーします。残りの選択肢は、スクリプトが実行される前の状態にとどまります。

これが役に立ちます。

+0

素晴らしい、働いている、素敵でシンプルなロジックがあまりにも大丈夫! – LCousins

関連する問題