【问题标题】:Excel VBA dowload file using the InternetExplorer object使用 InternetExplorer 对象的 Excel VBA 下载文件
【发布时间】:2018-01-26 20:37:56
【问题描述】:

所以我有一个 VBA 代码,它当前成功登录到一个网站,并进一步导航到该网站的其他页面并抓取我需要的数据。

我现在需要导航到一个页面(没问题),用查询填充一个文本框(没问题),然后单击“下载”按钮(没问题)。然后这会提示一个弹出窗口下载文件(打开/保存/取消)。我的要求是在没有用户交互的情况下保存此文件 - 宏应将文件保存在预定目录中。

关于如何实现这一目标的任何想法?我根本无法让 SendKeys 工作。

Set appIE = New InternetExplorerMedium

sURL2 = "http://somewebsite.com/query.asp?"

With appIE
    .Navigate sURL2
    .Visible = True
End With

Do While appIE.Busy Or appIE.ReadyState <> 4
    DoEvents
Loop

'code to enter the query in textbox and click on download file button
    appIE.Document.getElementsByTagName("textarea")(0).Value = Sheets("UserEntry").Range("L37")
    appIE.Document.getElementsByName("btnSubmit")(203).Click
    Application.SendKeys "%{s}"

Set appIE = Nothing

编辑:即使我可以让 SendKeys 工作,我也需要自动“另存为”文件,而不仅仅是“保存”在“下载”文件夹中。

【问题讨论】:

  • 您可以尝试:a) 输入选项卡以找到相应的按钮,然后通过 SendKeys 输入目录名称,或 b) 使用 WinHttp.WinHttpRequest 发送 Web 请求并获取回复。如果您可以在登录 Chrome/IE 时检查它发送的内容,那么您也许可以这样做。
  • @BrownishMonster,我想我会学习并尝试 WinHttp.WinHttpRequest 的想法。您认为我仍然可以先登录,然后导航,然后使用该方法下载文件吗?
  • 我不确定,取决于他们如何发回登录凭据。您可以尝试在 chrome/IE 中进行检查。您可能需要在 url 之后写入凭据,例如 www.example.com?user=MyUser&amp;PWord=PW,但这取决于它们发回的参数。您可能必须在每个响应中检索 cookie 并在每个请求中设置它们。
  • @BrownishMonster 好的,我的下一个问题是,如何使用您的方法下载?请假设我没有预先确定的 URL。当我点击下载时,URL 会动态生成
  • 您可以下载响应,我希望它是文件本身。至于动态网址,老实说我不知道​​。如果 URL 的某些部分是静态的,而动态部分是标识符,您可以尝试在其他响应之一中找到标识符。我已经完成了自动化 IE 并使用了 WinHttpRequest(或者可能是其他一些变体)并发现后者不那么不稳定。自动化方式随机给出错误。

标签: excel vba


【解决方案1】:

好的,得到它的工作,感谢@BrownishMonster 建议的方法

我用的是 WinHTTP.WinHTTPRequest.5.1

我还使用 Fiddler 调查浏览器在 POST 请求中发送了什么,然后让 VBA 做同样的事情

Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")

'This is to POST the login info and login to the site
WHTTP.Open "POST", mainUrl, False
WHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
WHTTP.send loginString

'This is to POST the download info and download the file
WHTTP.Open "POST", fileUrl_XLSResult, False
WHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
WHTTP.send downloadString

FileData = WHTTP.responseBody

'This is to save the file in the location MyFilePath
If WHTTP.Status = 200 Then
    Set oStream = CreateObject("ADODB.Stream")
    oStream.Open
    oStream.Type = 1
    oStream.Write WHTTP.responseBody
    oStream.SaveToFile MyFilePath, 1
    oStream.Close
End If

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-19
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2017-05-09
    • 2015-02-15
    相关资源
    最近更新 更多