Я выполняю вызов ODBC для базы данных из формы VBA в Excel.Форма VBA указывает, что процесс выполняется, но если ODBC выполняется слишком долго (а иногда достигает 90-секундного тайм-аута), я получаю «не отвечающий»
, так как вызов ODBC представляет собой одну строкукод, я не могу вставить в DoEvents или любой из обычных способов обновления экрана.Я прочитал Почему VBA говорит "(не отвечает)", даже когда код работает нормально? , и это указывает на то, что мне нужен второй поток.Как мне это сделать?
Call ShowWait("Loading Case Procedures via ODBC", 3)
ShtCPP.AutoFilterMode = False
ShtDocs.AutoFilterMode = False
If ShtCPP.Cells(1, 1) = vbNullString Then ShtCPP.Range("A1:J1") = Array("Date", "Sess", "Thr", "Surgeon", "Case#", "MRN", "Patient", "Procedure", "CMBS", "DocId"): ShtCPP.Range("A1:J1").Font.Bold = True
ShtTL.Cells.Clear
ShtTL.Rows.Delete
vData = Array(Int(Now()), Int(Now()) + 7, vbNullString, "41")
If GetData(Case_Procedures, vData, True) Then
ShtCPP.Activate
Application.StatusBar = vbNullString
Call adjustCPPODBC(ShtTL)
Call loadCPPODBC(ShtTL)
Else
MsgBox "Connection failed to collect the procedures." & vbCrLf & _
"See status on Excel for more information." & vbCrLf & vbCrLf & _
"You may need to load Case Procedures from exported report."
If MsgBox("Do you want to mark the process as completed so it doesn't attempt to re-load from ODBC?", vbYesNo + vbDefaultButton2) = vbYes Then
ShtTables.Cells(2, 78) = Now()
End If
End If
ShtCPP.Activate
ShtCPP.AutoFilterMode = False
ShtDocs.AutoFilterMode = False
Call ShowWait(, , False)
ShowWait записывает текст в рамку на моей форме, в комплекте с doevents и т. Д. GetData выполняет все операции ODBC, включая загрузку данных на лист и закрытие ODBCподключение.Возвращает True
, если это работает, False
, если нет (обычно из-за тайм-аута)
Я пытаюсь создать поток, который регулярно обновляет фрейм, чтобы Excel не входил в "неотвечая ", что он может сделать, даже если вызов ODBC в итоге завершится успешно в течение 90-секундного тайм-аута.