确定单元格是否通过Excel中的VBA链接到QueryTable

我使用QueryTables将Excel工作表链接到数据源,这很好。 我想引入逻辑来检查给定单元格,并确定该单元格是否是现有QueryTable的左上angular。 这在概念上似乎是微不足道的,但在实践中certificate是难以捉摸的。 如果我试图检查与QueryTable相关的单元格的任何属性,我得到一个错误。 即rng.querytable抛出错误1004如果rng不链接到QueryTable。 所以我搞砸了testing,如果rng.ListObject is nothing根据我在网上find的一些讨论。 事实certificate,如果单元格是一个表,即使该表不是一个QueryTable, rng.ListObject也是如此。 所以没有骰子。

那么如何testing目标单元格是否包含QueryTable?

这是我从Excel先生那里得到的一个function:

 Public Function IsRangeInQueryTable(rngCheck As Range) As Boolean Dim QT As QueryTable For Each QT In rngCheck.Parent.QueryTables If Not Intersect(rngCheck, QT.ResultRange) Is Nothing Then IsRangeInQueryTable = True Exit Function End If Next QT 'If it got to here then the specified range does not lie 'in the result range of any query IsRangeInQueryTable = False End Function 

上面的函数在很多情况下都能正常工作,但是如果我的QueryTable已经从目标中分离出来(这似乎是在实践中发生的),代码会抛出错误1004,因为QueryTable没有目标。 以下是当QueryTable与目标分离时显示的内容:

在这里输入图像说明

FWIW,我也试着用相反的方式来处理这个问题,并迭代工作表中的每个QueryTable。 事实certificate,如果有一个QueryTable的目标被删除,要求QueryTable的QueryTable.Destination抛出一个应用程序错误。 所以我也找不出一个可靠的方法去做这个方法。

这是比它更需要,但是因为“OnError”语句redirect所有错误,我想消除意外处理错误的可能性,例如如果rngNothing

 Public Function cell_has_query(rng As Range) As Boolean If rng Is Nothing Then cell_has_query = False Exit Function End If If rng.ListObject Is Nothing Then cell_has_query = False Exit Function End If On Error GoTo ErrHandler If Not rng.ListObject.QueryTable Is Nothing Then cell_has_query = True End If Exit Function ErrHandler: If Err.Number = 1004 Then 'Application-Defined or Object-Defined Error cell_has_query = False Else On Error GoTo 0 Resume End If End Function 

@JDLong VBAerror handling很奇怪。 错误的默认设置是On Error GoTo 0 ,这意味着(取决于您的VBA IDE设置;工具 – >选项 – >常规)将popup一个消息框,用于未处理的错误。 如果你想显式地捕获和处理错误,你可以创build一个标签(例如“ErrHandler”),然后通过使用Exit Function结束函数来确保代码段无法正常访问。 在标签后面的代码块中,可以检查Err对象的属性,然后selectResume重试导致错误的代码行, Resume Next可以跟随出错的那一行,或者简单地处理错误并让该function正常退出。 您还可以通过将模式设置回On Error GoTo 0然后Resume该行来重新评估错误。

由于某些原因,我不清楚,我的查询表不在listobjects。 我认为所有的查询表都在列表对象中,但是我已经运行了足够多的testing来向我自己certificate我不是。 所以我稍微编辑了@ blackhawk的这个function:

 Public Function cell_has_query(rng As Range) As Boolean If rng Is Nothing Then cell_has_query = False Exit Function End If On Error GoTo ErrHandler If Not rng.QueryTable Is Nothing Then cell_has_query = True End If Exit Function ErrHandler: If Err.Number = 1004 Then 'Application-Defined or Object-Defined Error - this throws if there is a querytable with no destination cell_has_query = False Else On Error GoTo 0 Resume End If End Function