2013-09-13 19 views
5

Ich möchte ein Verzeichnis (mit C#) durchlaufen und alle Excel-Tabellen dort aktualisieren. Ich benutze:Warten auf Workbook.RefreshAll() (C#)

Workbook.RefreshAll(); 

Wie kann ich warten, bis die Workbook.RefreshAll() Anweisung zu beenden?

Das Problem ist: Ich öffne FileA, then Workbook.RefreshAll() und dann öffnen FileB - Aktualisieren für FileA ist beendet. Die einzige Lösung fand ich ist wie

etwas zu nennen
System.Threading.Thread.Sleep(20000); 

, die ich sehr unschön gefunden ...

Kennt jemand einen besseren Weg zu warten?

+0

möglich Duplikat von [Excel vba aktualisieren warten] (http://stackoverflow.com/questions/8925403/excel-vba-refresh-wait) –

Antwort

2

Wenn Sie Ihren Workbook durchlaufen und legen Sie die die BackgroundQuery Eigenschaft aller Ihre QueryTable s bis false, RefreshAll sollte beendet werden, bevor Sie weitermachen.

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

31.05.2016 aktualisiert ...

Vielen Dank für Ihre Hilfe. Ich fand die folgende Lösung:

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

Frank

+0

Sie aktualisieren jede Arbeitsmappe Verbindung einmal für jedes Blatt, die äußere Schleife ist sinnlos . –

0

Der Code unten wird perfekt funktionieren, wenn Ihre Excel hat Hintergrund Abfrage auszuführen Daten von SQL Server/MS Access zu ziehen und es wird warten, bis die Abfrage erfolgreich ist .

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

Hier WB ist die Arbeitsmappe und Excel ist die Excel-Anwendung in Ihrem Code deklariert.