Controllo di IE11 “Volete aprire / salvare” i pulsanti della finestra di dialogo in VBA

Dobbiamo scaricare automaticamente il file da un sito Web NASDAQ. Il mio codice VBA esistente sta aprendo una finestra di dialogo IE “Vuoi aprire / salvare”. Come fare clic su quel pulsante di salvataggio e dare un percorso tramite VBA? Ho provato vari metodi di windows api descritti in questo link anche qui, ma questo sta dando un risultato di “Window Not Found”.

Il mio codice attuale è il seguente:

Sub MyIEauto() Dim ieApp As InternetExplorer Dim ieDoc As Object 'Dim ieTable As Object 'create a new instance of ie Set ieApp = New InternetExplorer 'you don't need this, but it's good for debugging ieApp.Visible = True 'assume we're not logged in and just go directly to the login page ieApp.Navigate "https://indexes.nasdaqomx.com/Account/LogOn" Do While ieApp.Busy: DoEvents: Loop Do Until ieApp.readyState = READYSTATE_COMPLETE: DoEvents: Loop Set ieDoc = ieApp.Document 'fill in the login form – View Source from your browser to get the control names With ieDoc.forms(0) .UserName.Value = "xxxxxxx" .Password.Value = "xxxxxxx" .submit End With Do While ieApp.Busy: DoEvents: Loop Do Until ieApp.readyState = READYSTATE_COMPLETE: DoEvents: Loop 'now that we're in, go to the page we want ieApp.Navigate "https://indexes.nasdaqomx.com/Index/ExportWeightings/NDX?tradeDate=2015-08-19T00:00:00.000&timeOfDay=SOD/SODWeightings_2015" 'next below line commented as it is failing 'ieApp.ExecWB 4, 2, "D:\VBA code work\SODWeightings_20150819_NDX.xlsx" set ieApp=Nothing set ieDoc=Nothing End Sub 

Lo screenshot qui sotto mostra dove ho raggiunto. Come posso progredire da qui?

inserisci la descrizione dell'immagine qui

Un altro modo per farlo è quello di inviare le sequenze di tasti dei tasti di scelta rapida per fare clic sul pulsante Salva in IE11. Dovrei notare che la finestra di IE dovrà essere la finestra triggers per far funzionare tutto questo. Pertanto, non funzionerà in modalità di debug.

Il codice sottostante chiama il tasto di scelta rapida. Sto solo mostrando il tasto di scelta rapida in modo da avere una migliore idea di cosa sta succedendo.

  • Tasto di scelta rapida: Alt + S
  • VBA: Application.SendKeys "%{S}"

Alla fine è stato risolto …

 Option Explicit Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, _ ByVal lpsz2 As String) As Long Public Sub AddReference() ThisWorkbook.VBProject.References.AddFromFile "C:\Windows\SysWOW64\UIAutomationCore.dll" End Sub 'after my original code as posted in question then this below lines Dim o As IUIAutomation Dim e As IUIAutomationElement Set o = New CUIAutomation Dim h As Long h = ieApp.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, "Save") Dim Button As IUIAutomationElement Set Button = e.FindFirst(TreeScope_Subtree, iCnd) Dim InvokePattern As IUIAutomationInvokePattern Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId) InvokePattern.Invoke 

SendKeys è stata la soluzione per me.

 myfile = "C:\Users\User\Downloads\myfile.xls" checkmyfile = Dir(myfile, vbArchive) Do While checkmyfile = "" On Error Resume Next checkmyfile = Dir(myfile , vbArchive) If checkmyfile = "myfile.xls" Then Exit Do AppActivate "Title - Internet Explorer" SendKeys "%(g)" Application.Wait Now + TimeValue("0:0:1") Loop