如何检查非查询连接刷新是否成功

时间:2018-11-06 16:21:57

标签: excel vba connection refresh

我一直对这个问题感到沮丧……我只是想在用户单击“全部刷新”并且刷新完成时触发一些代码。该解决方案似乎很简单,连接 QueryTable_AfterRefresh 事件,但是,此方法或其他任何常规方法都无法解决我的问题。

关于我在做什么的一些注释/细节:

  • 我正在使用Excel 2016,工作簿的所有用户也会使用。
  • 我正在从一个Web API获取数据,该Web API以JSON格式返回结果(仅)。经过大量VBA至JSON的搜寻后,我发现实际上“ Get&Trasnform”又名Power Query可以轻松做到这一点。
  • 在没有任何VBA的情况下,一切都可以正常运行,但是我需要在刷新后触发一些代码。

这是我尝试过的原因,为什么它似乎不起作用:

  • 连接到QueryTable不会起作用,因为Tables / ListObjects显然没有一个。我通过以编程方式列出工作簿中的所有QueryTable来确认这一点。在调查工作簿连接时,我发现所有连接均列为类型:xlConnectionTypeOLEDB 。然后,我检查了Tables / ListObjects,它们都是 SourceType:xlSrcQuery 。到目前为止,我还没有找到关于为什么这些连接没有QueryTable的解释。
  • 经过大量的搜索,我尝试加入 ListObject_Change 事件,但最终发现这显然只能通过VTSO进行访问。
  • 我已经搜索了所有可以想到的“ excel vba连接刷新事件” 的变体;所有结果要么将我指向未提供解决方案的Microsoft站点(上述非工作点之外),要么指向QueryTable事件,这些事件当然不可用。我尝试找出到目前为止没有任何结果,是否有办法使ListObject使用QueryTable。

在这一点上,我有一个不太理想的解决方法。我正在对表/ ListObject范围使用“ Worksheet_Change ”事件以及“ 相交”检查,以查看表是否已更新。 这行得通,但我还有用户可以修改的其他列(在右侧添加),这当然还会触发事件,导致我的AfterRefresh代码在不应该运行时运行。我希望有人可能知道解决方案,但以防万一,以下是遇到类似问题的任何人的代码变通方法。 注意:该代码位于“ Sheet”对象代码中,但可以轻松修改以在“ ThisWorkbook”对象代码中使用。

Work Around:

Private Sub Worksheet_Change(ByVal Target As Range)

Debug.Print "[Worksheet_Change] - Name: " & ActiveSheet.Name

Dim shtSheet As Worksheet
Dim lsoTable As ListObject

Set shtSheet = ThisWorkbook.Sheets("Sheet1")
Set lsoTable = shtSheet.ListObjects("Data")

If Intersect(Target, lsoTable.Range) Is Nothing Then
    Debug.Print "[Worksheet_Change] - Range [" & Target.Address & "] does NOT intersect with lso [" & lsoTable.Range.Address & "]"
Else
    Debug.Print "[Worksheet_Change] - Range [" & Target.Address & "] DOES intersect with lso [" & lsoTable.Range.Address & "]"
End If

End Sub

0 个答案:

没有答案
相关问题