2016-09-23 1 views
0

Я пытаюсь открыть файлы excel, запущенные из Интернета, а затем скопировать данные в другой файл excel во время выполнения vba с их командами.(Приоритет команд VBA) Как сначала открыть файлы excel из Internet Explorer во время запуска vba?

Но команда, открывающая файл excel, выполняется после концов кода vba независимо от их положения.

Например, внизу код показывает весь процесс загрузки и открытия файла excel с сайта. Но в функции «open_excel» «InvokePattern.Invoke» на самом деле происходит после выполнения всех vba-кодов.

Как выполнить это сначала? Могу ли я отдать предпочтение этой команде?

Или как подождать «InvokePattern.Invoke» до тех пор, пока это не закончится? (Стараюсь время ожидания или виды манипуляции времени, который не работает)

Sub crawler_main() ' this is main function 

    ..... 
    Call ieopen(ie, url_futures) 'internet explorer is opened with some url 
    Call click_excel(ie) 
    Call open_excel(ie) 
    Call copy_data(wbname) 
    ..... 

End Sub 

Sub ieopen(ie As InternetExplorer, url As String) ' open ie 

    Set ie = CreateObject("InternetExplorer.Application") 
     ie.Visible = True 
     ie.navigate url 

    Do Until (ie.readyState = 4 And Not ie.Busy) 
     DoEvents 
    Loop 
    Application.Wait (Now + TimeValue("00:00:05")) 
End Sub 

Sub click_excel(ie As InternetExplorer) 'download excel 

    Dim inquiry As Object 
    Set inquiry = ie.document.getElementsByClassName("btn-board btn-board-search")(0) 
    inquiry.Click 

    Do Until (ie.readyState = 4 And Not ie.Busy) 
     DoEvents 
    Loop 

    'Application.Wait (Now + TimeValue("00:00:05")) 
    Dim Buttons_Excel As Object 
    Dim Button As Object 
    Set Buttons_Excel = ie.document.getElementsByTagName("button") 

    For Each Button In Buttons_Excel 
     If Button.innerHTML = "Excel" Then 
      Button.FireEvent ("onclick") 
      Exit For 
     End If 
    Next 

End Sub 

Sub open_excel(ie As InternetExplorer) 'click open in dialog open/save 

    Dim e As IUIAutomationElement 
    Dim o As CUIAutomation 
    Set o = New CUIAutomation 

    Dim h As Long 

    h = ie.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, "열기") 

    Dim Button_Download As IUIAutomationElement 
    Set Button_Download = e.FindFirst(TreeScope_Subtree, iCnd) 

    Dim InvokePattern As IUIAutomationInvokePattern 
    Set InvokePattern = Button_Download.GetCurrentPattern(UIA_InvokePatternId) 

    InvokePattern.Invoke 

End Sub 

Sub copy_data(wbname As String) 'copy data from recently opened file. 
'But here is problematic since file is open after the execution of all vba codes 

    For Each wb In Application.Workbooks 
     If wb.Name Like "dat" & "*" Then 
      Set wb_data = Workbooks(wb.Name) 
      Exit For 
     End If 
    Next wb 

    ............ 

End Sub 

ответ

1

Это может быть уместным: http://msdn.microsoft.com/en-us/libr...87(VS.85).aspx

Обратите внимание, что вы можете использовать в реальное время, которая выше, но вам придется установить разрешение чтобы сделать это ... Код:

Sub SetPriority() 
    Const ABOVE_NORMAL = 32768 
    Const HIGH = 128 
    strComputer = "." 
    Set objWMIService = GetObject("winmgmts:" _ 
     & "{impersonationLevel=impersonate}!\\" _ 
     & strComputer & "\root\cimv2") 
    Set colProcesses = objWMIService.ExecQuery _ 
     ("Select * from Win32_Process Where Name = 'excel.exe'") 
    For Each objProcess In colProcesses 
     objProcess.SetPriority (HIGH) 
    Next 
End Sub 
+1

Спасибо за CommNet, Но гиперссылка свернута, могли бы вы дать мне полный адрес? – JonghoKim