2010-08-27 3 views
1

Это Excel 2003. Я хотел бы знать, сколько времени потребуется для завершения внешнего запроса, а затем обновить ячейку в моей таблице с помощью этого ET. У меня есть следующие, но он не работает, потому что ET только до тех пор, как он принимает, чтобы начать обновление:Excel: сообщение VBA и refreshall закончилось?

Sub Refresh() 
    Dim StartTime, EndTime, ET 

    StartTime = Timer 
    ActiveWorkbook.RefreshAll 
    EndTime = Timer 
    ET = Format(EndTime - StartTime, "Fixed") 
    Range("H27").Value = ET 
    MsgBox (ET) 
End Sub 

Так ЕТ около 1 вторых, даже если данные выборки принимает хорошие 10 минут.

Легкий выход - это установить фоновое обновление в значение false, но это блокирует все приложение и делает жизнь несчастной в течение длительного времени.

Есть ли какой-либо сигнал или исключение, которое я могу поймать в VBA, который указывает «о, обновление фона сделано, теперь вы можете остановить свой таймер и вычислить ET»?

Спасибо!

ответ

1

Думаю, вам нужно использовать событие AfterRefresh.
Here - это дискуссия на форуме со счастливым концом и примерами.

Оклейка пример из упомянутой страницы, только для ссылок независимости (вы должны добавить память таймера и арифметику):

Этот код идет на модуле:

Dim X As New Class1 
Sub Initialize_It() 
    Application.DisplayAlerts = False 
    Application.ScreenUpdating = True 
    diropen = "C:\Desktop\" 

    Workbooks.Open diropen & "Test.xls" , UpdateLinks:=0 

    Set X.qt = Workbooks("Test.xls").Sheets("Sheet1").QueryTables(1) 
    ActiveWorkbook.RefreshAll 

End Sub 

Этот код распространяется на модуль класса:

Public WithEvents qt As QueryTable 
Private Sub qt_AfterRefresh(ByVal Success As Boolean) 
' Declare variables. 
Dim a As Integer 
Dim My_Prompt As String 

' Initialize prompt text for message box. 
My_Prompt = "Data refreshed or canceled." 

' Displays message box before refresh (or cancel) occurs. 
MsgBox My_Prompt 

ActiveWorkbook.Save 
Workbooks("Test.xls").Close 

End Sub 
Смежные вопросы