Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用VBA Excel等待Internet Explorer 9框架加载?_Excel_Vba_Internet Explorer 9 - Fatal编程技术网

如何使用VBA Excel等待Internet Explorer 9框架加载?

如何使用VBA Excel等待Internet Explorer 9框架加载?,excel,vba,internet-explorer-9,Excel,Vba,Internet Explorer 9,有许多在线资源演示了如何在VBA Excel中使用Microsoft Internet Explorer控件来执行基本的IE自动化任务。当网页有一个基本结构时,这些功能就起作用了。但是,当网页包含多个框架时,它们可能很难使用 我需要确定网页中的单个框架是否已完全加载。例如,此VBA Excel代码打开IE,加载网页,循环通过Excel工作表将数据放入网页字段,执行搜索,然后将IE结果数据返回Excel(很抱歉忽略了网站地址) 目标网页包含两个框架: 1) 用于输入搜索值和执行搜索的searchb

有许多在线资源演示了如何在VBA Excel中使用Microsoft Internet Explorer控件来执行基本的IE自动化任务。当网页有一个基本结构时,这些功能就起作用了。但是,当网页包含多个框架时,它们可能很难使用

我需要确定网页中的单个框架是否已完全加载。例如,此VBA Excel代码打开IE,加载网页,循环通过Excel工作表将数据放入网页字段,执行搜索,然后将IE结果数据返回Excel(很抱歉忽略了网站地址)

目标网页包含两个框架:

1) 用于输入搜索值和执行搜索的searchbar.asp框架

2) 用于显示搜索结果的searchresults.asp框架

在此结构中,搜索栏是静态的,而搜索结果根据输入条件而变化。由于网页是以这种方式构建的,IEApp.ReadyState和IEApp.Busy不能用于确定IEfr1帧加载完成,因为这些属性在初始search.asp加载后不会更改。因此,我使用大量的静态等待时间来避免互联网流量波动时出现运行时错误。这段代码确实有效,但速度很慢。请注意cmdGO语句之后的10秒等待。我希望通过添加确定帧加载进度的可靠逻辑来提高性能

如何确定自治帧是否已完成加载

' NOTE: you must add a VBA project reference to "Internet Explorer Controls"
' in order for this code to work
Dim IEapp As Object
Dim IEfr0 As Object
Dim IEfr1 As Object

' Set new IE instance
Set IEapp = New InternetExplorer

' With IE object
With IEapp
    ' Make visible on desktop
    .Visible = True
    ' Load target webpage
    .Navigate "http://www.MyTargetWebpage.com/search.asp"
    ' Loop until IE finishes loading
    While .ReadyState <> READYSTATE_COMPLETE
        DoEvents
    Wend
End With

' Set the searchbar.asp frame0
Set IEfr0 = IEapp.Document.frames(0).Document 

' For each row in my worksheet
For i = 1 To 9999                

    ' Input search values into IEfr0 (frame0)
    IEfr0.getElementById("SearchVal1").Value = Cells(i, 5)
    IEfr0.getElementById("SearchVal2").Value = Cells(i, 6)

    ' Execute search
    IEfr0.all("cmdGo").Click        

    ' Wait a fixed 10sec
    Application.Wait (Now() + TimeValue("00:00:10"))

    ' Set the searchresults.asp frame1
    Set IEfr1 = IEapp.Document.frames(1).Document

    ' Retrieve webpage results data
    Cells(i, 7) = Trim(IEfr1.all.Item(26).innerText)
    Cells(i, 8) = Trim(IEfr1.all.Item(35).innerText)

