2013-09-13 33 views
5

Tôi muốn lặp qua một thư mục (sử dụng C#) và Làm mới tất cả các trang tính Excel trong đó. Tôi sử dụng:Đợi bảng tính.RefreshAll() (C#)

Workbook.RefreshAll(); 

Làm thế nào tôi có thể chờ đợi báo cáo kết quả Workbook.RefreshAll() để kết thúc?

Vấn đề là: Tôi mở FileA, then Workbook.RefreshAll() và sau đó mở FileB - Làm mới cho FileA bị chấm dứt. Giải pháp duy nhất tôi thấy là để gọi một cái gì đó giống như

System.Threading.Thread.Sleep(20000); 

mà tôi tìm thấy rất có duyên ...

Không ai biết một cách tốt hơn để chờ đợi?

+0

bản sao có thể có của [Làm mới vba Excel chờ đợi] (http://stackoverflow.com/questions/8925403/excel-vba-refresh-wait) –

Trả lời

2

Nếu bạn đi qua Workbook của bạn và thiết lập các BackgroundQuery tài sản của tất cả các của bạn QueryTable s đến false, RefreshAll sẽ kết thúc trước khi tiếp tục.

foreach (Worksheet worksheet in workbook.Worksheets) 
{ 
    foreach (QueryTable table in worksheet.QueryTables) 
     table.BackgroundQuery = false; 
} 

//This will finish executing before moving on 
workbook.RefreshAll(); 
3

Cập nhật 2016/05/31 ...

Nhờ sự giúp đỡ của bạn. Tôi tìm thấy giải pháp sau đây:

foreach (MSExcel.WorkbookConnection cnn in wb.Connections) 
{ 
    if (cnn.Type.ToString() == "xlConnectionTypeODBC") 
    { 
     cnn.ODBCConnection.BackgroundQuery = false; 
    } 
    else 
    { 
     cnn.OLEDBConnection.BackgroundQuery = false; 
    } 
} 

Frank

+0

Bạn đang cập nhật mọi kết nối sổ làm việc một lần cho mỗi trang tính, vòng lặp ngoài là vô nghĩa . –

0

Mã dưới đây sẽ làm việc một cách hoàn hảo khi excel của bạn phải chạy truy vấn nền để kéo dữ liệu từ SQL Server/MS Access và nó sẽ đợi cho truy vấn thành công .

public void RefreshSheet(Excel.Application Excel, Excel.Workbook WB) 
{ 
    WB.RefreshAll(); 
    Excel.Application.CalculateUntilAsyncQueriesDone(); 
    WB.save(); 
} 

Đây WB là sổ làm việc và Excel là ứng dụng Excel được khai báo trong mã của bạn.

Các vấn đề liên quan