Excel问题:对象变量或块未设置变量

时间:2016-07-05 23:31:04

标签: excel vba excel-vba

我有一个代码在70%的时间内适用于我,有时它会抛出错误代码 91 "Object Variable or With block Variable not set" < / strong>即可。如果我单击结束并重新运行它将正常工作。

该功能正在获取输入到Excel电子表格的单元格中的数据,并填充文本框,检查单选按钮以及从网页上的下拉列表中进行选择。

我无法发布指向隐私问题的实际网页的链接,但我希望有人可以帮我解决错误的原因?

显示错误的行是  的 drp.selectedIndex = Thisworkbook.sheets("sheet1").Range("L2").

Sub FillInternetForm()
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")

'set references for copying to submitted reps sheet and deleting for next                  rep
Application.ScreenUpdating = False

'create new instance of IE.

ie.navigate "removed for privacy"

'go to web page listed inside quotes
ie.Visible = True


While ie.busy
DoEvents 'wait until IE is done loading page.
Wend

'select onboarding system CRIS or ENS
Set html = ie.document
Dim drp As HTMLFormElement
Set drp =     html.getElementById("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff45_1$ctl00    $DropDownChoice")
drp.selectedIndex = ThisWorkbook.Sheets("sheet1").Range("L2")

'set address nickname based on value
Set drp =     html.getElementById("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff32_1$ctl00    $Lookup")
drp.selectedIndex = ThisWorkbook.Sheets("sheet1").Range("m2")

'set market based on value
Set drp =     html.getElementById("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff6_1$ctl00$    DropDownChoice")
drp.selectedIndex = ThisWorkbook.Sheets("sheet1").Range("e2")

'check Not moved from another partner
ie.document.getElementById("ctl00_m_g_62853594_bb4b_4cec_8b5c_17fb6abb735e_ff46_1_ctl00_ctl01").Click

'input name and ssn based on excel sheet values
ie.document.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff3_1$ctl00$ctl00$TextField").Value = ThisWorkbook.Sheets("sheet1").Range("a2")
ie.document.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff4_1$ctl00$ctl00$TextField").Value = ThisWorkbook.Sheets("sheet1").Range("b2")
ie.document.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff5_1$ctl00$ctl00$TextField").Value = ThisWorkbook.Sheets("sheet1").Range("c2")

'input extra fields based on ICL value
'owner
ie.document.all("ctl00_m_g_62853594_bb4b_4cec_8b5c_17fb6abb735e_ff11_1_ctl00_ctl00_TextField").Value = ThisWorkbook.Sheets("sheet1").Range("j2")
'city
ie.document.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff14_1$ctl00$ctl00$TextField").Value = ThisWorkbook.Sheets("sheet1").Range("f2")
'state
ie.document.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff15_1$ctl00$ctl00$TextField").Value = ThisWorkbook.Sheets("sheet1").Range("g2")
'address
ie.document.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff13_1$ctl00$ctl00$TextField").Value = ThisWorkbook.Sheets("sheet1").Range("i2")
'phone
    ie.document.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff10_1$ctl00$ctl00$TextField").Value = ThisWorkbook.Sheets("sheet1").Range("k2")
'zip
ie.document.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff16_1$ctl00$ctl00$TextField").Value = ThisWorkbook.Sheets("sheet1").Range("h2")


End Sub

2 个答案:

答案 0 :(得分:0)

While ie.busy可能是罪魁祸首。请改用Loop Until ie.readyState = READYSTATE_COMPLETE

我会使用.Range("L2")CInt(.Range("L2"))转换为整数。您有对HTML对象库集的引用。您应该继续添加对Microsoft Internet Controls的引用。通过这种方式,您将获得智能感知和互联网常数的优势。如果您不想设置引用,请在代码中添加Const READYSTATE_COMPLETE = 4并更改ie引用

