等待 IE 文件下载完成的 VBA 代码

2023-12-09

我正在尝试从网页下载 Excel 文件,到目前为止,我能够打开网页、导航并单击“保存”按钮,但下载后我需要访问该 Excel 文件。但有时下载需要时间,具体取决于文件的大小。有什么方法可以检查窗口并查看下载是否完成,然后才能继续打开下载的文件。下面是代码。

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

    MsgBox "Not Found"

End If


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

上面的代码将保存下载文件


此代码使用与您开始使用的技术类似的技术,但此外它将等待“框架通知栏”中出现“打开文件夹”按钮,这将表明下载已完成。然后,它会在用户的下载文件夹中查找“最近添加”的文件,并将其移动到您选择的位置。该代码有一些用于错误消息的 Debug.Print 语句,您可能需要更改/删除它们。

希望这对你有用......

    Option Explicit

'--Given an IE browser object with the yellow 'Frame Notification Bar' to download file and a File Name to save the downloaded file to,
'--This Sub will use UIAutomation to click the Save button, then wiat for the Open button, then look in the User Downloads folder
'--to get the file just downloaded, then move it to the full file name path given in Filename, then close the 'Frame Notification Bar'
'--DownloadFromIEFrameNotificationBar will return the following codes:
'-- -1 - could not find the Close button in the 'Frame Notification Bar', but file saved OK
'--  0 - succesfully downloaded and save file
'--  1 - could not find the 'Frame Notification Bar'
'--  2 - could not find the Save button in the 'Frame Notification Bar'
'--  3 - could not find the 'Open folder' button in the 'Frame Notification Bar'
'--  4 - could not find Very recent file (Last modified within 3 seconds) in the User Downloads folder

Public Function DownloadFromIEFrameNotificationBar(ByRef oBrowser As InternetExplorer, Filename As String) As Long
    Dim UIAutomation As IUIAutomation
    Dim eBrowser As IUIAutomationElement, eFNB As IUIAutomationElement, e As IUIAutomationElement
    Dim InvokePattern As IUIAutomationInvokePattern
    Dim DLfn As String

    DownloadFromIEFrameNotificationBar = 0

    Set UIAutomation = New CUIAutomation
    Set eBrowser = UIAutomation.ElementFromHandle(ByVal oBrowser.hwnd)

    '--Find 'Frame Notification Bar' element

    Set eFNB = FindFromAllElementsWithClassName(eBrowser, "Frame Notification Bar", 10)

    If eFNB Is Nothing Then
        Debug.Print "'Frame Notification Bar' not found"
        DownloadFromIEFrameNotificationBar = 1
        Exit Function
    End If

    '--Find 'Save' button element

    Set e = FindFromAllElementWithName(eFNB, "Save")
    If e Is Nothing Then
        Debug.Print "'Save' button not found"
        DownloadFromIEFrameNotificationBar = 2
        Exit Function
    End If

    '--'Click' the 'Save'  button

    Sleep 100
    Set InvokePattern = e.GetCurrentPattern(UIA_InvokePatternId)
    InvokePattern.Invoke

    '--Wait for the file to download by waiting for the 'Open Folder' button to appear in the 'Frame Notification Bar'

    Set e = FindFromAllElementWithName(eFNB, "Open folder", 15)
    If e Is Nothing Then
        Debug.Print "'Open Folder' button not found"
        DownloadFromIEFrameNotificationBar = 3
        Exit Function
    End If

    '--Done with download, now look for a file that was very recently (with in 3 seconds) added to the User's Downloads folder and get the file name of it

    DLfn = FindVeryRecentFileInDownloads()

    If DLfn <> "" Then

        '--We got recent downloaded file, now Delete the file we are saving too (if it exists) so the Move file will be successful

        DeleteFile Filename
        MoveFile DLfn, Filename
    Else
        Debug.Print "Very recent file not found!"
        DownloadFromIEFrameNotificationBar = 4
    End If

    '--Close Notification Bar window

    Set e = FindFromAllElementWithName(eFNB, "Close")
    If e Is Nothing Then
        Debug.Print "'Close' button not found"
        DownloadFromIEFrameNotificationBar = -1
        Exit Function
    End If

    '--'Click' the 'Close'  button

    Sleep 100
    Set InvokePattern = e.GetCurrentPattern(UIA_InvokePatternId)
    InvokePattern.Invoke
