我使用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与目标分离时手表显示的内容:
FWIW,我也尝试以相反的方式接近它并迭代工作表中的每个QueryTable。事实证明,如果有一个QueryTable已删除其目标,请求QueryTable为其QueryTable.Destination
引发应用程序错误。所以我无法找到一种可靠的方法来做这种方法。
答案 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