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:
- Copie el archivo
C:/Windows/System32/UIAutomationCore.dll
a los usuarios. Documentos, por ejemplo,C:/Users/admin/Documents
luego agregueUIAutomationClient
referencia a su archivo de macro. 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