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

时间:2016-11-07 22:19:37

标签: excel vba excel-vba

我使用QueryTables将Excel工作表链接到数据源,效果很好。我想引入逻辑来检查给定的单元格,并确定该单元格是否是现有QueryTable的左上角。这在概念上似乎微不足道,但在实践中证明是难以捉摸的。如果我尝试检查与QueryTable相关的单元格的任何属性,我会收到错误。如果rng.querytable未链接到QueryTable,则rng抛出错误1004。所以我根据我在网上找到的一些讨论,对rng.ListObject is nothing进行了测试。事实证明,如果单元格是表,即使该表不是QueryTable,rng.ListObject也是如此。那里没有骰子。

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

这是我从Mr. Excel得到的函数的存根:

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

上面的函数在许多情况下都有效,但是如果我的QueryTables已经脱离了它们的目的地(这似乎在实践中发生),那么代码会抛出错误1004,因为QueryTable没有目标。以下是QueryTable与目标分离时手表显示的内容:

enter image description here

FWIW,我也尝试以相反的方式接近它并迭代工作表中的每个QueryTable。事实证明,如果有一个QueryTable已删除其目标,请求QueryTable为其QueryTable.Destination引发应用程序错误。所以我无法找到一种可靠的方法来做这种方法。

2 个答案:

答案 0 :(得分:4)

这比它需要的更加冗长,但由于“OnError”语句重定向所有错误,我想消除意外处理错误错误的可能性,例如rng Nothing 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

On Error GoTo 0

@JDLong VBA错误处理很奇怪。错误的默认设置为Exit Function,这意味着(取决于您的VBA IDE设置;工具 - >选项 - >常规)将弹出一个消息框,显示未处理的错误。如果要显式捕获和处理错误,可以创建一个标签(例如“ErrHandler”),然后通过使用Err结束函数来确保代码段无法正常访问。在标签之后的代码块中,您可以检查Resume对象属性并选择Resume Next重试导致错误的代码行,On Error GoTo 0运行行跟随出错的那个,或者只是处理错误并让函数正常退出。您还可以通过将模式设置回Resume然后resize=[299, 299]来恢复错误。

答案 1 :(得分:1)

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

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