2017-08-04 1 views
0

マクロを実行してワークブックを保存するときに、マクロが接続テーブルやピボットテーブルを適切にリフレッシュしないという問題があります。コードがさらに移動する前に接続とピボットテーブルの更新を完了する方法

backgroundquery = false(これはMicrosoft Scripting Runtimeが参照に追加されていても動作しませんでした)とさまざまなタイプの更新が設定されましたが、まだ問題は残ります。 接続は、別のブックのシートにリンクされた単なるテーブルです。

ここで(両方が大きくルーチン、これ民間潜水艦の一部である)を保存ワークブックによって、後に続いているリフレッシュのための私のコードです:リフレッシュを確保する方法上の任意のアイデアが

Private Sub RefreshPivotTables() 

Dim WkC As PivotTable, WkAC As PivotTable 

Set WkC = ThisWorkbook.Worksheets("Contracts").PivotTables("Contracts") 
Set WkAC = ThisWorkbook.Worksheets("All Contracts").PivotTables("All Contracts") 

ThisWorkbook.Connections("Contracting Expiry Report Master File").Refresh 
'Reading about it, I was using both Refresh Table and Cache Refresh together with Update thinking it might help 
With WkC 
    .RefreshTable 
    .PivotCache.Refresh 
    .Update 
End With 
With WkAC 
    .RefreshTable 
    .PivotCache.Refresh 
    .Update 
End With 

End Sub 

Private Sub SaveWorkbookNewMonth() 

Dim dt As String 

dt = Format(CStr(Now), "mmmm yyyy") 
ThisWorkbook.SaveAs Filename:="C:\Users\" & Environ$("username") & "\Desktop\Expiry Report Aviation, Asphalt, BS and International Marine - " & dt & ".xlsm", _ 
    FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False 

End Sub 

されますコードを前進させずに完成させていただければ幸いです。

EDIT:

最後にバックグラウンドクエリが解決し、それが原因で保護されたブックに働いていなかったことに気づきませんでした。

新しい作業コード:

Private Sub RefreshConnectionAndPivotTables() 

Dim WkC As PivotTable, WkAC As PivotTable 

Set WkC = ThisWorkbook.Worksheets("Contracts").PivotTables("Contracts") 
Set WkAC = ThisWorkbook.Worksheets("All Contracts").PivotTables("All Contracts") 

ThisWorkbook.Protect Password:="pass", Structure:=False, Windows:=False 
ThisWorkbook.Connections("Contracting Expiry Report Master File").OLEDBConnection.BackgroundQuery = False 
ThisWorkbook.Connections("Contracting Expiry Report Master File").Refresh 
ThisWorkbook.Connections("Contracting Expiry Report Master File").OLEDBConnection.BackgroundQuery = True 
ThisWorkbook.Protect Password:="pass", Structure:=True, Windows:=True 
DoEvents 
WkC.RefreshTable 
WkAC.RefreshTable 

End Sub 

答えて

0

クエリの更新を呼び出した後にDoEventsdocumentation here)を使用できます。これは、リフレッシュが完了するまで待ってからVBAコードの次の行に進みます。

これをチェックアウトするquestion

+0

ちょうど試してみましたが、接続のリフレッシュの後、そしてピボットテーブルをリフレッシュした後に 'DoEvents'を追加しましたが、役に立たなくなりました。あなたがリンクしている他の投稿も読んだが、DoEventsは機能していないと言っていたので、今まで自分で試していなかった。 –

+0

投稿のリマインダーをありがとう、もう一度やり直してみて、私のバックグラウンドクエリが最初はうまくいかなかった理由を見つけました。 DoEvents自体は動作していないようだが、バックグラウンドクエリを無効にすることと組み合わせると、そのトリックを行うようだ。 –

0

は、私はあなたのピボットの値にデータcolumの数を追加して、ピボット数と総カウントレコードを照合することをお勧めします。 一致した場合は、再度ピケットをリフレッシュするか、再度リフレッシュしてください。

+0

ごめんなさい、どういう意味ですか? VBAのピボットテーブルで実際に作業していないので、あなたが提案したことを達成する方法がわかりません。 –

関連する問題