End Function

Private Function FindFromAllElementWithName(e As IUIAutomationElement, n As String, Optional MaxTime As Long = 5) As IUIAutomationElement
    Dim oUIAutomation As New CUIAutomation
    Dim ea As IUIAutomationElementArray
    Dim i As Long, timeout As Date

    timeout = Now + TimeSerial(0, 0, MaxTime)

    Do
        Set ea = e.FindAll(TreeScope_Subtree, oUIAutomation.CreateTrueCondition)

        For i = 0 To ea.length - 1
            If ea.GetElement(i).CurrentName = n Then
                Set FindFromAllElementWithName = ea.GetElement(i)
                Exit Function
            End If
        Next

        DoEvents

        Sleep 20
    Loop Until Now > timeout

    Set FindFromAllElementWithName = Nothing
End Function

Private Function FindFromAllElementsWithClassName(e As IUIAutomationElement, c As String, Optional MaxTime As Long = 5) As IUIAutomationElement
    Dim oUIAutomation As New CUIAutomation
    Dim ea As IUIAutomationElementArray
    Dim i As Long, timeout As Date

    timeout = Now + TimeSerial(0, 0, MaxTime)

    Do
        Set ea = e.FindAll(TreeScope_Subtree, oUIAutomation.CreateTrueCondition)

        For i = 0 To ea.length - 1
            If ea.GetElement(i).CurrentClassName = c Then
                Set FindFromAllElementsWithClassName = ea.GetElement(i)
                Exit Function
            End If
        Next

        DoEvents

        Sleep 20
    Loop Until Now > timeout

    Set FindFromAllElementsWithClassName = Nothing
End Function

Private Function FindVeryRecentFileInDownloads(Optional MaxSecs As Long = 3) As String
    Dim fso As New FileSystemObject, f As File, First As Boolean, lfd As Date, Folder As String
    Dim WS As Object

    On Error GoTo errReturn

    Set WS = CreateObject("WScript.Shell")

    '--Get Current user's Downloads folder path

    Folder = WS.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\{374DE290-123F-4565-9164-39C4925E467B}")
    First = True

    For Each f In fso.GetFolder(Folder).Files
        If First Then
            lfd = f.DateLastModified
            FindVeryRecentFileInDownloads = f.Path
            First = False
        ElseIf f.DateLastModified > lfd Then
            lfd = f.DateLastModified
            FindVeryRecentFileInDownloads = f.Path
        End If
    Next

    If First Then
        FindVeryRecentFileInDownloads = "" '--no files
    ElseIf MaxSecs <> -1 And DateDiff("s", lfd, Now) > MaxSecs Then
        FindVeryRecentFileInDownloads = "" '--no very recent file found
    End If

    Exit Function

errReturn:
    FindVeryRecentFileInDownloads = ""

End Function

Private Sub MoveFile(SourcePath As String, DestinationPath As String)
    Dim fso As New FileSystemObject
    CreateCompletePath Left(DestinationPath, InStrRev(DestinationPath, Application.PathSeparator))
    fso.MoveFile SourcePath, DestinationPath
End Sub

Public Sub CreateCompletePath(sPath As String)
    Dim iStart As Integer
    Dim aDirs As Variant
    Dim sCurDir As String
    Dim i As Integer

    sPath = Trim(sPath)
    If sPath <> "" And Dir(sPath, vbDirectory) = vbNullString Then
        aDirs = Split(sPath, Application.PathSeparator)
        If Left(sPath, 2) = Application.PathSeparator & Application.PathSeparator Then
            iStart = 3
        Else
            iStart = 1
        End If

        sCurDir = Left(sPath, InStr(iStart, sPath, Application.PathSeparator))

        For i = iStart To UBound(aDirs)
            If Trim(aDirs(i)) <> vbNullString Then
                sCurDir = sCurDir & aDirs(i) & Application.PathSeparator
                If Dir(sCurDir, vbDirectory) = vbNullString Then MkDir sCurDir
            End If
        Next i
    End If
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

