0

我像这样创建了一个浏览器,然后手动导航到我需要的网页。我打算通过单独的宏进入需要打开的页面后自动提取某些元素

Sub Test()


Set CAS = New SHDocVw.InternetExplorer                     ' create a browser
CAS.Visible = True ' make it visible

CAS.navigate "http://intraneturl"

Do Until CAS.readyState = 4
DoEvents
Loop

这工作正常,然后我做

Public Sub Gather

Set HTMLDoc2 = CAS.document.frames("top").document

Call Timer1

With HTMLDoc2
.getElementById("tab4").FirstChild.Click
End With

Call Timer2


Dim fir, las, add1, add2, cit, stat, zi As String

Dim First As Variant
Dim Last As Variant
Dim addr1 As Variant
Dim addr2 As Variant
Dim city As Variant
Dim Thisstate As Variant
Dim Zip As Variant

Call Timer2

Set HTMLDoc = CAS.document.frames("MainFrame").document

Call Timer2

With HTMLDoc

First = .getElementsByName("IndFirst")
Last = .getElementsByName("IndLast")
addr1 = .getElementsByName("txtAdd_Line1")
addr2 = .getElementsByName("txtAdd_Line2")
city = .getElementsByName("txtAdd_City")
Thisstate = .getElementsByName("cmb_Add_State")
Zip = .getElementsByName("txtAdd_Zip")

End With



fir = First.Value
las = Last.Value
add1 = addr1.Value
add2 = addr2.Value
cit = city.Value
stat = Thisstate.Value
zi = Zip.Value

'navigate back to start page

 With HTMLDoc2
.getElementById("tab3").FirstChild.Click
End With
End Sub

这第一次有效,但在第一次之后,当尝试在包含类似信息的不同网页上再次运行gather()子时,我得到“对象变量或未设置块变量”。关于我做错了什么的任何想法?

4

1 回答 1

0

“错误”对象变量或未设置块变量“发生在:设置 HTMLDoc2 = CAS.document.frames(“top”).document 我第二次尝试运行 Gather()。”

这可能是以下三件事之一:

  1. CAS 不再是对象 要检查这一点,请在行上设置断点,在 VBA 编辑器中按 ctr+G 并?CAS Is Nothing在即时窗口中键入;结果应该是假的;如果是 True CAS 不再是对象

  2. 就像 Daniel Dusek 建议的那样,确保 CAS.document.frames("top") 是页面上的实际元素。要检查这一点,请打开您尝试编写脚本的网页,在 Internet Explorer 中按 F12,单击工具栏中的箭头并单击网页中的“顶部”框架元素,切换回开发人员工具并查看该行突出显示。确保框架元素被命名为“top”。

  3. 当您尝试引用框架元素时,HTML 尚未完全加载。设置更长的延迟或循环。

即(未经测试):

    Do Until HtmlDoc2 Is Nothing = false
      Set HTMLDoc2 = CAS.document.frames("top").document 
    Loop

也许更重要的问题是为什么要手动导航到另一个页面?难道你不能自动化你的过程的那部分吗?

于 2012-10-02T21:44:37.880 回答