等到查询完成?

时间:2018-07-25 08:57:32

标签: excel vba excel-vba

我有一个宏,它以CSV格式从网站提取数据并将其放在Sheet1 A1中。现在,我想将数据文本转换为列。如果我运行此pull data宏,然后将文本单独转换为column宏,则效果很好。如果我在一个宏中执行此操作,将无法正常工作,因为需要花费一些时间来提取数据,并且要在数据提取完成之前执行文本到列代码。

如何使宏等到数据提取完成后再对列进行文本处理?

public MainPage()
{
    InitializeComponent();

    WebView.Source = new HtmlWebViewSource
                     {
                         Html = @"<!DOCTYPE html><html><head><style>img { width:100%; }</style></head><body>" + App.strona + @"</body></html>",
                     };
}

3 个答案:

答案 0 :(得分:1)

尝试在其中添加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

或者(该列表令人尴尬),请尝试等待由@zac建议的单元格填充。

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

Dim t As Date
t = Timer

Do
    DoEvents
    If Timer - t = 100 Then Exit Do '<==To avoid infinite loop
Loop While IsEmpty(tgt.Range("A2"))

答案 1 :(得分:1)

有时我会使用OLEDBConnections从数据库刷新数据。 未设置backgroundquery时,它的作用与您相同(它继续运行代码而无需等待查询结束)

代码是这样的

With ActiveWorkbook.Connections("ConnName").OLEDBConnection
   .BackgroundQuery = False
   .CommandText = "Select something"
   .CommandType = xlCmdSql
   .Connection = "connection string"
   .Refresh
End With

尝试为您的连接查找.backgroundquery参数

答案 2 :(得分:1)

.Refresh BackgroundQuery:=False

代替

.Refresh

解决了这个问题。