2014-05-05 110 views
0

我想用Excel VBA在IE中執行一個非常手動的過程。我已經與VBA和IE一起工作,足以完成簡單的任務,比如在字段中輸入文本或者與按鈕進行交互,但是我很難在這個環境下進行包裝。查找表格複選框問題

我有一個在Excel中的字段列表:名字,姓氏,電子郵件地址。電子表格中有超過2000行的信息。我正在使用的網站有超過三千行信息的列表(加入複選框的信息相同),但一次只能加載最多100行。 Excel中的每一行數據都存在於Web工具中。

我想我的程序迭代名稱並檢查網頁上的相應行。問題是搞清楚如何識別相應複選框的輸入ID。我不是很熟悉HTML,所以我的代碼是非常基本的...我已經花了很多的一天寫這:

Sub Test() 
Dim str As String 
Dim ie As SHDocVw.InternetExplorer 
Dim doc As HTMLDocument 
Dim tbls As Object 
Dim tbl As Object 
Dim trow As Object 
Dim trs As Object 
Dim Cell As Range 

Set ie = New SHDocVw.InternetExplorer 
ie.navigate "https://test.com" 
ie.Visible = True 
Set doc = ie.Document 
Set tbls = doc.getElementsByTagName("TABLE") 
For Each Cell In Range("A2:A2200") 
    For Each tbl In tbls 
     For Each trow In tbl.Rows 
      If InStr(1, trow.Cells(i).innerText, Cell.Offset(0, 1) & ", " & Cell) > 0 Then 
       Debug.Print trow.Cells(0).innerText 
       Stop 
      End If 
     Next trow 
    Next tbl 
Next Cell 

End Sub 

