2017-04-04 28 views
1

編集:ピボットキャッシュがリフレッシュする必要があるかどうかを確認する方法はありますか?

Shai - あなたの答えに感謝します。しかし、それは私の目的のためには機能しません。私はいくつかのダミーデータとピボットテーブルを作成し、元のデータのいくつかを変更し、あなたのコードはまだキャッシュがデータと同一であると言いました。これは、範囲内の変更ではなく、全体的な範囲の変更を探しているからです。

私はこのドキュメントを使用しています。特に、下記の使用者のPivotCache.SourceDataメンバーを使用しています。私がやりたいことはできないと思います。私は開いているこの質問を残しておきます

Sub checkCache() 

Dim ptTbl As PivotTable, pvtCache As PivotCache 

Set ptTbl = Sheets("Sheet2").PivotTables("PivotTable2") 
Set pvtCache = ActiveWorkbook.PivotCaches.Create(xlDatabase, ptTbl.PivotCache.SourceData) 

If pvtCache = ptTbl.PivotCache Then 'error on this line, cannot compare two pivot caches like this 
    MsgBox "True" 
Else 
    MsgBox "False" 
End If 

End Sub 

:私が見つけた最高のは、元のソースデータから新しいピボットキャッシュを作成し、これが不可能であるが、その後、何とか直接平等を使用して(それらを比較することです場合の数日間、それ以上に良いアイデアがある。

ショートバージョン

私は、彼らがピボットをリフレッシュする必要があること、ピボットテーブルの基になるデータが変更されたときに、ユーザーに強調表示する必要があるとキャッシュ。私はperformancのためにすべての相互作用のピボットテーブルをリフレッシュすることはできませんe問題。

現時点では、私はIFの式でピボットテーブルの合計がシート合計と同じであるかどうかを確認していますが、数値以外のデータでは機能しません。より良い方法がありますか?

ロングバージョン

私は以下のように分類されているデータの数千行を持っている以下(すなわち、変更される可能性があり、いくつかのカテゴリと数字)。

Name Category 1 Category 2 Number  Number 2 Category 3... etc. 
Angela  A   X   123 
Bob   A   Y   442 
Bob   A   Y   566 
Charlie  B   X   1445 
Angela  A   X   5641231 
Dave  B   Y   435 
Dave  B   Y   45645 
Charlie  B   X   567 

私の問題は、私は、ピボットテーブルがリフレッシュ必要がある場合(すなわち、ソースデータは、ピボットキャッシュと異なる場合)チームに(と私)をハイライトしたいということです。

ブックが大きく、計算に時間がかかるので、ユーザーがシートとやりとりするたびに自動的にピボットテーブルを更新したくありません。それは標準的な会社のワークブックです。私はそれをスピードアップするためにいくつかの改良を加えましたが、私は大規模な変更を加えることはできません。

私はSUMIFなどを使ってサマリーテーブルを自動的に更新することができますが、この場合は実行できません。現時点で

、私はちょうどので、ユーザは、ピボットテーブルを更新するためにそれらを伝える鮮やかな赤のセルが表示されます

=IF(total from summing up workbook directly = pivot table total, "Pivot table OK", "Pivot table needs refreshing") 

を言ういくつかの明るい赤色条件付き書式設定IF文を組み合わせています。

私の問題は、これが数値データに対してのみ機能することです。数値以外のデータが変更された場合、ピボット・テーブルはリフレッシュする必要がありますが、この方法は機能しません。

各カテゴリの各ラベルの出現を数えて、ピボット・キャッシュから数え上げるピボット・テーブルに対してこれをチェックすることができますが、これは多くの作業になります。これはExcelやVBAの別の方法で実行できますか?

+0

アプローチは、別のシートにピボットテーブルのデータを保持している表を入れ、その後にVBAを使用して)誰が作ったかどうかを確認することですそのテーブルに変更し、b)そのデータシートが非アクティブ化されたときにピボットを更新する。このようにして、ユーザーはソースデータに複数の変更を加えることができますが、レポートシートに戻ったときにのみ更新されます。それはあなたのために働くだろうか? – jeffreyweir

+0

@jeffreyweirそれは良いアプローチのように聞こえる、私はそれを調べます。本質的には、私はちょうどレポートシートをクリックし、チェックを行うイベントをキャプチャします – Jonathan

+0

@ジョナサンあなたは私の答えを下に読みましたか?私のコードをテストする?どんなフィードバック? –

答えて

0

現在のPivotTable.PivotCache.SourceDataと、(ピボットテーブルを占有する)シート内のデータとを比較することができます。

Stringの値が同じ場合は、PivotCacheを更新する必要はなく、PivotTableを更新する必要はありません。値が同じでない場合は、データ構造が変更されたことを意味します(行と列が追加または削除された回数が増えています)。PivotCacheRefreshPivotTableに更新する必要があります。私は過去に使用した

コード

Option Explicit 

Sub CheckPivotCacheRefresh() 

Dim PvtSht   As Worksheet 
Dim DataSht   As Worksheet 

Dim PTTbl   As PivotTable 
Dim SrcData   As String 
Dim LastRow   As Long 
Dim LastCol   As Long 

Set DataSht = Worksheets("Sheet1") ' modify "Sheet1" to your sheet's name where your Pivot Data exists 
Set PvtSht = Worksheets("Sheet2") ' modify "Sheet2" to your sheet's name where your Pivot Table exists 

' find occupied Data Range for Pivot (starting from Cell "A1") 
With DataSht 
    LastRow = .Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row 
    LastCol = .Cells.Find("*", searchorder:=xlByColumns, searchdirection:=xlPrevious).Column 

    SrcData = .Name & "!" & .Range(.Cells(1, 1), .Cells(LastRow, LastCol)).Address(ReferenceStyle:=xlR1C1) 
End With 

' add this line in case the Pivot table doesn't exit 
On Error Resume Next 
Set PTTbl = PvtSht.PivotTables("PivotTable1") ' set "PivotTable1" in your Pivot sheet 

With PTTbl 
    If .PivotCache.SourceData Like SrcData Then 
     MsgBox "Pivot Cache Source Data and current Data are identical : " & SrcData 
    Else 
     MsgBox "Pivot Cache Source Data is : " & .PivotCache.SourceData & ", " & vbCr & _ 
       " while current Data is : " & SrcData 
    End If 

End With 

End Sub 
関連する問題