Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当显示UserForm时,Excel 2010 VBA代码被卡住_Excel_Vba - Fatal编程技术网

当显示UserForm时,Excel 2010 VBA代码被卡住

当显示UserForm时,Excel 2010 VBA代码被卡住,excel,vba,Excel,Vba,在后台运行web查询(使用InternetExplorer对象)时,我创建了一个UserForm作为进度指示器。该代码被触发,如下所示。进度指标表称为“进度表” Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = Range("B2").Row And Target.Column = Range("B2").Column Then Progress.Show vbModeless

在后台运行web查询(使用InternetExplorer对象)时,我创建了一个UserForm作为进度指示器。该代码被触发,如下所示。进度指标表称为“进度表”

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row = Range("B2").Row And Target.Column = Range("B2").Column Then
        Progress.Show vbModeless
        Range("A4:A65535").ClearContents
        GetWebData (Range("B2").Value)
        Progress.Hide
    End If
End Sub
我从这段代码中看到的是,当单元格B2发生变化时,会弹出进度指示器窗体。我还看到A列中的单元格范围被清除,这告诉我vbModeless正在做我想做的事情。但是,在GetWebData()过程中的某个地方,事情会被挂断。手动销毁进度指示器表单后,GetWebData()例程就会完成,并看到正确的结果。但如果我让进度指示器保持可见,事情就会无限期地陷入困境

下面的代码显示了GetWebData()的作用

Private Sub GetWebData(ByVal Symbol As String)
     Dim IE As New InternetExplorer
    'IE.Visible = True
    IE.navigate MyURL
    Do
        DoEvents
    Loop Until IE.readyState = READYSTATE_COMPLETE
    Dim Doc As HTMLDocument
    Set Doc = IE.document
    Dim Rows As IHTMLElementCollection
    Set Rows = Doc.getElementsByClassName("financialTable").Item(0).all.tags("tr")

    Dim r As Long
    r = 0
    For Each Row In Rows
        Sheet1.Range("A4").Offset(r, 0).Value = Row.Children.Item(0).innerText
        r = r + 1
    Next

End Sub

有什么想法吗?

如果您不习惯使用Excel Web Query,并且只希望在加载数据时显示进度条,您可以尝试将URL作为单独的工作簿打开。如果您这样做,Excel会免费为您提供一个进度条

见我对这个问题的回答:

这种方法的折衷之处在于,您必须自己管理处理返回的数据——Excel不会为您将数据放在给定的目标中


在我们尝试了与您似乎一直在做的事情非常相似的事情之后,我们最终选择了这条路线。

我想您错过了一个DoEvents的电话。按照这里的示例进行操作:在GetWebData()例程中调用了DoEvents。我已经编辑了我的原始问题,以包含GetWebData()的代码。请注意,progress indicator用户表单还包括一些对DoEvents的调用。
GetWebData(Range(“B2”).Value)
应该是
GetWebData Range(“B2”).Value
,如果需要括号,可以使用
Call GetWebData(…)
。如果您使用
WinHTTPRequest
而不是自动运行Internet Explorer,那么它将足够快,不需要进度条