我正在使用效果很好的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
上面的函数在许多情况下都有效,但是如果我的QueryTable已从其目标分离(这似乎在实践中发生),则该代码将引发错误1004,因为QueryTable没有目标。这是当QueryTable与目标解耦时手表显示的内容:
FWIW,我还尝试过相反的方法,并遍历工作表中的每个QueryTable。事实证明,是否有一个QueryTable的目标已删除,要求QueryTable的
QueryTable.Destination
引发应用错误。因此,我也找不到一种可靠的方法来执行该方法。 最佳答案
这比需要的要复杂,但是由于“ 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
@JDLong VBA错误处理很奇怪。错误的默认设置为
On Error GoTo 0
,这意味着(取决于您的VBA IDE设置;工具->选项->常规)将弹出一个未处理错误的消息框。如果要显式捕获并处理错误,请创建标签(例如“ ErrHandler”),然后通过以Exit Function
结尾的函数来确保正常无法访问代码段。在标签后面的代码块中,您可以检查Err
对象属性,然后选择Resume
重试导致错误的代码行,Resume Next
在出现错误的代码行之后运行,或者简单地处理错误并让函数正常退出。您还可以通过将模式设置回On Error GoTo 0
,然后再Resume
重新设置该行来重新产生错误。关于excel - 确定单元格是否通过Excel中的VBA链接到QueryTable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40475709/