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
声明:
注意,左边的下拉菜单是QueryTable
( WithEvents
字段的名称),右边的下拉菜单是AfterRefresh
(事件的名字)。
如果你有什么是这个(General)
在左边和QueryTable_AfterRefresh
在右边:
那么你所看到的基本上是没有任何东西可以调用的死代码,至less不是通过QueryTable
事件。
声明一个模块级的WithEvents
variables,从左边的下拉列表中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