要从 SQL Server 导入数据,我有一个参数化查询,需要用户输入日期。
当用户正确输入开始日期和结束日期时,一切都会按正确的顺序完成,并且案件会结束。
但是,当日期不正确时,不会触发错误处理程序,宏将继续执行,直到 AfterRefresh 事件发生。
我向每个模块添加了错误处理程序,但它们仍然没有响应。有谁知道如何向刷新之前/之后事件添加错误处理程序?
电量查询代码逻辑如下,但不是这样写的:
let
Source = Sql.Database("MyDataBase", [Query="Select Transaction_date, Customer_ID
from TransactionList
where Transaction_date between @StartDate and @EndDate]
in
Source
下面的VBA代码
'========== [ Modules ] ==========
Option Explicit
Dim colQueries As New Collection
Sub Button_RefreshData()
On Error GoTo Error_Handler
Call InitializeQueries
ThisWorkbook.RefreshAll
Exit Sub
Error_Handler:
MsgBox Err.Number & " " & Err.Source & vbNewLine & Err.Description, vbInformation
Exit Sub
End Sub
Sub InitializeQueries()
On Error GoTo Error_Handler
Dim clsQ As clsQuery
Dim WS As Worksheet
Dim QT As QueryTable
Dim LO As ListObject
For Each WS In ThisWorkbook.Worksheets
For Each QT In WS.QueryTables
Set clsQ = New clsQuery
Set clsQ.MyQuery = QT
colQueries.Add clsQ
Next QT
For Each LO In WS.ListObjects
Set QT = LO.QueryTable
Set clsQ = New clsQuery
Set clsQ.MyQuery = QT
colQueries.Add clsQ
Next LO
Next WS
Exit Sub
Error_Handler:
MsgBox Err.Number & " " & Err.Source & vbNewLine & Err.Description, vbInformation
Exit Sub
End Sub
'========== [ Class Modules named clsQuery ] ==========
Option Explicit
Public WithEvents MyQuery As QueryTable
Private Sub MyQuery_AfterRefresh (ByVal Success As Boolean)
On Error GoTo Error_Handler
If Success Then MsgBox ("The entire process is complete.")
Exit Sub
Error_Handler:
MsgBox Err.Number & " " & Err.Source & vbNewLine & Err.Description, vbInformation
Exit Sub
End Sub
Private Sub MyQuery_BeforeRefresh (Cancel As Boolean)
On Error GoTo Error_Handler
MsgBox ("The process start now.")
Exit Sub
Error_Handler:
MsgBox Err.Number & " " & Err.Source & vbNewLine & Err.Description, vbInformation
Exit Sub
End Sub
但是,当日期不正确时 - 你说。那么您应该考虑在查询中使用用户输入之前测试它。一种方法是使用 CDate 来验证它是否是有效日期。
尝试将此作为您的用户输入和验证:
Sub InputDates()
' With test of valid date
TryAgainFrom:
On Error GoTo ErrHandlerFromDate
FromDate = CDate(InputBox("Input a from date:", "From:", Format(Now() - 365, "DD.MM.YYYY")))
TryAgainTo:
On Error GoTo ErrHandlerToDate
ToDate = CDate(InputBox("Input a to date:", "To:", Format(Now() - 365, "DD.MM.YYYY")))
' Bouth dates are valid dates
MsgBox ("Range from " & Format(FromDate, "dd.mm.yyyy") & " to " & Format(ToDate, "dd.mm.yyyy"))
Exit Sub
ErrHandlerFromDate:
MsgBox "Your input From date is not a valid date! - Please try again."
Resume TryAgainFrom
ErrHandlerToDate:
MsgBox "Your input To date is not a valid date! - Please try again."
Resume TryAgainTo
End Sub