Просто используйте параметризацию с помощью объекта ADO Command , что исключает необходимость объединения или пунктуации данных.В частности, поместите qmarks ?
в подготовленный оператор SQL без данных, который затем связывается с параметрами, содержащими ваши значения StartDate и EndDate .Обратите внимание, что при таком подходе набор записей создается из вызова Command.Execute
(не Recordset.Open
).
Private Sub CommandButton1_Click()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command ' NEW VARIABLE
Dim ConnectionString As String, StrQuery As String
Dim StartDate As Date, EndDate As Date
StartDate = Sheets("Sheet1").Range("B5").Value
EndDate = Sheets("Sheet1").Range("B6").Value
cnn.Open ConnectionString
cnn.CommandTimeout = 900
StrQuery = "SELECT e.EmployeeID, e.First_Name, e.Last_Name, " _
& " t.ActionTime, t.ActionDate, t.ShiftStart, t.ActionType " _
& " FROM Employees e " _
& " LEFT OUTER JOIN EmployeeTimeCardActions t " _
& " ON e.EmployeeID = t.EmployeeID " _
& " WHERE ActionDate > ? AND ActionDate < ?;"
With cmd
.ActiveConnection = cnn
.CommandText = StrQuery
.CommandType = adCmdText
.Parameters.Append .CreateParameter("str_param", adDate, adParamInput, , StartDate)
.Parameters.Append .CreateParameter("end_param", adDate, adParamInput, , EndDate)
Set rst = .Execute ' CREATES RECORDSET
End With
Sheets(1).Range("D3").CopyFromRecordset rst
rst.Close: cnn.Close
Set rst = Nothing: Set cmd = Nothing: Set cnn = Nothing
End Sub