我在Macro Express Pro中开发一个宏,它使用VBScript来清理HTML表以收集数据。我收集的数据在FLN列中。我想构建一个用户可以使用FLN选择的列表,然后他们可以收集行中的其余细节以在其他应用程序中使用。该列表如下所示:
我的问题是该列表仅显示七个订单项。我在这个例子中使用的表有八行。发生了什么事情我正在循环创建这个列表,但是当我完成复制最后一个FLN并转到表格中的下一行(以黄色突出显示)时,我得到一个对象必需的错误。
我需要能够读取此行,以便我可以捕获表中的所有行,然后在到达突出显示的行时退出循环。不幸的是,带有表的站点的创建者从未命名过表。有一个div
有一个ID(div id="pnlBtn"
)。我尝试过查找此ID,并收到对象错误。
我目前正在尝试查找表中的最后一行,但这给了我一个对象错误。我知道我的代码的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
是否有一种万无一失的方法可以找到不会产生对象错误的表格的最后一行?
答案 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行的列表。