等待 IE 文件下载完成的 VBA 代码 的相关文章

  • 计算div中有多少个元素

    我有一个div 里面有span 有没有一种方法可以计算 div 中有多少个元素 然后将其作为值给出 例如 一个 div 中有 5 个跨度 那么它会对其进行计数并发出警报 5 请使用 JavaScript 谢谢 如果你想要后代的数量 你可以使
  • 如何从另一个工作簿(excel)复制数据?

    我已经有一个可以创建工作表和其他一些东西的宏 创建工作表后 我是否想调用另一个宏 将数据从第二个 Excel 其打开 复制到第一个活动 Excel 文件 首先 我想复制到标题 但我无法让它工作 不断出现错误 Sub CopyData she
  • 如何使两个
    ...
    位于同一行?

    我的意思是 两个标签具有相同的高度 对所有 div 尝试这个 display inline block
  • 将整个网页设计为 SVG 文件

    免责声明 我意识到鉴于标题的荒谬 这听起来像一个巨魔 然而 这是一个真正的问题 我的背景涉及OpenGL x86 汇编 我最近开始学习网络编程 我真的很喜欢 SVG CSS 并且想知道 为什么人们不使用 SVG 设计整个网页 Context
  • 在 IE 中使用
    标签时,填充不起作用

    我在我的应用程序中使用 HTML5 标签 标签的填充在 chrome ff 和 safari 中工作正常 但在 IE 中不起作用 我尝试添加显示 块 与部分样式 但它没有用 有什么解决办法吗 许多旧浏览器不理解 HTML5 标签 例如sec
  • 在文档片段中查找注释或文本节点

    我必须清理 Nokogiri HTML DocumentFragment 文档 删除仅包含空格的注释节点和文本节点 这是一个例子 html p paragraph p p paragraph p p paragraph p doc Noko
  • 如何防止 CSS 或 jQuery 中单词和标点符号之间的换行

    我在一个段落中有一些文字 我的问题是 当标点符号位于单词末尾时 有时可以换行到下一行 像这样 This is the text This is a new line 我可以用 CSS 或 jQuery 解决这个问题吗 如果您不在单词和标点符
  • 恢复默认的CSS属性

    我正在编写一个可在多个网站上使用的组件 每个网站都有自己的样式表 并且以不同的方式显示某些内容 我的所有 html 都包含在一个带有 id 的 div 中 div div 然而 我的组件是在所有网站上看起来一致 这很好 因为我将样式应用于组
  • 按字母顺序对组合框值进行排序

    我的 Excel 用户表单中有一个组合框 按字母顺序排序的最简单方法是什么 它的值是在 vba 中硬编码的 新的值只是添加到底部 因此它们不按任何顺序排列 当前正在使用用户表单 以便我们的用户可以将数据从我们的数据库导入到 Excel 中
  • 我在没有任何用户操作的情况下显示 javascript 输出时遇到问题

    这就是问题 如果一个整数大于 1 并且只能被 1 和它本身整除 则该整数被称为素数 例如 2 3 5和7是素数 但4 6 8和9不是素数 a 编写一个函数来确定一个数是否为素数 b 在脚本中使用此函数来确定并打印 1 到 10000 之间的
  • 如何使用 Java 以正确的编码检索 HTML 页面?

    如何使用页面编码中的 HTML 页面读取 HTTP 流 这是我用来获取 HTTP 流的代码片段 输入流读取器有编码可选参数 但我不知道如何获取它 URLConnection conn url openConnection InputStre
  • 自定义元素可以扩展输入元素吗?

    使用Web组件规范 是否可以扩展特定类型的
  • HTML Mobile - 强制软键盘隐藏[重复]

    这个问题在这里已经有答案了 我正在为一家优惠券公司开发前端网站 我有一个页面 用户只需输入电话号码和花费的美元 我们想出了一个有趣的内置 Javascript 屏幕键盘 它易于使用且快速 但是 我正在寻找一种解决方案 以在用户聚焦并在这些字
  • 如何将 HTML 转换为 Textile?

    我正在抓取一个静态 html 网站并将内容移至数据库支持的 CMS 中 我想在 CMS 中使用 Textile 有没有一种工具可以将 HTML 转换为 Textile 这样我就可以抓取现有网站 将 HTML 转换为 Textile 然后将该
  • CSS 动画延迟和关键帧

    我在 CSS 动画上遇到动画延迟问题 我有 3 张图片 我想将其制作为幻灯片 插图是 图像1到图像2需要15秒改变 图像2到图像3需要15秒改变 图像3回到图像1需要30秒 在第一个循环之后 我想让幻灯片结束于图像3 因此图像1到图像2仍然
  • VBA复制单元格值和格式

    我如何修改以下代码以便不仅复制值而且复制字体样式 例如大胆或不大胆 谢谢 Private Sub CommandButton1 Click Dim i As Integer Dim a As Integer a 15 For i 11 To
  • JavaScript CSV 验证

    如何检查文本框中的逗号分隔值并在未找到时发出警报 如果有的话 里面应该有字符 比如A B C D function validate validate text box
  • CSS 样式在部分回发时停止工作

    在 ASP net C 应用程序中 我有一个带有自定义 css 的复选框 CSS 文件是 复选框
  • html 图像 src 调用 javaScript 变量

    这是我的代码 我想问 我怎样才能做到这一点 img src img apple 我一直在尝试使用 call 函数和 document onload 但它根本不起作用 有人可以救我吗 我假设你只是想用 javascript 更新图像 src
  • 自动电子邮件生成无法解析多个收件人

    我有一个 VBA 脚本 可以创建并保存草稿电子邮件 为了添加收件人 它从链接的 Excel 表中提取一个字符串并将其添加到 Recipients 对象中 对于只有单一收件人的电子邮件 这就像一个魅力 用户所需要做的就是打开草稿 花 5 秒钟

