使用VBA导航网页/通过Access操纵IE

时间:2015-04-15 20:47:12

标签: html vba internet-explorer ms-access

Hello StackOverflow社区,

我有一个关于使用Access VBA来操纵IE的问题。

基本上,我正在尝试编写将使用IE打开特定网页的代码,搜索特定链接的页面(目标链接的名称将取决于用户的具体情况),导航到新页面以编程方式单击该链接,然后通过在生成的新页面上查找特定链接/元素来重复该过程。

最终目标链接的显示文本将始终相同,但它所驻留的页面在每种情况下都会有所不同。

我的问题是以编程方式在二级页面中搜索那些驻留在那里的元素......即使在浏览器加载了新链接之后,我的结果仍然只给出了来自第一级页面的元素。

如果我到目前为止描述问题的背景做得不好,请道歉。

我的代码基本上如下:

Dim ie As Object, ieDoc As HTMLDocument

Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True

strHTML = "http://targetsite.com/first-level_page"

ie.navigate strHTML

'wait for browser
While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend


'define first-level target link and search for it and then "click" it

Dim i As Integer
Dim txt As String, link As String, p As String

Set ieDoc = ie.Document

txt = "First-Level Target"
    Do Until link = txt Or i >= 1000
    i = i + 1
    link = ieDoc.Links(i).outerText
Loop

'I know the above loop is not exactly ideal in its current form, but it does give me a working first attempt at the functionality I'm trying to build.    

ieDoc.Links(i).Click

到目前为止,这么好。上面的代码按预期工作。在所有情况下,它都能正确导航到所需的二级页面。我出错的地方是当我尝试在第二级页面中搜索最终目标元素时:

'wait for browser
While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend

'Search for final target element (which always has the same name and anchor text on all second-level pages)
ieDoc.getElementsByName("final-target-name").Item.Click

如果我尝试在第一级页面上使用它,上面的行(基于.getElementsByName)就可以正常工作。但是一旦我导航到任何二级页面,它什么都不做。我还尝试用上面循环的修改版本替换它,搜索第一级页面上的链接。结果相同。

作为一个故障排除步骤,我还用debug.print命令替换了该行,只是简单地命名二级页面上的所有元素,而这总是从第一页返回元素名称。

我认为很明显,在我按照第一个链接后,我无法正确更新或重新定义我的HTML文档。我将ieDoc设置为no,然后将其重新设置为ie.document,但这也不起作用。

希望有一个简单的命令或语法,我根本不知道。但是对于我的生活,我没有能够在点击第一个链接后让VBA正确引用页面上存在的HTML元素。

提前感谢任何建议!

〜JQN

2 个答案:

答案 0 :(得分:2)

您需要使用@Matteo NNZ和@TimWilliams

的组合

如果你知道&#34; id&#34;元素的名称更容易使用getElementsByName(&#34; target&#34;)。

如果你不知道&#34; id&#34;然后循环锚元素并搜索正确的文本。这缩小为仅链接或元素。

Set Anchors = IeDoc.getElementsByTagName("a")

然后循环比较.outertext或您需要的任何子字段。

@TimWilliams: 您需要加载找到的URL,然后在循环中设置新加载的IeDoc。设置&#34; ie&#34;反对新的&#34; ie&#34;加载页面,否则&#39; ie&#39;对象将正确保留第一页加载。 当您找到链接时,您需要像以前一样加载新页面。

'' throw away the first page loaded.
ie = nothing 
IeDoc = nothing

'' Set the new page loaded.
ie.navigate newHTML

'wait for browser
While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend

Set IeDoc = ie.Document

对第二页重复上述过程

以下是一些关于在vba中解析HTML的其他资源&#39;: http://www.ozgrid.com/forum/showthread.php?t=184695 Parse HTML content in VBA

答案 1 :(得分:0)

在这种特殊情况下,我能够在HTML方面解决问题,尽管我认为@Matteo NNZ,@ TimWilliams和@durbo发布的答案一般都可以解决Access / VBA方面的问题。再次感谢所有花时间回应的人!