true ejemplos down application activewindow vba excel-vba automation office-automation browser-automation

ejemplos - Las SendKeys de Excel VBA no causan que IE 9 guarde la descarga



sendkeys vba access (4)

Estoy escribiendo una macro que automatiza el proceso de descarga de un archivo csv desde el sitio web interno de mi empresa. Por muchas razones, no puedo usar ningún objeto xmlhttp y he obtenido la macro hasta el punto en que descargará el archivo. El problema es que cuando hace clic en el enlace para descargar el archivo, Internet Explorer solicita al usuario los botones Abrir, Guardar y Cancelar. Mientras estoy en IE, usar alt + shift + s guardará la descarga, pero parece que el método Sendkeys "% + s" de excel vba no funciona. Cualquier ayuda sería muy apreciada. Aquí está el código relevante:

Function followLinkByText(thetext As String) As Boolean ''clicks the first link that has the specified text Dim alink As Variant ''Loops through every anchor in html document until specified text is found '' then clicks the link For Each alink In ie.document.Links If alink.innerHTML = thetext Then alink.Click ''waitForLoad Application.Wait Now + TimeValue("00:00:01") Application.SendKeys "%+s", True followLinkByText = True Exit Function End If Next End Function


Como mencioné en mis comentarios, la barra de seguridad de información hace que sea difícil interactuar con la ventana de descarga de archivos.

Una alternativa es usar el control del navegador web y luego pasarle el URL. Pero el principal problema con este método es que no puede tener el navegador web en la misma instancia de Excel. Una vez que aparezca la ventana Descarga de archivos, toda su macro VBA se detendrá hasta el momento en que no la elimine.

Aquí hay una alternativa. Aquí hay un pequeño exe que he creado en VB6 que abrirá la ventana Descarga de archivos sin pasar por la barra de seguridad de información de IE. Y una vez que aparece la ventana Descarga de archivos, puede interactuar con ella usando las API como se muestra en el artículo de mi blog .

Tomemos un ejemplo para ver cómo interactuamos con este archivo exe vb6.

Cree un módulo en Excel y pegue este código.

NOTA IMPORTANTE : Como no me diste ninguna URL, tomo una URL estática. Por favor reemplácelo con su enlace. Ahora, dependiendo del enlace que especifique, puede ver una de estas dos ventanas de descarga. En función de la ventana de descarga que ve, deberá encontrar los identificadores de ventana según la imagen que se muestra a continuación. Más detalles sobre el enlace del blog que di.

Descargue el archivo adjunto y guárdelo en, por ejemplo, C:/ . Si lo guarda en cualquier otra ubicación, enmiéndelo en la declaración de Shell a continuación.

Sub Sample() Dim sUrl As String sUrl = "http://spreadsheetpage.com/downloads/xl/king-james-bible.xlsm" Shell "C:/FDL.exe " & sUrl, vbNormalFocus End Sub

INSTANTÁNEA

ARCHIVO : el archivo se puede descargar aquí .


Creo que se me ocurrió una solución más simple: cuando la barra de descarga aparece en IE9, simplemente omita mostrar la ventana emergente de descarga "real". El atajo es "CTRL + J". Todo lo que tienes que hacer a continuación es hacer clic en "Guardar" o "Abrir". Puede haber formas bonitas de hacerlo, pero simplemente envío una secuencia de teclas para mover el foco a la opción deseada y luego presiono enter.

Aquí está el código:

'' Wait for download bar to appear Application.Wait (Now + TimeValue("0:00:04")) '' Sending CTRL+J to open download pop-up SendKeys "^j" '' Wait for download popup to appear Application.Wait (Now + TimeValue("0:00:02")) '' Sending keys sequence to click on "Save" button SendKeys "{RIGHT}{RIGHT}{RIGHT}~"


Puede probar esto ya que me funciona en IE 11:

  1. Copie el archivo C:/Windows/System32/UIAutomationCore.dll a los usuarios. Documentos, por ejemplo, C:/Users/admin/Documents luego agregue UIAutomationClient referencia a su archivo de macro.
  2. Pegue el código debajo de su módulo:

    Option Explicit Dim ie As InternetExplorer Dim h As LongPtr Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr Sub Download() Dim o As IUIAutomation Dim e As IUIAutomationElement Set o = New CUIAutomation 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, "Save") Dim Button As IUIAutomationElement Set Button = e.FindFirst(TreeScope_Subtree, iCnd) Dim InvokePattern As IUIAutomationInvokePattern Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId) InvokePattern.Invoke End Sub

Prueba tu final


Su Application.Sendkeys . Las claves de venta solo necesitan un ajuste. A continuación se muestra el código que estoy usando, por lo que se prueba en IE11. Esto es para Alt + S sin Shift, que es el atajo de teclado en IE11. Avíseme si esto no funciona y necesita ayuda para volver a agregar Shift .

Application.SendKeys "%{S}", True