2011-04-26 50 views
3

使用以下代碼,我可以打開Internet Explorer窗口並導航到網站。我希望能夠通過其中一個鏈接(例如「拳擊/ UFC」)點擊代碼來進一步深入。如何使用VBA訪問網頁(IHTMLDocument?)

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

在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

託默勒格你好,請原諒我,我是一個小白,當談到使用VBA和DOM節點(雖然我已經研究這一點,它已經被提及。)你能更詳細地說明這個好嗎?我會使用什麼代碼? – Jason 2011-04-26 05:52:54

+0

@Jason見編輯。我現在無法對其進行測試。它應該仍然讓你知道該怎麼做。無論是廣泛使用VBA調試器還是提及[MSDN上的文檔](http://msdn.microsoft.com/en-us/library/aa752541%28v=vs.85%29.aspx)強烈建議 – Tomalak 2011-04-26 10:10:25

+0

嗨Tomalak,感謝代碼示例。我設置了一個手錶,SideNav代碼似乎沒有檢索到值,所以NavLinks沒有任何標籤。我正在嘗試引用MSDN文檔,因此我將繼續此操作,但是如果您有任何其他建議,那將非常棒。謝謝 – Jason 2011-04-26 19:28:52

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); 
     }