2012-04-19 22 views
3

2つのことを行うワークシートがあります。続行する前にExcel VBAで外部のブックブックのリンクが更新されるまで待つ

最初に、SQL ServerからODBCデータテーブルを更新し、データテーブルの1つを更新して、別のExcelスプレッドシートへの参照を含む式を追加します。

第2に、上記の更新されたテーブルのデータに基づくピボットテーブルを更新します。

ただし、ピボットテーブルを更新してソーステーブル内のデータを更新する前に、ソーステーブル間のデータが不一致になります(ピボットテーブルが再構築中であっても更新されます)。続行する前に外部リンクの完全なリフレッシュを待つようにVBAに依頼する方法はありますか?

これは私のコードです:

Sub Update_All() 

Application.ScreenUpdating = False 

Application.Calculation = xlCalculationManual 
ODBC_Tables_Update 
UpdateReqTable 
' force a calculation of the table due to insert of formula and lookup in the campaign plan 
With Application 
    .CalculateFull 
    .Calculation = xlCalculationAutomatic 
End With 
'update pivot after calculation is done 
OverviewUpdatePivot 

Application.ScreenUpdating = True 

End Sub 

Private Sub ODBC_Tables_Update() 

With ActiveWorkbook 
    .Connections("Pallet Requirement").Refresh 
    .Connections("Pallets on Stock").Refresh 
End With 

End Sub 

Private Sub OverviewUpdatePivot() 

With Sheets("Overview").PivotTables("pvt_PalletOverview") 
    .PivotCache.Refresh 
    .PivotFields("Start Date").AutoSort xlAscending, "Start Date" 
    .PivotFields("PALLETITEM").AutoSort xlAscending, "PALLETITEM" 
    .PivotFields("Start Date").ShowDetail = False 
End With 

End Sub 

Private Sub UpdateReqTable() 

' general variables 
Dim cpPath$ 'Campaign Plan Path 
Dim cpName$ 'Campaign Plan File Name 
Dim cpL93$ 'Sheet 93 name 
Dim cpL94$ 'Sheet 94 name 
Dim cpL96$ 'Sheet 96 name 
Dim ListNoCol$ 'Column Letter of List Numbers 
Dim StartDateCol$ 'Column Letter of "Start Date" 
Dim tblMatchPart$ 'JOBLIST field of table 

' below index building part strings defined 
Dim cpL93ListNoRange$ 
Dim cpL94ListNoRange$ 
Dim cpL96ListNoRange$ 
Dim cpL93DateRange$ 
Dim cpL94DateRange$ 
Dim cpL96DateRange$ 
Dim L93MatchFormulaPart$ 
Dim L93IndexFormula$ 
Dim L94MatchFormulaPart$ 
Dim L94IndexFormula$ 
Dim L96MatchFormulaPart$ 
Dim L96IndexFormula$ 

' Fill in values from the sheet into variables 
cpPath = Range("cpPath") 
cpName = Range("cpName") 
cpL93 = Range("cpSheetL93") 
cpL94 = Range("cpSheetL94") 
cpL96 = Range("cpSheetL96") 
ListNoCol = "$" & Range("cpListNoCol") & "1" & ":" & "$" & Range("cpListNoCol") & "64000" 
StartDateCol = "$" & Range("cpStartDateCol") & "1" & ":" & "$" & Range("cpStartDateCol") & "64000" 
tblMatchPart = "tbl_PalletReq[@JOBLIST]" 

' Build the range expressions used in the MATCH and INDEX formula 
cpL93ListNoRange = "'" & cpPath & "[" & cpName & "]" & cpL93 & "'!" & ListNoCol 
cpL93DateRange = "'" & cpPath & "[" & cpName & "]" & cpL93 & "'!" & StartDateCol 
cpL94ListNoRange = "'" & cpPath & "[" & cpName & "]" & cpL94 & "'!" & ListNoCol 
cpL94DateRange = "'" & cpPath & "[" & cpName & "]" & cpL94 & "'!" & StartDateCol 
cpL96ListNoRange = "'" & cpPath & "[" & cpName & "]" & cpL96 & "'!" & ListNoCol 
cpL96DateRange = "'" & cpPath & "[" & cpName & "]" & cpL96 & "'!" & StartDateCol 

