2017-08-30 57 views
0

を使用してピボットテーブルからpivotItemsの選択を解除する速度を上げます。次のコードでは、ワイルドカード "*"を使用して "xyznames"で始まるPivotItemを選択解除します。それは動作しますが、非常に遅いです。任意のアイデアは同じことを行うが、より速い?ワイルドカード*

Sub UncheckxyzName() 
'Purpose: Uncheck "xyzname* from Pivot tables from "Comparison" tab 

Dim pt As PivotTable 
Dim myPI As PivotItem 

'stop Excel actions for speed enhancement 
With Excel.Application 
    .ScreenUpdating = False 
    .EnableEvents = False 
    .Calculation = Excel.xlCalculationManual 
    .DisplayStatusBar = False 
End With 

'uncheck "xyzname*" from "Comparison" tab 
With Worksheets("Comparison").PivotTables("PivotTable1").PivotFields("Type") 
    .PivotItems("fnBid").Visible = False 
End With 

With Worksheets("Comparison").PivotTables("PivotTable1").PivotFields("Resource Name") 

For Each myPI In .PivotItems 
myPI.Visible = True 
Next myPI 

For Each myPI In .PivotItems 
    If myPI.name Like "xyzname*" Then 
     myPI.Visible = False 
    Else 
     myPI.Visible = True 
    End If 
    Next myPI 
End With 

'Turn back on Excel actions 
With Excel.Application 
    .DisplayStatusBar = True 
    .Calculation = Excel.xlCalculationAutomatic 
    .EnableEvents = True 
    .ScreenUpdating = True 
End With 

End Sub 

関連のポストへ:

excel macro vba Filtering using wildcards

答えて

1

このループ:

For Each myPI In .PivotItems 
myPI.Visible = True 
Next myPI 

不要である、あなたは、二回すべての項目を反復処理は、一度それらをすべて表示して、目に見えるかを作りますLikeに基づいています。あなたのマクロが遅い理由を仮定すると、PivotItemsという膨大な量のループを繰り返してこのループを削除すれば、2倍高速になります。

+0

btw、いくつの 'PivotItems'がありますか? – avb

+0

良いキャッチ、avb。そのコードを削除して再実行しました。それは少し速いですが、倍の速さではありません。あなたのアドバイスは確かに時間を短縮するのに役立ちました。 3つの異なるワークシート上で3つのピボットを介してコード全体がループしています。各ピボットには約368ピボットアイテム。 – XLmatters

+0

これらのワイルドカード項目をループせずにチェックを外す別の方法があるのだろうか? – XLmatters