Как я могу использовать VBA для доступа к веб-странице (IHTMLDocument?) - PullRequest
3 голосов
/ 26 апреля 2011

Используя следующий код, я могу открыть окно Internet Explorer и перейти на сайт. Я хотел бы пойти дальше, имея возможность щелкнуть код по одной из ссылок (например, «Бокс / 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 ]

2 голосов
/ 26 апреля 2011

В 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
0 голосов
/ 10 октября 2011

Вам потребуется запросить HTML-документ и получить коллекцию.После того, как вы получите коллекцию, вам нужно будет пройтись по элементам и щелкнуть по ней.

Я вставляю фрагмент кода здесь ( нажмите здесь, чтобы увидеть весь код ).Это в 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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...