Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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
Excel 正在等待查询完成,然后继续_Excel_Vba_Powerquery - Fatal编程技术网

Excel 正在等待查询完成,然后继续

Excel 正在等待查询完成,然后继续,excel,vba,powerquery,Excel,Vba,Powerquery,我在这本手册里有这个 Private Sub Workbook_Open() Workbooks(ThisWorkbook.Name).RefreshAll End Sub 我所有的查询都在更新中 我想将查询收集的一些信息移动到另一个位置。我使用不同的范围 Sub Move_data() Dim rng1, rng2, rng3 As Range Set rng1 = Worksheets("Sheet1").Range("A3:F103") rng1.Valu

我在这本手册里有这个

Private Sub Workbook_Open()
    Workbooks(ThisWorkbook.Name).RefreshAll
End Sub
我所有的查询都在更新中

我想将查询收集的一些信息移动到另一个位置。我使用不同的范围

Sub Move_data()
    Dim rng1, rng2, rng3 As Range
    Set rng1 = Worksheets("Sheet1").Range("A3:F103")
    rng1.Value = Worksheets("Sheet2").Range("A11:F111").Value

    'etc for rng2 and rng3... 
End Sub
问题是VBA开始更新查询,然后将“旧”数据移动到我的新位置。我想等到查询完成更新,然后自动移动数据

我可以设置一个超时时间段,但是查询更新所需的时间是非常可变的(介于10秒到2分钟之间)

另外,是否有一种方法可以加快查询更新。我试过这个:

Application.ScreenUpdating = False

但查询/表/图仍在闪烁/更新。我认为这是由于Power Query的属性造成的,并且假设我需要编写其他内容。

您应该能够更改查询的属性,以便查询不会“在后台刷新”-这是导致宏在查询完全运行之前继续的原因

  • 转到功能区:[数据]
  • 点击[连接]
  • 选择要影响的查询
  • 按[属性]
  • 取消勾选[启用后台刷新]

现在,当您运行刷新宏时,执行将暂停,直到查询完成并拉入数据。

假设您有一个从单元格A1开始的表

此解决方案清除单元格A1的内容,并依靠刷新来重新填充它

Do While循环检查单元格A1的内容,并等待单元格填充完毕

为了避免潜在的无限循环,使用计数器在多次重复后停止循环

Dim counter As Long
Dim maxcount As Long
Dim ws As Worksheet
maxcount = 10000
Set ws = ThisWorkbook.Sheets(1)
ws.Activate
' some code
ws.Cells(1,1).Clear
DoEvents

' Refresh statement
ws.ListObjects(1).Refresh

' Wait for refresh or timer to expire
Do While ws.Cells(1,1).value = ""
  Application.Wait(100)
  counter = counter + 100
  If counter >= maxcount then
    MsgBox "Refresh failed"
    End
  End If
Loop
DoEvents

是否可以将查询设置为在打开工作簿时更新?然后,一旦按下按钮,刷新的数据将被移动。此解决方案中的基础查询应该在SQL类别中-Im假设您正在通过ODBC执行SQL查询以获取数据?这是MS Access还是SQL server?我们需要知道您是如何获得模型中的数据的,然后才能对查询性能提出建议。有关excel中查询速度的有趣文章:在回答您关于延迟的问题时,您只需使用一些vba实现从现在到过了一定时间的延迟-用法:Application.Wait now+#0:00:01#@jimmy8ball如果您知道需要多长时间,这是可能的,但随着运行查询所需时间的变化,您必须猜测所需的最大时间。我认为他正在寻找一个答案,该答案将检测查询何时完成,然后让代码运行。