上面的代碼能夠識別相匹配的頁面上的細胞工作簿中的單元格,但我無法弄清楚如何找到相關複選框的ID。該網站是私人的,所以我無法提供鏈接。請參閱下面的似乎是該網站的相關部分的源代碼:

 <div> 
     <table cellspacing="0" border="0" id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults" style="border-color:Black;border-width:1px;border-style:Solid;width:100%;border-collapse:collapse;"> 
      <tr> 
       <td colspan="6"> 
       <table id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_tabPager" border="0" cellpadding="5" width="100%"> 
        <tr> 
         <td style="border-style:none;"> 
          <a id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_lbPrev" disabled="disabled">Previous</a> 
          &nbsp;&nbsp; 
          <a id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_lbNext" disabled="disabled">Next</a> 
         </td> 
         <td style="border-style:none;" align="right"> 
          <b>Showing:</b> 
          <span id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_rblShow"><input id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_rblShow_0" type="radio" name="ctl00$ctl00$all_content$all_content$content$ucUserSearch$gvSearchResults$ctl01$rblShow" value="10" checked="checked" /><label for="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_rblShow_0">10 People</label><input id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_rblShow_1" type="radio" name="ctl00$ctl00$all_content$all_content$content$ucUserSearch$gvSearchResults$ctl01$rblShow" value="25" onclick="javascript:setTimeout('__doPostBack(\'ctl00$ctl00$all_content$all_content$content$ucUserSearch$gvSearchResults$ctl01$rblShow$1\',\'\')', 0)" /><label for="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_rblShow_1">25 People</label><input id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_rblShow_2" type="radio" name="ctl00$ctl00$all_content$all_content$content$ucUserSearch$gvSearchResults$ctl01$rblShow" value="50" onclick="javascript:setTimeout('__doPostBack(\'ctl00$ctl00$all_content$all_content$content$ucUserSearch$gvSearchResults$ctl01$rblShow$2\',\'\')', 0)" /><label for="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_rblShow_2">50 People</label><input id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_rblShow_3" type="radio" name="ctl00$ctl00$all_content$all_content$content$ucUserSearch$gvSearchResults$ctl01$rblShow" value="100" onclick="javascript:setTimeout('__doPostBack(\'ctl00$ctl00$all_content$all_content$content$ucUserSearch$gvSearchResults$ctl01$rblShow$3\',\'\')', 0)" /><label for="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_rblShow_3">100 People</label></span> 
         </td> 
        </tr> 
        <tr id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl01_trSelectOptions"> 
         <td colspan="2" style="border-style: none;" align="left"> 

           <a href="javascript:SetCheckedAll(true);">Select All on Page</a> 
           &nbsp;&nbsp; 
           <a href="javascript:SetCheckedAll(false);">Clear All on Page</a> 
           &nbsp;&nbsp; 

          <a class="link_w_img" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ctl00$all_content$all_content$content$ucUserSearch$gvSearchResults$ctl01$ctl09&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, true))"> 
            <img src="/images/all.gif" /> 
            <span>Select Entire List</span></a> 
           &nbsp;&nbsp; 
           <a class="link_w_img" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ctl00$all_content$all_content$content$ucUserSearch$gvSearchResults$ctl01$ctl11&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, true))"> 
            <img src="/images/none.gif" /> 
            <span>Clear Entire List</span></a> 
         </td> 
        </tr> 
       </table>  
      </td> 
      </tr> 

      <tr class="gridheader" align="left"> 
       <th scope="col">Select</th> 
       <th scope="col">Last Name</th> 
       <th scope="col">First Name</th> 
       <th scope="col">Middle Name</th> 
       <th scope="col">E-mail Address</th> 
       <th scope="col" style="width:0px;">&nbsp;</th> 
      </tr> 

      <tr class="griditem" align="center"> 
       <td> 
        <input id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl03_SelectCheckBox" type="checkbox" name="ctl00$ctl00$all_content$all_content$content$ucUserSearch$gvSearchResults$ctl03$SelectCheckBox" /> 
       </td> 
       <td align="left" onmouseover="ShowPopup('ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl03_divTip');" onmouseout="HidePopup();">Demo1</td> 
       <td align="left" onmouseover="ShowPopup('ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl03_divTip');" onmouseout="HidePopup();">Test</td> 
       <td align="left" onmouseover="ShowPopup('ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl03_divTip');" onmouseout="HidePopup();">&nbsp;</td> 
       <td align="left" onmouseover="ShowPopup('ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl03_divTip');" onmouseout="HidePopup();">[email protected]</td> 
       <td style="width:0px;"> 
        <div id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl03_divTip" class="popup"> 
         <div class="popupbg"> 
          <table> 
           <tr> 
            <td style="vertical-align:top;"> 
             <span id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl03_lblName" style="font-weight:bold;">Demo1, Test </span> 
             <br />E-mail:<span id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl03_lblEmail">[email protected]</span><br /> 
              <table cellspacing="0" border="0" id="ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl03_dgDemos" style="border-style:None;border-collapse:collapse;margin-top:-1.25em;"> 
           <tr> 
           <td>&nbsp; 
           </td><td>&nbsp; 
           </td> 
         </tr><tr> 
          <td> 
                  Employee ID: 
                 </td><td> 
                  N/A 
                 </td> 
         </tr><tr> 
          <td> 
                  Job Title: 
                 </td><td> 
                  N/A 
                 </td> 
         </tr><tr> 
          <td> 
                  Location: 
                 </td><td> 
                  N/A 
                 </td> 
         </tr> 
        </table> 
             </td> 
             <td style="width:50px;vertical-align:top;"> 
              <img src="/images/user_popup.jpg" border="0" width="48" height="48"/> 
             </td> 
            </tr> 
           </table> 
          </div> 

       </div> 
        </td> 

在上面的例子中,姓氏是demo1的,名字是測試,而電子郵件是[email protected]Test.com ,複選框的輸入ID是ctl00_ctl00_all_content_all_content_content_ucUserSearch_gvSearchResults_ctl03_SelectCheckBox

我的問題是,在識別表格行後,如何識別輸入ID?或者,也許這是不可能的,我正在以這種錯誤的方式去做?任何想法將不勝感激。