Next
”注意:必须将VBA项目引用添加到“Internet Explorer控件”
'以使此代码正常工作
将应用程序作为对象
作为对象的Dim IEfr0
Dim IEfr1作为对象
'设置新的IE实例
设置IEapp=新的InternetExplorer
“我反对
使用IEapp
'使桌面可见
.Visible=True
'加载目标网页
.导航“http://www.MyTargetWebpage.com/search.asp"
'循环直到IE完成加载
While.ReadyState ReadyState\u完成
多芬特
温德
以
'设置searchbar.asp框架0
设置IEfr0=IEapp.Document.frames(0.Document)
'对于工作表中的每一行
对于i=1至9999
'将搜索值输入到IEfr0(框架0)
IEfr0.getElementById(“SearchVal1”).Value=单元格(i,5)
IEfr0.getElementById(“SearchVal2”).Value=单元格(i,6)
'执行搜索
IEfr0.all(“cmdGo”)。单击
“等10秒钟
Application.Wait(现在()+TimeValue(“00:00:10”))
'设置searchresults.asp框架1
设置IEfr1=IEapp.Document.frames(1.Document)
'检索网页结果数据
单元格(i,7)=修剪(IEfr1.all.Item(26.innerText)
单元格(i,8)=修剪(IEfr1.all.Item(35.innerText)
下一个

正如@JimmyPena所说。如果我们能看到URL,帮助会容易得多

如果我们不能,希望本概述能为您指明正确的方向:

  • 等待页面加载(IEApp.ReadyState和IEApp.Busy)
  • 从IE对象获取文档对象。(已完成)
  • 循环,直到文档对象不是空
  • 从文档对象获取框架对象
  • 循环,直到帧对象不是空

  • 希望这有帮助

    正如@JimmyPena所说。如果我们能看到URL,帮助会容易得多

    如果我们不能,希望本概述能为您指明正确的方向:

  • 等待页面加载(IEApp.ReadyState和IEApp.Busy)
  • 从IE对象获取文档对象。(已完成)
  • 循环,直到文档对象不是空
  • 从文档对象获取框架对象
  • 循环,直到帧对象不是空

  • 希望这有帮助

    我使用loop选项检查字段值,直到它像这样填充

    当IE.Document.getElementById(“USERID”).Value“test3”时执行此操作 IE.Document.getElementById(“USERID”).Value=“test3”
    Loop

    我使用Loop选项检查字段值,直到它像这样填充

    当IE.Document.getElementById(“USERID”).Value“test3”时执行此操作 IE.Document.getElementById(“USERID”).Value=“test3”
    Loop

    这是一条非常古老的线索,但我想我会发布我的发现,因为我来这里寻找答案

    在locals窗口中,我可以看到对于IE应用程序本身,“readystate”变量只是“readystate_COMPLETE”。但对于iframe,它是小写的“complete”
    因此,我通过在正在使用的框架的.readystate上使用debug.print循环来探索这一点

    Dim IE As Object
    Dim doc As MSHTML.HTMLDocument
    Set doc = IE.Document
    Dim iframeDoc As MSHTML.HTMLDocument
    Set iframeDoc = doc.Frames("TheFrameIwasWaitingFor").Document
    
    ' then, after I had filled in the form and fired the submit event, 
    
    Debug.Print iframeDoc.readyState
       Do Until iframeDoc.readyState = "complete"
         Debug.Print iframeDoc.readyState 
         DoEvents
       Loop
    
    因此,这将在即时窗口中显示一行又一行的“加载”,最终显示“完成”并结束循环。当然,可以对其进行删节以删除debug.prints

    还有一件事:

    debug.print iframeDoc.readystate ' is the same as...
    debug.print doc.frames("TheFrameIwasWaitingFor").Document.readystate
    ' however, you cant use...
    IE.Document.frames("TheFrameIwasWaitingFor").Document.readystate ' for some reason...
    

    如果这些都是常识,请原谅我。我几天前才开始学习VBA脚本

    这是一条非常古老的线索,但我想我会发布我的发现,因为我来这里寻找答案

    在locals窗口中,我可以看到对于IE应用程序本身,“readystate”变量只是“readystate_COMPLETE”。但对于iframe,它是小写的“complete”
    因此,我通过在正在使用的框架的.readystate上使用debug.print循环来探索这一点

    Dim IE As Object
    Dim doc As MSHTML.HTMLDocument
    Set doc = IE.Document
    Dim iframeDoc As MSHTML.HTMLDocument
    Set iframeDoc = doc.Frames("TheFrameIwasWaitingFor").Document
    
    ' then, after I had filled in the form and fired the submit event, 
    
    Debug.Print iframeDoc.readyState
       Do Until iframeDoc.readyState = "complete"
         Debug.Print iframeDoc.readyState 
         DoEvents
       Loop
    
    因此,这将在即时窗口中显示一行又一行的“加载”,最终显示“完成”并结束循环。当然,可以对其进行删节以删除debug.prints

    还有一件事:

    debug.print iframeDoc.readystate ' is the same as...
    debug.print doc.frames("TheFrameIwasWaitingFor").Document.readystate
    ' however, you cant use...
    IE.Document.frames("TheFrameIwasWaitingFor").Document.readystate ' for some reason...
    

    如果这些都是常识,请原谅我。我几天前才开始学习VBA脚本

    你能发布实际的URL吗?没有它很难诊断。你能发布实际的URL吗?没有它很难诊断。