Excel 单元格值作为动态查询值

Excel cell values as dynamic query values

在我的 Excel sheet 中,我有一个按钮运行 SQL 查询和 returns 时钟交互结果。我有两个名为 StartDateEndDate 的单元格,它们被格式化为输入单元格。我希望该语句查看 ActionDate 列,并且仅查看这些单元格范围内的 return 结果。

 Private Sub CommandButton1_Click()

 Dim cnn As New ADODB.Connection
 Dim rst As New ADODB.Recordset
 Dim ConnectionString As String
 Dim StrQuery As String
 Dim StartDate As Date  
 Dim EndDate As Date    

 StartDate = Sheets("Sheet1").Range("B5").Value  
 EndDate = Sheets("Sheet1").Range("B6").Value    
 cnn.Open ConnectionString
 cnn.CommandTimeout = 900

 StrQuery = "SELECT Employees.EmployeeID, Employees.First_Name, 
 Employees.Last_Name, EmployeeTimeCardActions.ActionTime, 
 EmployeeTimeCardActions.ActionDate, EmployeeTimeCardActions.ShiftStart, 
 EmployeeTimeCardActions.ActionType FROM Employees LEFT OUTER JOIN 
 EmployeeTimeCardActions ON 
 Employees.EmployeeID=EmployeeTimeCardActions.EmployeeID WHERE ActionDate 
 >StartDate  AND ActionDate <  EndDate ;"

 rst.Open StrQuery, cnn****

 Sheets(1).Range("D3").CopyFromRecordset rst
 End Sub

我在 rst.Open StrQuery, cnn 上有一个语法错误,我用 **** 标记了。

更改您的查询字符串,以便您实际引用您的变量:

StrQuery = "SELECT Employees.EmployeeID, Employees.First_Name, 
 Employees.Last_Name, EmployeeTimeCardActions.ActionTime, 
 EmployeeTimeCardActions.ActionDate, EmployeeTimeCardActions.ShiftStart, 
 EmployeeTimeCardActions.ActionType FROM Employees LEFT OUTER JOIN 
 EmployeeTimeCardActions ON 
 Employees.EmployeeID=EmployeeTimeCardActions.EmployeeID WHERE ActionDate 
 > '" & StartDate & "' AND ActionDate < '" & EndDate & "';"

您可能还需要将日期包装在 '# 中,具体取决于您查询的数据库。

顺便说一下,通常最好参数化您的查询字符串以避免 sql 注入的可能性;特别是因为您的输入机制是 Excel 范围。 Example

通过 ADO Command 对象简单地使用参数化,这避免了连接或标点数据的需要。具体来说,将 qmarks ? 放在准备好的 data-less SQL 语句中,然后将其与包含 StartDateEndDate 的参数绑定 值。请注意,使用这种方法,记录集是从 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