2013-04-25 14 views
6

Trong bài cuối cùng của tôi Auto refresh pivottables data in excel on first run, tôi phát hiện ra rằng trên thực hiện đầu tiên của tôi các truy vấn từ nguồn dữ liệu bên ngoài được làm mới và mất khoảng 1 phút để thực hiện. và trong lần chạy thứ hai của tôi, các bảng tổng hợp được cập nhật.refresh cả các nguồn dữ liệu và trục bảng bên ngoài cùng nhau trong một thời gian biểu

Có giải pháp (Mã VBA) để làm mới cả nguồn dữ liệu ngoài và bảng tổng hợp trong một lịch trình thời gian (Nếu giả sử chúng tôi đặt hẹn giờ) bằng cách nhấp vào command button?

+0

'điều đầu tiên' có nghĩa là bạn phải chắc chắn truy vấn của mình được làm mới trước khi bạn cập nhật PT. tùy thuộc vào cách bạn tạo truy vấn của mình, bạn có thể kiểm soát sự kiện 'AfterRefresh' như được mô tả (hoặc tương tự) thành [mô tả đó] (http://msdn.microsoft.com/en-us/library/ff835922%28v=office.14 % 29.aspx) ... hơn bạn có thể làm mới bạn PT chắc chắn dữ liệu của bạn được cập nhật. –

+0

Dữ liệu của tôi được cập nhật hàng đêm. – user42995

+0

còn 'Application.OnTime' thì sao? –

Trả lời

17

Trong thuộc tính kết nối, bỏ chọn "Bật làm mới nền". Điều này sẽ làm cho việc làm mới kết nối khi được yêu cầu, không phải trong nền khi các quá trình khác xảy ra.

Với tính năng làm mới nền bị tắt, thủ tục VBA của bạn sẽ đợi dữ liệu ngoài làm mới trước khi chuyển sang dòng mã tiếp theo.

Sau đó, bạn chỉ cần sửa đổi đoạn mã sau:

ActiveWorkbook.Connections("CONNECTION_NAME").Refresh 
Sheets("SHEET_NAME").PivotTables("PIVOT_TABLE_NAME").PivotCache.Refresh 

Bạn cũng có thể tắt refresh background trong VBA:

ActiveWorkbook.Connections("CONNECTION_NAME").ODBCConnection.BackgroundQuery = False 
+0

Cảm ơn bạn, tôi đã đặt 'BackgroundQuery' thành' false'. Tôi đã giải quyết vấn đề của tôi mà tôi đã chỉ định trong bài viết trước đó của tôi. Cảm ơn bạn rất nhiều vì đã dành thời gian quý giá của bạn. – user42995

+0

Cảm ơn bạn, đây là một câu trả lời hiển thị và súc tích !! Tôi cũng muốn cập nhật các bảng Pivot của mình mà không làm mới nguồn dữ liệu và tôi nghĩ rằng tôi cần một phép lạ. – fuadj

8

tôi đã sử dụng các câu trả lời trên nhưng đã sử dụng phương pháp RefreshAll. Tôi cũng đã thay đổi nó để cho phép nhiều kết nối mà không cần phải chỉ định tên. Sau đó tôi liên kết nút này với một nút trên bảng tính của tôi.

Sub Refresh() 

    Dim conn As Variant 

    For Each conn In ActiveWorkbook.Connections 
     conn.ODBCConnection.BackgroundQuery = False 
    Next conn 

    ActiveWorkbook.RefreshAll 
End Sub 
0

Auto Refresh Workbook ví dụ mỗi 5 giây. Áp dụng đến module

Public Sub Refresh() 
'refresh 
ActiveWorkbook.RefreshAll 

alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss 
    Application.OnTime alertTime, "Refresh" 

End Sub 

Apply to Workbook vào Open

Private Sub Workbook_Open() 
alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss 
Application.OnTime alertTime, "Refresh" 
End Sub 

:)

4

Tôi nghĩ rằng có một cách đơn giản hơn để làm cho excel chờ đợi cho đến khi làm mới được thực hiện, mà không phải đặt thuộc tính Truy vấn nền thành Sai. Tại sao lộn xộn với sở thích của người dân phải không?

Excel 2010 (và sau này) có phương thức này được gọi là CalculateUntilAsyncQueriesDone và tất cả những gì bạn phải làm là gọi nó sau khi bạn đã gọi phương thức RefreshAll. Excel sẽ đợi cho đến khi việc tính toán hoàn tất.

ThisWorkbook.RefreshAll 
Application.CalculateUntilAsyncQueriesDone 

Tôi thường đặt những thứ này lại với nhau để thực hiện tổng thể tính toán mà không bị gián đoạn, trước khi gửi mô hình của mình cho người khác. Một cái gì đó như thế này:

ThisWorkbook.RefreshAll 
Application.CalculateUntilAsyncQueriesDone 
Application.CalculateFullRebuild 
Application.CalculateUntilAsyncQueriesDone 
Các vấn đề liên quan