Sub FillInternetForm()
    Dim ie As InternetExplorer
    Dim doc As HTMLDocument

    Set ie = New InternetExplorer

    'set references for copying to submitted reps sheet and deleting for next rep
    Application.ScreenUpdating = False

    'create new instance of IE.

    ie.navigate "removed for privacy"

    'go to web page listed inside quotes
    ie.Visible = True

    Do
        DoEvents
    Loop Until ie.readyState = READYSTATE_COMPLETE

    With Sheets("sheet1")

        'select onboarding system CRIS or ENS
        Set doc = ie.document
        Dim drp As HTMLFormElement
        Set drp = HTML.getElementById("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff45_1$ctl00    $DropDownChoice")
        drp.selectedIndex = CInt(.Range("L2"))

        'set address nickname based on value
        Set drp = HTML.getElementById("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff32_1$ctl00    $Lookup")
        drp.selectedIndex = CInt(.Range("m2"))

        'set market based on value
        Set drp = HTML.getElementById("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff6_1$ctl00$    DropDownChoice")
        drp.selectedIndex = CInt(.Range("e2"))

        'check Not moved from another partner
        doc.getElementById("ctl00_m_g_62853594_bb4b_4cec_8b5c_17fb6abb735e_ff46_1_ctl00_ctl01").Click

        'input name and ssn based on excel sheet values
        doc.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff3_1$ctl00$ctl00$TextField").value = .Range("a2")
        doc.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff4_1$ctl00$ctl00$TextField").value = .Range("b2")
        doc.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff5_1$ctl00$ctl00$TextField").value = .Range("c2")

        'input extra fields based on ICL value
        'owner
        doc.all("ctl00_m_g_62853594_bb4b_4cec_8b5c_17fb6abb735e_ff11_1_ctl00_ctl00_TextField").value = .Range("j2")
        'city
        doc.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff14_1$ctl00$ctl00$TextField").value = .Range("f2")
        'state
        doc.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff15_1$ctl00$ctl00$TextField").value = .Range("g2")
        'address
        doc.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff13_1$ctl00$ctl00$TextField").value = .Range("i2")
        'phone
        doc.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff10_1$ctl00$ctl00$TextField").value = .Range("k2")
        'zip
        doc.all("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff16_1$ctl00$ctl00$TextField").value = .Range("h2")
    End With

End Sub

答案 1 :(得分:0)

我同意@Thomas Inzina的说法,可能是因为该文件还没有完全装满。

但我在过去的项目中发现,处理这30%失败率的最佳方法是等待更长时间&#34;在处理或引用元素之前。

尝试在selectedIndex调用之前添加DoEvents和Sleep命令。 看看它是否有所作为

在模块的顶部(声明任何潜艇之前)

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

然后在开始设置doc变量

之前添加两行
Doevents
Sleep 2000 ' Sleep two seconds (2000 ms)
Set doc = ie.document

一旦获得适合您的号码,您就可以玩睡眠值

  

编辑 - 添加解决方案

更可靠的方法是实际运行具有DoEvents / Sleep的循环和numTries的递增计数器。只有在检查getElementById失败时才会退出循环 - 或者达到你的maxTries计数器。

非常简单的循环,但如果您需要一个示例,请告诉我

  

编辑 - 示例:等待加载循环

更改此

Set drp = HTML.getElementById("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff45_1$ctl00    $DropDownChoice")
drp.selectedIndex = CInt(.Range("L2"))

对此:

Dim iTries As Integer
Dim iMaxTries As Integer ' it's better to turn this into a const at top of your sub

iMaxTries = 3
iTries = 0
While (iTries < iMaxTries) And IsNull(HTML.getElementById("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff45_1$ctl00    $DropDownChoice"))
    iTries = iTries + 1
    DoEvents
    Sleep 750 ' try 3/4 second delays to start with
Wend

If iTries = iMaxTries Then
    MsgBox "Did not load HTML element in " & iMaxTries & " tries"
    Exit Sub
End If

' Should all be loaded and ready to process now
Set drp = HTML.getElementById("ctl00$m$g_62853594_bb4b_4cec_8b5c_17fb6abb735e$ff45_1$ctl00    $DropDownChoice")
drp.selectedIndex = CInt(.Range("L2"))