validationSQL查询完成MS Excel VBA

在我的工作簿中,我有3个SQL数据库查询使用a触发

'Initiate datbase querying ThisWorkbook.RefreshAll 

在我的DB_Connection工作表中,我添加了以下代码来validation查询是成功运行还是失败(稍后将在日志表中使用)。 如果没有更多的查询在运行,macros将继续下一个阶段。

 Private Sub QueryTable_AfterRefresh(Success As Boolean) Dim Succeeded As Integer Dim Failed As Integer Succeeded = 0 Failed = 0 If Success Then Succeeded = Succeeded + 1 Worksheets("DB_Connection").Range("L2").Value = Succeeded Else Failed = Failed + 1 Worksheets("DB_Connection").Range("M2").Value = Failed End If End Sub 

但是, QueryTable_AfterRefresh从不被调用。 我停下来确定它是否被呼叫。

有什么build议么?

你不能只输出一个事件处理程序签名,并期望它的工作。 如果您导航到该QueryTable_AfterRefresh过程,您应该注意到代码窗格下拉菜单的内容 – 名为QueryTable_AfterRefresh的处理程序过程的唯一方法是存在和工作,如果您有一个Private WithEvents QueryTable As QueryTable声明:

在这里输入图像说明

注意,左边的下拉菜单是QueryTableWithEvents字段的名称),右边的下拉菜单是AfterRefresh (事件的名字)。

如果你有什么是这个(General)在左边和QueryTable_AfterRefresh在右边:

在这里输入图像说明

那么你所看到的基本上是没有任何东西可以调用的死代码,至less不是通过QueryTable事件。

声明一个模块级的WithEventsvariables,从左边的下拉列表中select它,然后在右边的下拉列表中selectAfterRefresh事件; VBE将为该对象上的 事件生成正确的方法签名。

然后,您需要在执行ThisWorkbook.RefreshAll之前Set该对象引用。 您可以在Workbook_Open处理程序中执行此操作,但是,如果字段为Private您将无法从ThisWorkbook模块访问该字段。 一个解决scheme是使其成为Public ,更好的解决scheme是公开一个方法来正确地初始化它:

 Option Explicit Private WithEvents QueryTable As QueryTable Public Sub Initialize() Set QueryTable = Me.QueryTables(1) End Sub Private Sub QueryTable_AfterRefresh(ByVal Success As Boolean) '... End Sub 

然后给该工作表一个编译时代码名称 (在属性 toolwindow中设置它的(Name)属性),然后从ThisWorkbook Workbook_Open调用该方法 – 例如,如果工作表具有代码名称的 QuerySheet ,则可以像这样调用它(请注意,不需要从ThisWorkbook.Worksheets集合中取消引用该对象):

 Option Explicit Private Sub Workbook_Open() QuerySheet.Initialize End Sub