Vba 等待查询完成?

Vba 等待查询完成?,vba,excel,Vba,Excel,我有一个宏,它以CSV格式从网站中提取数据,并将其放在Sheet1A1中。现在我想将数据文本转换为列。如果我运行这个pull data宏,然后分别运行text to columns宏,它就可以正常工作。如果我在一个宏中执行此操作,它将不起作用,因为拉取数据需要一些时间,并且文本到列的代码在拉取数据完成之前执行 如何使宏等待数据提取完成,然后对列执行文本转换 Option Explicit Sub PPR() Dim wb As Workbook Dim tgt As Work

我有一个宏,它以CSV格式从网站中提取数据,并将其放在Sheet1A1中。现在我想将数据文本转换为列。如果我运行这个pull data宏,然后分别运行text to columns宏,它就可以正常工作。如果我在一个宏中执行此操作,它将不起作用,因为拉取数据需要一些时间,并且文本到列的代码在拉取数据完成之前执行

如何使宏等待数据提取完成,然后对列执行文本转换

Option Explicit

Sub PPR()

    Dim wb As Workbook
    Dim tgt As Worksheet
    Dim stt As Worksheet
    Set wb = ThisWorkbook
    Set tgt = wb.Sheets("Sheet1")
    Set stt = wb.Sheets("Sheet2")
    tgt.Cells.ClearContents
    Dim pID As String
    Dim sType As String
    Dim sDateInt As String
    Dim sHourInt As String
    Dim sMinuteInt As String
    Dim eDateInt As String
    Dim eHourInt As String
    Dim eMinuteInt As String
    Dim url As String
    Dim url1 As String
    Dim url2 As String
    Dim url3 As String
    Dim url4 As String
    Dim url5 As String
    Dim url6 As String
    Dim url7 As String
    Dim url8 As String

'Variables
    pID = stt.Range("B1")
    sType = stt.Range("B2")
    sDateInt = Format(Now, "YYYY/MM/DD")
    sHourInt = stt.Range("B4")
    sMinuteInt = stt.Range("C4")
    eDateInt = Format(Now, "YYYY/MM/DD")
    eHourInt = stt.Range("B5")
    eMinuteInt = stt.Range("C5")

    url1 = "URL;https://blabla.com/reports/blabla?reportFormat=CSV&blabla=bla"
    url2 = url1 & "&blabla=" & pID
    url3 = url2 & "&maxIntradayDays=1&spanType=" & sType
    url4 = url3 & "&startDateIntraday=" & sDateInt
    url5 = url4 & "&startHourIntraday=" & sHourInt
    url6 = url5 & "&startMinuteIntraday=" & sMinuteInt
    url7 = url6 & "&endDateIntraday=" & eDateInt
    url8 = url7 & "&endHourIntraday=" & eHourInt
    url = url8 & "&endMinuteIntraday=" & eMinuteInt

    With tgt.QueryTables.Add(Connection:= _
        url, _
        Destination:=tgt.Range("A1"))
        .Refresh
    End With

    tgt.Activate
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
    :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
    Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
    ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1)), _
    TrailingMinusNumbers:=True


End Sub

尝试在中添加DoEvents以向操作系统提供控制

DoEvents

With tgt.QueryTables.Add(Connection:= _
        url, _
        Destination:=tgt.Range("A1"))
        .Refresh
End With
和/或:

使用显式等待

With tgt.QueryTables.Add(Connection:= _
        url, _
        Destination:=tgt.Range("A1"))
        .Refresh
End With

Application.Wait Now + TimeSerial(0,0,5) '<== Adjust number of seconds
与tgt.QueryTables.Add(连接:=_
网址_
目的地:=tgt.范围(“A1”))
刷新
以

Application.Wait Now+TimeSerial(0,0,5)”尝试在中添加DoEvents以向操作系统提供控制

DoEvents

With tgt.QueryTables.Add(Connection:= _
        url, _
        Destination:=tgt.Range("A1"))
        .Refresh
End With
和/或:

使用显式等待

With tgt.QueryTables.Add(Connection:= _
        url, _
        Destination:=tgt.Range("A1"))
        .Refresh
End With

Application.Wait Now + TimeSerial(0,0,5) '<== Adjust number of seconds
与tgt.QueryTables.Add(连接:=_
网址_
目的地:=tgt.范围(“A1”))
刷新
以

Application.Wait Now+TimeSerial(0,0,5)“我有时使用OLEDB连接刷新数据库中的数据。 当未设置
backgroundquery
时,它的行为与您的相同(它继续运行代码而不等待查询结束)

代码是这样的


尝试查找连接的
.backgroundquery
参数

我有时使用OLEDB连接刷新数据库中的数据。
.Refresh BackgroundQuery:=False
当未设置
backgroundquery
时,它的行为与您的相同(它继续运行代码而不等待查询结束)

代码是这样的

尝试查找连接的
.backgroundquery
参数

.Refresh BackgroundQuery:=False
而不是

.Refresh
解决了这个问题

而不是

.Refresh


已修复此问题。

您是否可以在查询后检查目的地范围并等待其填充?此外,您不需要激活工作表或
。请选择一个范围。它实际上毫无用处。您已经完成了早期绑定,只需使用
tgt
我该怎么做?另外,我尝试了tgt.TextToColumns,但它不起作用。假设您的范围没有开始值(即A1没有值),您可以尝试类似
Len(Trim(tgt.range(“A1”).value))=0的方法,然后
。。现在您可以使用显式等待(即
Application.wait now+TimeSerial(0,0,5)
。复制表单@QHarr)。也就是说,QHarr可能是在正确的轨道上,它的公司内部网站是公众无法访问的…你能不能在查询后检查目的地范围,然后等待它被填充?此外,您不需要激活工作表或
。请选择一个范围。它实际上毫无用处。您已经完成了早期绑定,只需使用
tgt
我该怎么做?另外,我尝试了tgt.TextToColumns,但它不起作用。假设您的范围没有开始值(即A1没有值),您可以尝试类似
Len(Trim(tgt.range(“A1”).value))=0的方法,然后
。。现在您可以使用显式等待(即
Application.wait now+TimeSerial(0,0,5)
。复制表单@QHarr)。说这句话,QHarr可能是在正确的轨道上,它的公司内部网站是公众无法访问的…我已经尝试了Doevents,但它不起作用。另外,显式也不起作用。什么是不起作用?如果您在查询后放置了足够长的显式等待时间,那么只要查询运行,数据就会在那里。查询通常只需要不到5秒的时间。我刚刚尝试了应用程序。现在等待+时间序列(0,0,30),它会以某种方式延迟查询。有外部数据:获取数据。。。30秒后,仍然没有文本到列。是否有一个在开始时未填充的单元格预期在查询运行后填充?同一列中靠近顶部的单元格?e、 g.A2?@QHarr,
DoEvents
是否需要在查询之后?我已经尝试了DoEvents,但它不起作用。另外,显式也不起作用。什么是不起作用?如果您在查询后放置了足够长的显式等待时间,那么只要查询运行,数据就会在那里。查询通常只需要不到5秒的时间。我刚刚尝试了应用程序。现在等待+时间序列(0,0,30),它会以某种方式延迟查询。有外部数据:获取数据。。。30秒后,仍然没有文本到列。是否有一个在开始时未填充的单元格预期在查询运行后填充?同一列中靠近顶部的单元格?e、 g.A2?@QHarr,
DoEvents
是否需要在查询之后?