使用Excel中的VBA从具有相同ID的两个表的网页导入数据

首先我要感谢Siddharth Rout&IAmDranged先生用我以前的问题讨论了如何解决与使用VBA从安全的网站导入excel中的数据有关的问题。 使用VBA从安全网站导入excel中的数据时出现运行时错误438 , 无法使用VB代码从另一个网站导入excel中的数据 。 该代码现在工作完美,但还有一个问题,即网页,我从哪里试图导入数据,有两个相同的ID“报表”表。 使用VBA代码只能从第一个表中复制数据。 在VBA中同时从两个表格(相同的ID)复制数据需要进行哪些修改。 VBA代码和目标网页源代码在下面再次发布。

Sub GetTable() Dim ieApp As InternetExplorer Dim ieDoc As Object Dim ieTable As Object Dim clip As DataObject 'create a new instance of ie Set ieApp = New InternetExplorer 'you don't need this, but it's good for debugging ieApp.Visible = True 'assume we're not logged in and just go directly to the login page ieApp.Navigate "http://cms.indianrail.gov.in/CMSREPORT/JSP/rpt/LoginAction.do?hmode=loginPage" Do While ieApp.Busy: DoEvents: Loop Do Until ieApp.ReadyState = READYSTATE_COMPLETE: DoEvents: Loop Set ieDoc = ieApp.Document 'fill in the login form – View Source from your browser to get the control names With ieDoc .getElementById("userId").setAttribute "value", "rlbdgs" .getElementById("userPassword").setAttribute "value", "123" '~~> This will select the 2nd radio button as it is `0` based .getElementsByName("userType")(1).Checked = True .getElementById("hmode").Click End With Do While ieApp.Busy: DoEvents: Loop Do Until ieApp.ReadyState = READYSTATE_COMPLETE: DoEvents: Loop 'now that we're in, go to the page we want ieApp.Navigate "http://cms.indianrail.gov.in/CMSREPORT/JSP/rpt/GeneralReportAction.do?hmode=drillDown25And26And30GeneralReport&kioskOrManual=K&val=26&wherePart=ZONE_CODE_C=-IR-&lobby=BSL&type=B&startDate=&endDate=&traction=ELEC" Do While ieApp.Busy: DoEvents: Loop Do Until ieApp.ReadyState = READYSTATE_COMPLETE: DoEvents: Loop 'get the table based on the table's id Set ieDoc = ieApp.Document Set ieTable = ieDoc.getElementById("report-table") 'copy the tables html to the clipboard and paste to the sheet If Not ieTable Is Nothing Then Set clip = New DataObject clip.SetText "<html>" & ieTable.outerHTML & "</html>" clip.PutInClipboard Sheet1.Select Sheet1.Range("A1").Select Sheet1.PasteSpecial "Unicode Text" End If 'close 'er up ieApp.Quit Set ieApp = Nothing End Sub 

网页源码

 <html> <head> <title>CREW BOOKED ON TA</title> <link href="../styles/reportStyle.css" rel="stylesheet" type="text/css" /> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <script type="text/javascript"> function DoNav(theUrl) { //alert(theUrl); document.location.href = theUrl; } </script> </head> <body> <table id="report-table"> <!-- Table header --> <thead> <tr> <th scope="col" class="date" style="border:0px;" colspan="10">Print Date Time: <span>14-08-2014 13:30</span></th> </tr> <tr> <th scope="col" class="report-cris" style="text-align:center;">CRIS</th><th scope="col" class="report-heading" style="text-align:center;" colspan="8">VIGILENCE CONTROL DEVICE (VCD) IN LOCO NOT WORKING(SIGN OFF THROUGH KIOSK)(LOCO SHED WISE)(LAST 24 HOURS)<th scope="col" class="report-cris" style="text-align:center;">CMS</th> </tr> <tr style="border:none;"> <th colspan="9" style="border-right:none;"> <span class="report-button" onclick="javascript:history.back();">BACK</span> <span class="report-button" onclick="javascript:window.print();">PRINT</span> </th> <th style="border-left:none;text-align:right;"></th> </tr> </table> <table id="report-table"> <thead> <tr style="border:none;" align="center"> <th>S.No.</th> <th>ID</th> <th>NAME</th> <th>SIGNOFF DATE</th> <th>FROM</th> <th>TO</th> <th>LOCO NO.</th> <th>BASE SHED</th> <th>RAILWAY</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>BINA1482</td> <td >RAKESH KUMAR BAJPAI</td> <td>14-08-2014 11:07</td> <td >BINA</td> <td>ET </td> <td>23551 </td> <td>BRC</td> <td>WR </td> </tr> </tbody> </table> * If duration for this report is last 24 hours or from and to date is same, then only last VCD reporting of the loco will be shown. </body> </html> 

善意地build议解决。

这看起来不正确的HTML,我有两个具有相同的ID在同一页上的元素,但这将解释为什么ieDoc.all.Item(“report-table”)返回一个集合。 我想下面的工作 – 回到设置ieTable = ieDoc.all.Item(“report-table”),然后循环通过返回的收集项目。

尽pipe目前服务器closures,但还是无法testing

  Set ieTable = ieDoc.all.Item("report-table") 'copy the tables html to the clipboard and paste to the sheet If Not ieTable Is Nothing Then oHTML = "" For i = 0 To ieTable.Length - 1 oHTML = oHTML & ieTable.Item(i).outerHTML Next i Set clip = New DataObject clip.SetText "<html>" & oHTML & "</html>" clip.PutInClipboard Sheet1.Select Sheet1.Range("A1").Select Sheet1.PasteSpecial "Unicode Text" End If 

你的上面的行Set ieTable = ieDoc.all.Item("report-table")应该返回所有“report-table”元素的集合。 尝试并遍历它们。 像这样的东西:

 For Each ieTable In ieDoc.all.Item("report-table") 'do stuff Next ieTable 

另外,从IE 11开始, .all将不被支持。 MSbuild议使用getElementById