【问题标题】:Loop Through TD Element in HTML document from inside Frame VBA Excel IE8 Automation从Frame VBA Excel IE8自动化内部循环遍历HTML文档中的TD元素
【发布时间】:2015-01-03 17:16:02
【问题描述】:

我正在尝试使用 Excel VBA 在特定网页框架内捕获表格数据。

很遗憾,该网站是非公开网站,因此我无法提供访问权限。

这是我从我需要的表中从 Firefox 调试器中提取的 HTML END 的 sn-p(显示最后的单元格数据)。

<td class="ewrcc s35 b-17"><div class="ewrcv-nw">ExampleValue</div></td>
</tr></tbody></table>

我已经编辑了我的帖子,因为@Tim Williams 为我指出了正确的方向,首先设置了对网页内框架的引用(框架 12)

设置参考后,我发现所有表格数据使用:

Set HTMLDoc = ie.document.frames(12).document
Set HTMLTD = HTMLDoc.getElementsByTagName("TD")

For xTD = 0 to HTMLTD.length - 1  

j = Len(HTMLDoc.getElementsByTagName("TD")(xTD).innertext)   

    If j > 0 and j < 50 then

    '''Code here

    debug.print HTMLDoc.getElementsByTagName("TD")(xTD).className
    debug.print HTMLDoc.getElementsByTagName("TD")(xTD).Innertext

    End If

Next xTD

我制作了一个电子表格,可以通过使用静态已知字符串(“Oct”)中的 Innertext 以某种繁琐的方式捕获数据,然后循环计数我正在检索的每个表的已知列数( 2 在这种情况下)

通常我循环遍历 Row/Cell .length,但我发现在循环遍历 TD 元素时,它们没有来自我使用的方法的 ROW/CELL 对象。我更喜欢这种方式,因为它看起来更快,而且我可以在不提示变量触发表格填充位置的情况下自动执行任务。

我现在的问题是:有什么我忽略的吗?例如。我可以通过参考框架 12 访问表格并循环访问子/父等吗?如果可能的话,我真的很想引用表格对象来循环遍历行和单元格

这是表格最后一行的更大的 sn-p,我需要提取的值标记为“DATA VALUE 1-21”:

</tr>
<tr class="r46" style="height:15pt;">
<td class="ewrcc s4 b-33"></td>
<td class="ewrcc s23 b-21"><div class="ewrcv-nwl">DATA VALUE 1/21</div>
</td><td class="ewrcc s24 b-21"></td>
<td class="ewrcc s24 b-21"></td>
<td class="ewrcc s33 b-24"><div class="ewrcv-nw">DATA VALUE 2/21</div></td>
<td class="ewrcc s33 b-24"><div class="ewrcv-nw">DATA VALUE 3/21</div></td>
<td colspan="3" class="ewrcc s23 b-35">
<div class="ewrcv-nwl">DATA VALUE 4/21</div></td>
<td ewrcolumnindex="9" class="ewrcc s24 b-21">
<div class="ewrcv-nw">DATA VALUE 5/21</div></td>
<td class="ewrcc s23 b-24"><div class="ewrcv-nwl">DATA VALUE 6/21</div></td>
<td class="ewrcc s23 b-21"></td>
<td class="ewrcc s23 b-21"></td><td colspan="2" class="ewrcc s23 b-35">
<div class="ewrcv-nwl">DATA VALUE 7/21</div></td>
<td ewrcolumnindex="15" class="ewrcc s34 b-21">
<div class="ewrcv-nw">DATA VALUE 8/21</div></td>
<td class="ewrcc s25 b-24"><div class="ewrcv-nw">DATA VALUE 9/21</div></td>
<td class="ewrcc s33 b-24"><div class="ewrcv-nw">DATA VALUE 10/21</div></td>
<td class="ewrcc s24 b-24"><div class="ewrcv-nw">DATA VALUE 11/21</div></td>
<td class="ewrcc s33 b-24"><div class="ewrcv-nw">DATA VALUE 12/21</div></td>
<td class="ewrcc s33 b-24"><div class="ewrcv-nw">DATA VALUE 13/21</div></td>
<td class="ewrcc s33 b-24"><div class="ewrcv-nw">DATA VALUE 14/21</div></td>
<td class="ewrcc s33 b-24"><div class="ewrcv-nw">DATA VALUE 15/21</div></td>
<td class="ewrcc s33 b-24"><div class="ewrcv-nw">DATA VALUE 16/21</div></td>
<td class="ewrcc s33 b-24"><div class="ewrcv-nw">DATA VALUE 17/21</div></td>
<td class="ewrcc s24 b-24"><div class="ewrcv-nw">DATA VALUE 18/21</div></td>
<td class="ewrcc s33 b-24"><div class="ewrcv-nw">DATA VALUE 19/21</div></td>
<td class="ewrcc s33 b-24"><div class="ewrcv-nw">DATA VALUE 20/21</div>
</td><td class="ewrcc s33 b-35">
<div class="ewrcv-nw">DATA VALUE21/21</div>/td>
</tr>

【问题讨论】:

  • 到目前为止你尝试过什么?如果您可以获得对框架的引用,那么myFrame.document.tables 将为您提供该框架文档中的所有表格。当您找到正确的表格时,myTable.getElementsByTagname("td") 将为您提供该表格中的所有单元格(或者您可以遍历 .Rows 集合) - 您必须检查每个 td 的 className 以找到您想要的那个.
  • 感谢@Tim Williams 的快速回复。我不确定如何正确分配 Frame 对象。我尝试了以下方法: Set MyFrame = ie.document.frames(12) Set MyTable = MyFrame.document.Tables 但是,我无法将 MyTable 分配给 MyFrame Tables 引用。我不认为我这样做是正确的。我还可以使用以下方法查看我需要的所有数据:ie.document.frames(12).document.documentelement.innertext 但我似乎无法正确引用表格来循环或选择“TD”标签。再次感谢您的关注
  • document.tables 返回表对象的集合,而不是单个表,因此您需要 set myTable=ie.document.frames(12).document.tables(1) 之类的东西,具体取决于有多少表以及您想要哪一个。
  • 谢谢蒂姆,我试过了,但收到 438 错误。我尝试使用从 0 开始的不同表编号,还尝试使用 myTable=ie.document.frames(12).Tables(1 ) 没有成功。我将再次编辑该帖子,并包含我不久后用一些 cmets 提取的 HTML 的更大代码 sn-p.. 非常感谢您的建议

标签: html excel html-table frame vba


【解决方案1】:

该框架中有多少张桌子?

尝试类似:

Set HTMLDoc = ie.document.frames(12).document
Set tbls = HTMLDoc.getElementsByTagName("table")

For x = 0 to tbls.length - 1  
    Set tbl = tbls(x)
    debug.print "Table# " & (x+1), "rows=" & tbl.Rows.length
Next x

【讨论】:

  • 有几张桌子。非常感谢我通过在验证之前检查行长度解决了这个问题。这为我节省了很多故障排除时间。
猜你喜欢
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多