SQL表不存在时VBA中的运行时错误

时间:2019-07-30 13:19:03

标签: sql-server excel vba

我正在尝试刷新Excel数据库中Excel中的某些表。 SQL表是在有数据可放入时创建的,因此有时不创建这些表。我相信当在SQL中找不到表时,VBA中出现以下错误。如何避免此错误?

我考虑过使宏“检查”表是否存在,如果存在,请刷新它,但我不知道如何执行此操作,也没有发现类似的问题。另外,我想知道“下一个错误恢复”语句是否可行,因为我不在乎是否有错误,我只希望宏通过每个刷新实例(我正在尝试刷新3个表)。 / p>

Sub RefreshAll()
    Range("Duplicates").ListObject.QueryTable.Refresh BackgroundQuery:=False
    Range("Fatal_Error").ListObject.QueryTable.Refresh BackgroundQuery:=False
    Range("Wrong_MCN").ListObject.QueryTable.Refresh BackgroundQuery:=False

    MsgBox ("Tables have been refreshed")
End Sub

我收到的错误消息是:

  

运行时错误1004:对象_Global的方法范围失败。

请注意,在我的代码中,第一行运行没有问题,并带来了所有数据。 “ refresh”的第二和第三行给出了错误,因为SQL数据库中没有具有这些名称的表。

1 个答案:

答案 0 :(得分:0)

不是数据库或其表;如果是这种情况,则Refresh的方法QueryTable将会失败。

它在此之前就失败了;当您隐式引用Range且该工作表中不存在指定的范围/名称时(无论工作表处于活动状态),都会对(隐藏)对象_Global的方法ActiveSheet进行调用当时),失败了。

从要获得Worksheet的{​​{1}}开始:

Range

如果您需要使用的工作表在编译时位于Sheet1.Range("named range")... 中,则可以通过设置其ThisWorkbook属性来为其指定代号;然后,只要您需要参考该特定工作表,就可以在代码中使用该代码名称标识符。

如果名称实际上是表名,则使用工作表的(Name)集合进行检索:

ListObjects

对于Sheet1.ListObjects("Duplicates").QueryTable.Refresh Sheet2.ListObjects("Fatal_Error").QueryTable.Refresh ... 和“我不在乎是否有错误” ...不要这样做。您一定要注意是否有错误。在这种情况下,甚至没有找到(Excel)表本身:那里的错误意味着永远不会发生刷新。 OERN只是将错误推到地毯下,并假装它们没有发生:它不会神奇地使甚至没有找到的桌子都焕然一新。当有太多原因导致某件事失败时,OERN会使调试变得比原本要困难得多。

诀窍是将获取表对象刷新它的行为分开。

当您需要运行可能会失败的东西但需要忽略该错误(例如,由于SQL表不存在而无法刷新QueryTable)时,OERN非常有用-将刷新调用放入其自己的范围,然后离开它只有一个失败的原因:

On Error Resume Next

现在,只要您拥有对Private Function TryRefresh(ByVal qt As QueryTable) As Boolean On Error Resume Next qt.Refresh BackgroundQuery:=False TryRefresh = Err.Number = 0 On Error GoTo 0 End Function 对象的有效对象引用,就可以调用此专门过程-例如:

QueryTable