VBA: Как дождаться завершения загрузки Excel? - PullRequest
1 голос
/ 30 октября 2019

У меня есть макрос, который переходит на серию веб-страниц, загружает Excel с этих страниц, а затем объединяет данные в открытой рабочей книге. Однако мой код не работает, потому что он не может найти недавно загруженную книгу. Когда я шагаю по коду, проблем нет. Предположительно мой код продолжает выполняться, но поскольку недавно загруженная рабочая книга еще не открыта, она завершается неудачей.

Я попытался создать цикл, который ожидает открытия загруженной книги, но кажется, что рабочая книга не может открыться, покацикл работает.

Как я могу «ждать» в моем коде, пока рабочая книга не будет открыта и мой код не сможет продолжить? Любые отзывы приветствуются, спасибо!

appIE.document.getElementById("_id3805:_id3806:0:_id4177").Click 'click website download button
Dim o As IUIAutomation
Dim e As IUIAutomationElement, download_check As IUIAutomationElement
Set o = New CUIAutomation
Dim h As LongLong
h = appIE.Hwnd
h = FindWindowEx(h, 0, "Frame Notification Bar", vbNullString)
If h = 0 Then Exit Sub
Set e = o.ElementFromHandle(ByVal h)
Dim iCnd As IUIAutomationCondition
Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "Open")
Dim Button As IUIAutomationElement
Set Button = e.FindFirst(TreeScope_Subtree, iCnd)
Dim InvokePattern As IUIAutomationInvokePattern
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
InvokePattern.Invoke


Debug.Print "Download Successful, Click OK"

Application.Wait (Now + TimeValue("00:00:02"))
DoEvents
' This part searching active workbook
Dim xWBName As String
Dim GetBook As String
Dim xWb As Workbook

Do Until Application.Workbooks.Count > 1
'    'I am waiting for something to happen
    DoEvents
    Application.Wait (Now + TimeValue("00:00:01"))
    Sleep 1000
Loop

For Each xWb In Application.Workbooks
    'xWBName = xWb.Name 'xWBName & xWb.Name & vbCrLf
    DoEvents
    If InStr(xWb.Name, "Data") Then
     GetBook = xWb.Name
    End If
Next
DoEvents
'Activate the required workbook
**Set wb2 = Workbooks(GetBook)**

1 Ответ

0 голосов
/ 30 октября 2019

Я думаю, что ваш подход ко сну и doEvents - хороший способ решить эту проблему. Прежде чем открыть загруженную книгу, проверьте, не существует ли она в цикле сна, а затем выйдите из цикла.

If Dir(pathToFile) <> "" Then
    'File has been found
end if

РЕДАКТИРОВАТЬ: Я не вижу той части, где вы пытаетесь открыть файл. Порядок, в котором все должно происходить в вашем случае: 1. Загрузить файл 2. Цикл ожидания, в котором вы проверяете, был ли файл загружен 3. Откройте файл

цикл сна может выглядеть примерно так:

'Download the file here

dim fileFound as boolean
while not fileFound
    sleep(1000)
    DoEvents
    If Dir(pathToFile) <> "" Then
        fileFound = true
    end if
wend

'Open the file here
...