我正在尝试刷新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数据库中没有具有这些名称的表。
答案 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