使用DOM查找HTML表中的最后一行

时间:2016-03-16 14:41:42

标签: html vbscript

我在Macro Express Pro中开发一个宏,它使用VBScript来清理HTML表以收集数据。我收集的数据在FLN列中。我想构建一个用户可以使用FLN选择的列表,然后他们可以收集行中的其余细节以在其他应用程序中使用。该列表如下所示:

enter image description here

我的问题是该列表仅显示七个订单项。我在这个例子中使用的表有八行。发生了什么事情我正在循环创建这个列表,但是当我完成复制最后一个FLN并转到表格中的下一行(以黄色突出显示)时,我得到一个对象必需的错误。

enter image description here

我需要能够读取此行,以便我可以捕获表中的所有行,然后在到达突出显示的行时退出循环。不幸的是,带有表的站点的创建者从未命名过表。有一个div有一个ID(div id="pnlBtn")。我尝试过查找此ID,并收到对象错误。

enter image description here

我目前正在尝试查找表中的最后一行,但这给了我一个对象错误。我知道我的代码的objIE.document部分正在工作,因为我能够生成上面的列表。这是通过将I中的计数器Do Until...Loop设置为8来完成的,该计数器仅生成七行。如果我将I设置为9,则会出现对象错误。

以下是与我合作的代码:

   tdNode = 50

   FLNDCC = objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Value
   I = 1
   List = ""
   intExitCount = 1
   Do Until I = 8
      If FLNDCC = NewFLNDCC Then
         Exit Do
      End If
      If NewFLNDCC <> "" Then
         FLNDCC = NewFLNDCC
      End If

      FLNDCC = I & ". " & FLNDCC
      List = List & FLNDCC & vbCrLf
      FLNDCC = Replace(FLNDCC, I & ". ", "")

      TestRow = objIE.document.getElementsByTagName("tr")
      For j = 0 To TestRow.length
          MsgBox j
      Next

      I = I + 1

      NewFLNDCC = objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Value

      If IsEmpty(NewFLNDCC) = True Then
         Exit Do
      End If

      intExitCount = intExitCount + 1
      If intExitCount = 10 Then
         MsgBox "Do loop in VERIFY_HOV subroutine stuck in a loop." & vbCrLf & "Please submit an issue request with this message.", 48, "Stuck in Do Loop"
         SetEverythingToNothing
      End If
   Loop
   If I > 1 Then
      Opt = InputBox("Please select the FLNDCC you want to work with:" & vbNewLine & List & vbNewLine, "Select an FLNDCC")
      If IsEmpty(Opt) = True Then
         Wscript.Echo "EXIT"
         SetEverythingToNothing
      End If
      Opt = Opt - 1
      tdNode = 50 + (Opt * 21)
   Else
      tdNode = 50
   End If
   FLNDCC = objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Value

是否有一种万无一失的方法可以找到不会产生对象错误的表格的最后一行?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我不需要找到最后一行(以黄色突出显示),我只需要避免错误。创建错误的行是:

NewFLNDCC = objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Value

在我的第九次循环中,我无法找到txt_input1值,因为它不在那里。这给了我一个对象错误。这就是我解决它的方法:

On Error Resume Next
   NewFLNDCC = objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Value
On Error goto 0

现在,我可以将I设置为100,即使只有8条可见行,但只有txt_input1不再可用,它才会启动,并打印所有8行的列表。