' Build the INDEX formulas required 
L93MatchFormulaPart = "MATCH(" & tblMatchPart & "," & cpL93ListNoRange & ",0)" 
L93IndexFormula$ = "INDEX(" & cpL93DateRange & "," & L93MatchFormulaPart & ",0)" 
L94MatchFormulaPart = "MATCH(" & tblMatchPart & "," & cpL94ListNoRange & ",0)" 
L94IndexFormula$ = "INDEX(" & cpL94DateRange & "," & L94MatchFormulaPart & ",0)" 
L96MatchFormulaPart = "MATCH(" & tblMatchPart & "," & cpL96ListNoRange & ",0)" 
L96IndexFormula$ = "INDEX(" & cpL96DateRange & "," & L96MatchFormulaPart & ",0)" 

'Insert Formulas into table tbl_PalletReq and format the formulas 
With Range("tbl_PalletReq[L93 Date]") 
    .Formula = "=" & L93IndexFormula 
    .NumberFormat = "ddd-dd-mm-yyyy" 
End With 
With Range("tbl_PalletReq[L94 Date]") 
    .Formula = "=" & L94IndexFormula 
    .NumberFormat = "ddd-dd-mm-yyyy" 
End With 
With Range("tbl_PalletReq[L96 Date]") 
    .Formula = "=" & L96IndexFormula 
    .NumberFormat = "ddd-dd-mm-yyyy" 
End With 
With Range("tbl_PalletReq[Start Datetime]") 
    .Formula = "=IFERROR([@[L93 Date]],IFERROR([@[L94 Date]],IFERROR([@[L96 Date]],"""")))" 
    .NumberFormat = "ddd-dd-mm-yyyy hh:mm" 
End With 
With Range("tbl_PalletReq[Start Date]") 
    .Formula = "=DATE(YEAR([@[Start Datetime]]),MONTH([@[Start Datetime]]),DAY([@[Start Datetime]]))" 
    .NumberFormat = "ddd-dd-mm-yyyy" 
End With 
With Range("tbl_PalletReq[Est. Pallets]") 
    .Formula = "=ROUNDUP(-[PROD.TONS]*1000/VLOOKUP([@PALLETITEM],tbl_PalletData,2,FALSE),0)" 
    .NumberFormat = "#,##0" 
End With 

End Sub 

答えて

1

あなたの接続のプロパティを確認し、「有効に背景の更新」オプションを無効にする必要があります。

または、コードでbackgroundqueryプロパティをfalseに設定します。

これで、続行する前にクエリが終了するのを待つように強制する必要があります。

+0

このプロパティは既にfalseに設定されていますが、VBAではコード化されていません。 –

+0

私はその声明を修飾する必要があります。エラーの原因であるODBC接続によるテーブルの更新ではなく、作成されたINDEX(MATCH)の式がイントラネット上の容量プランスプレッドシートにアクセスする必要があるフィールドのデータを更新するのにかかる時間です。ピボットテーブルは、クエリの実行後、データが日付列に取り込まれる前に更新されます。 –

+0

ピボットキャッシュのバックグラウンドクエリをfalseに設定してみましたか?ピボット更新前: 'Worksheets(" Overview ")。PivotTables(" pvt_PalletOverview ")。PivotCache.BackgroundQuery = False' – Reafidy

0

この問題がありました。 Readifyの答えはぴったりだった。ここに私のコードです。

Range("Table_sqlserver_database[[#Headers],[column_name]]").Select 
    With Selection.ListObject.QueryTable 
     .BackgroundQuery = False 
    End With 
+0

こんにちは、steveno。これらの議論は何ですか? [#Headers]、[column_name]] – kurp

+0

引数は列名です。あなたはそれらを無視することができます。 – steveno

関連する問題