随机推荐

  • 系统找不到Android Studio指定的文件

    每当我尝试运行 Android 应用程序时 我都会收到一条错误消息 Error C Users zeshan gradle caches 2 14 1 scripts remapped build 6xj57zedh3l90p9pnawvv
  • 如何在 JavaScript 中创建选项卡?

    我一直在尝试用 JavaScript 创建选项卡 当点击一个new tab the 活跃班应适用于它及其相关的面板内容应该显示 但是 那活跃班单击另一个选项卡时不会应用panels也没有改变 它们只是相互堆叠 const tabs docu
  • WPF 如何显示 Image.Source (BitmapSource) 像素位置?

    假设我有一个以缩放方式显示其来源的图像 我如何使用 MouseMove 事件在标签或文本块中显示光标所在的像素位置 我需要像素坐标而不是图像相对于其大小的坐标 提前致谢 您可以从 ImageSource 中找到实际像素的高度和宽度 Imag
  • Android 中的自动增长 ListView

    我确实搜索了与我要问的问题相关的各种问题 我只是想以清晰简单的方式提出问题 并希望得到一个清晰简单的答案 我有一个List我想向用户展示的数百个项目ListView小部件 最初 我想从 50 个项目开始 当用户滚动到底部附近时 我想添加另外
  • 对 .xml 文件中

    内的句子进行编号?

    我是一名初学者程序员 我陷入了这个可能很简单的问题 我想自动将数字添加到 xml 文件的 P 标签中包含的句子中 因此 xml 文件中的示例段落如下所示 p Sentence1 Sentence2 Sentence3 p 我想把它改造成 p
  • 如何获取函数的所有参数?

    在 JavaScript 中 我们有arguments 属性 可以让我们获取函数的参数 我一般都是这样做的 function sum var agumentCount arguments length var count 0 var sum
  • excel 替换值 N/A

    我有一行包含一些值A1 to A3 我有 1 3 N A I tried SUM A1 A3 但由于我的值为 N A 因此无法获得 3 个值的总和 我想将 N A 视为 0 并得到总和 The 总计的函数非常适合忽略错误项 AGGREGAT
  • SceneKit:是否可以在透明对象上投射阴影?

    我正在尝试在 OSX 上的 SceneKit 中的完全透明的平面上投射阴影 我在这个问题上挣扎了几个小时 但没有找到任何解决方案 我的目的是生成几个具有透明背景的对象的屏幕截图 并且只有不可见平面上的阴影 你对我如何用苹果 SceneKit
  • h2 数据库上的条件唯一索引

    我有一个带有 BIZ ID 列的 SAMPLE TABLE 当列 active 不等于 0 时 该列应该是唯一的 在 Oracle 数据库上 索引如下所示 CREATE UNIQUE INDEX ACTIVE ONLY IDX ON SAM
  • 在android中单击警报对话框中的肯定按钮后关闭活动

    我有一个名为 A 的活动 它显示项目列表 单击更新按钮时 它会显示自定义对话框 活动显示在后面 并选择项目列表 单击自定义对话框内的 订单 按钮时 自定义对话框消失 显示进度对话框 因为订单工作正在进行中 然后进度对话框在订单工作完成后关闭
  • 单个 PHP“退出;”声明阻止 Safari 中的 HTML5 视频

    奇怪的错误 在提供视频文件的 PHP 脚本中 在发送 video mp4 标头并输出 MP4 文件之前 我有一些测试条件 验证令牌 确保文件存在等 如果任何测试失败 fail被赋予一个非假值 测试结束时有这个if陈述 if fail exi
  • 如何在 Objective-C 中发出 API 请求来获取私有 Vimeo 视频?

    我正在开发一个 iOS 应用程序来播放私人 Vimeo 视频 私人视频被赋予隐藏来自 Vimeo 网站的视频的隐私和指定的域 以便这些视频只能在我的网站上购买和播放 我有 Vimeo PRO 帐户 我正在使用 VIMNetworking S
  • 公钥和私钥作为变量 C#

    我正在编写一个函数 其中该函数接收我的公钥作为变量 并且该变量的值是实际的公钥 我需要 Azure 中的两个不同的功能应用程序来加密和解密 密钥必须匹配 但问题是 每次我调用 API 时 公钥都不同 我可以毫无问题地加密 但是当我必须解密时
  • Hogan.js 的国际化是如何配置的?

    我正在寻找使用hogan js在浏览器中创建 html 表单模板 我读到 hogan 支持 i18n 但我找不到其工作原理的示例 你如何将翻译后的文本传递给 hogan 以及你在模板中放置什么标签 我已经看到了 i 和 i18n 看来我很困
  • Ionic:如何覆盖后退按钮功能?

    我需要覆盖两个按钮的后退按钮功能 导航栏左上角的后退图标 硬件后退按钮 例如在 Android 中 但仅针对一种特定视图 而不是全局视图 我怎样才能做到这一点 有可能覆盖两个按钮的后退按钮功能从您的控制器内 这是代码 run this fu
  • 当用户在相邻单元格中输入信息时,自动填充单元格中的日期

    我有一个电子表格 人们可以在其中输入项目更新 然后输入更新日期 正在发生的事情是人们忘记在笔记上注明日期 有没有办法让日期单元格自动填充当前 输入日期 我假设 if 函数可以做到这一点 This 事件宏将把日期放在列中B如果在列中输入值A
  • 如何使用数据工厂创建 Azure 按需 HD Insight Spark 集群

    我正在尝试使用 Azure 数据工厂使用 Hdi 版本 3 5 创建按需 HD Insight Spark 集群 数据工厂拒绝创建并显示错误消息 HdiVersion 不支持 3 5 如果目前无法创建按需 HD Insight Spark
  • 右键单击 jqGrid 时禁用行选择

    在 jqGrid 中 我当前使用以下命令禁用行选择 beforeSelectRow function return false 这对于左键单击效果很好 但是 我注意到它没有触发beforeSelectRow事件处理程序 并且当我右键单击时仍
  • CKeditor保存事件

    我按照本主题中写的步骤进行操作 CKEditor AJAX 保存如果有人按下 AjaxSave 按钮 我尝试触发自定义 saved ckeditor 事件 但我没有成功 ckeditor plugins ajaxsave plugin js
  • 等待 IE 文件下载完成的 VBA 代码

    我正在尝试从网页下载 Excel 文件 到目前为止 我能够打开网页 导航并单击 保存 按钮 但下载后我需要访问该 Excel 文件 但有时下载需要时间 具体取决于文件的大小 有什么方法可以检查窗口并查看下载是否完成 然后才能继续打开下载的文