如何使用VBA访问WebPage(IHTMLDocument?)

时间:2011-04-26 05:22:10

标签: internet-explorer vba excel-vba automation excel

使用以下代码,我可以打开Internet Explorer窗口并导航到该网站。我想通过其中一个链接(例如“Boxing / UFC”)点击代码来进一步发展。

Sub Run()   
Set IE = CreateObject("InternetExplorer.Application")
With IE
    .Visible = True
    .Navigate2 "http://www.bet365.com"
    Do Until .ReadyState = 4: DoEvents: Loop
    .Quit
End With

因为该链接会导致Javascript onclick事件(onclick="gS(1020,9);return false;"),您是否可以建议我可以使用的代码,使VBA能够在运行VBA宏时无需用户干扰即可点击该链接?

2 个答案:

答案 0 :(得分:2)

在Internet Explorer中,您只需通过DOM API单击链接即可。

检索您感兴趣的DOM节点(A),并在其上调用click()。这也将触发所有相关的事件处理程序。


编辑:在你的情况下,使用VBA,做这样的事情(未经测试,我这里没有VBA)

Dim sideNav As IHTMLElement 
Dim navLinks As IHTMLElementCollection
Dim currLink As IHTMLElement

Set sideNav = IE.document.getElementByID("sln")
Set navLinks = sideNav.all.tags("A")

For Each currLink In navLinks
  If Trim(currLink.innerText) = "Boxing/UFC" Then
    currLink.Click
  End If
Next currLink

答案 1 :(得分:0)

您需要查询html文档,然后检索该集合。检索集合后,您需要遍历元素并单击它。

我在这里粘贴了一段代码(click here for the entire code)。这是用c ++编写的,但我认为它也必须与VB相同。

            IHTMLElementCollection *spCollectEmbed;
            spDocument->get_links(&spCollectEmbed);
            if(spCollectEmbed)
            {
            // get all the links
            long lLen;
            spCollectEmbed->get_length(&lLen);
            for (long i = 0; i < lLen; i++)
            {
                IDispatch *ppvdispOption;
                IHTMLElement *interfaceHTMLElement;
                VARIANT index;
                index.vt = VT_I4;
                index.lVal = i;

        // get the item from the document
                HRESULT hResult = spCollectEmbed->item(index, index, &ppvdispOption);
                if(SUCCEEDED(hResult))
                {
        // query for the element
        hResult = ppvdispOption->QueryInterface( IID_IHTMLElement,
        (void **) &interfaceHTMLElement);
        if(SUCCEEDED(hResult))
        {
        BSTR innerhtml;
        interfaceHTMLElement->get_innerHTML(&innerhtml);
        // click the links
        interfaceHTMLElement->click();
        Sleep(2000);
        }