編輯

這是我嘗試過給我的運行時錯誤(Object variable or With block variable not set):

trow.Cells(0).getElementsByTagName("input")(0).Click 

我也試過這樣:

set input = trow.Cells(0).getElementsByTagName("input")(0) 
input.Click 

最後,這兩個產生相同的錯誤:

Debug.Print trow.Cells(0).getElementsByTagName("input")(0).innerText 
Debug.Print trow.Cells(0).getElementsByTagName("input")(0) 

這是Debug.Print在我的原碼輸出:

Demo1, Test 
E-mail: [email protected] 


Employee ID: N/A 
Job Title: N/A 
Location: N/A 

我關心的只是件(輸出)是前兩行,個人的電子郵件地址和名稱。

+0

'trow.Cells(0).getElementsByTagName(「input」)(0)'會給你一個複選框的引用。如果所有這些記錄都在同一個表中,那麼一旦識別出匹配的行,就應該緩存對正確表的引用,這樣就不必多次掃描頁面上的每個表。 –

+0

當我嘗試運行時,出現'Runtime Error 91'錯誤。所以也許我的代碼不能識別正確的行?另外,我將如何緩存對該行的引用?我從來沒有這樣做過... – ARich

+0

如果你可以更新你的問題,以顯示你嘗試這樣做時發生了什麼變化,這將有所幫助:如果你想離開你原來的代碼,發表第二塊代碼只需要相關行原樣。不幸的是,試圖在沒有實際訪問URL的情況下調試這類問題就像試圖通過鑰匙孔畫一個房間... –

回答

1

這個測試對我有用。看起來像你想要的所有行都有class="griditem",所以你可以檢查所有表格行的類名。當你找到和你的單元格值相匹配的值時,你應該能夠找到如圖所示的複選框。

Sub Tester() 

Dim d As New HTMLDocument, trs, rw 

    d.body.innerHTML = _ 
     "<section><table><tr class='griditem'><td>" & _ 
     "<input type='checkbox' id='id_1'></td>" & _ 
     "<td>Foo</td></tr><tr class='griditem'><td>" & _ 
     "<input type='checkbox' id='id_2'></td>" & _ 
     "<td>Bar</td></tr></table></section>" 

    Set trs = d.getElementsByTagName("tr") 
    For Each rw In trs 
     If rw.className = "griditem" Then 
      'check cell values for match.... 
      Debug.Print rw.Cells(0).getElementsByTagName("input")(0).ID 
     End If 
    Next rw 

End Sub 
+0

蒂姆,我無法對此表示感謝!在實現代碼之後,我能夠實現它。有一個問題,早些時候你提到在行匹配後緩存對一行的引用。你能指出我如何做到這一點的正確方向嗎?你是說在數組中存儲每個匹配的行並檢查每個值的數組? – ARich

+0

這與您以前的方法更相關,並且更關注性能:如果您有許多值要在表中查找,那麼掃描所有行一次可能會更快,將單元格值和複選框ID放入一些一種數組。除非當前方法的性能很差,否則可能增加的複雜性是不值得的。 –

+0

有道理。我還沒有能夠做一個完整的測試,所以我不確定此時的性能是什麼樣子。雖然我可以肯定地說,這將比手動方法有很大的改進。再次感謝你的幫助! – ARich

0

試試這個。

Set ElementCol = ie.Document.getElementsByTagName("input") 

For Each btnInput In ElementCol 

'your code here 


Next btnInput 
+0

這將循環輸入標記,但是如何知道輸入標記是否與工作簿中的相應行對應?輸入標籤中是否有更多信息可以通過某種方式訪問​​並用於執行此操作? – ARich

+0

您可以按類型,名稱訪問輸入標籤。像btnInput.type =「提交」,然後做一些事情。 –

+0

好的,但在頁面上有100個複選框的可能性。我如何知道btnInput是否是我迭代中當前單元格的正確複選框?也許我錯過了你的觀點? – ARich