VBA Excel QueryTables.add .Refresh BackgroundQuery错误

时间:2011-04-05 23:10:08

标签: excel vba excel-vba excel-2007

Sub Macro1()
Dim URL As String
Dim Path As String
Dim i As Integer
For i = 2 To 50
If Range("Prices!E" & i).Value <> 1 Then
URL = Range("Prices!D" & i).Text
Path = Range("Prices!F" & i).Text
End If
Sheet19.Activate
With ActiveSheet.QueryTables.Add(Connection:= _
    "URL;" & URL _
    , Destination:=ActiveSheet.Range("$A$1"))
    .Name = _
    "" & Path
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .WebSelectionType = xlEntirePage
    .WebFormatting = xlWebFormattingNone
    .WebPreFormattedTextToColumns = True
    .WebConsecutiveDelimitersAsOne = True
    .WebSingleBlockTextImport = False
    .WebDisableDateRecognition = False
    .WebDisableRedirections = False
    .Refresh BackgroundQuery:=False
    //'In the Line above the above
    //'Run time error '1004
    //'An unexpected error has occured
End With
Next i
End Sub

上面的代码在指定的行处创建错误。谷歌搜索.Refresh BackgroundQuery表明它在循环中的功能是挑剔的。只需删除该行就不会显示任何内容。

使用当前错误消息,代码适用于第一个i值,然后中断。

对于答案和评论 - TLDR:.Refresh BackgroundQuery:=如果您的查询输入无效或格式错误,False将失败。在这种情况下的问题是for ... next循环调用单元格作为url,它们中没有值。但是,只要查询格式错误,它就会失败。

3 个答案:

答案 0 :(得分:4)

With语句中的所有前面的行都是设置属性 .Refresh BackgroundQuery := False是方法调用。

刷新应该刷新结果 后台查询用于查询SQL数据时是可选的,因此我认为您可以将其关闭并且只有.Refresh

Query Table Refresh Method Help Link

修改 看起来URL有问题,当它进行刷新时,它无法做到。可能是代理问题,或者没有连接到网络,或者URL不存在。

答案 1 :(得分:1)

解决此问题的唯一方法是在每次迭代后删除活动查询表。一个有用的示例解决方案提供:

https://social.technet.microsoft.com/Forums/office/en-US/956dc1b6-bd37-4b97-a042-ba2a37f729b6/removing-querytables-and-leaving-the-results?forum=excel

答案 2 :(得分:0)

我不确定为什么我的修复有效,但现在是:

我还在for循环中使用了querytables.add,我正在添加.asc文件。这个错误只是在最后一次添加后弹出 - 所以我的程序基本上做了我想要的,但它会中断函数。在最后一次运行For循环时,我删除了.Refresh BackgroundQuery:= False语句。它必须通过For循环粘贴我之前所有运行的数据。

基本上我替换了这个:

          .Refresh BackgroundQuery:=False

有了这个:

          If Index = ctr Then

          Else
               .Refresh BackgroundQuery:=False
          End If