SQL + VBA在单元格范围中填充数据

时间:2015-05-13 20:13:40

标签: sql excel vba excel-vba

我目前有一个代码连接到VBA中的SQL数据库。然而,正如我想的那样,数据正确填充,我想知道是否有一种方法可以压缩下面的代码。我有4个不同的列和26行,我觉得如果我走这条路,我会浪费很多时间。我希望范围从C20:C45开始,结果从细胞H20:H45显示。有人可以帮忙吗?谢谢!

    ' Open the connection and execute data for WFTEs.
   Set rs = conn.Execute("SELECT sum(Hours)/80 FROM payroll2015_rif WHERE DepartmentCode = '" & Range("$E$6") & "' AND payperiod = '" & Range("C20") & "' and paycode IN ('REG1', 'REG2');")
        ' Transfer result.
        Sheets(2).Range("$H20").CopyFromRecordset rs
    ' Close the recordset
        rs.Close


' Open the connection and execute data for WFTEs.
   Set rs = conn.Execute("SELECT sum(Hours)/80 FROM payroll2015_rif WHERE DepartmentCode = '" & Range("$E$6") & "' AND payperiod = '" & Range("C21") & "' and paycode IN ('REG1', 'REG2');")
        ' Transfer result.
        Sheets(2).Range("$H21").CopyFromRecordset rs
    ' Close the recordset
        rs.Close

2 个答案:

答案 0 :(得分:0)

让我们打破这个并尝试一些伪代码。首先,我们将解决问题的SQL部分:

SELECT payperiod
     , calc = SUM(Hours) / 80
FROM payroll2015_rif
WHERE DepartmentCode = <DepartmentCode>
  AND payperiod IN (<PayPeriods>)
  AND paycode IN ('REG1', 'REG2')
GROUP BY payperiod

现在我们需要更换包含在&lt; &GT;使用Excel中的值。你已经找到了 DepartmentCode ,所以我们将在付费期内工作。 SQL希望将'Period 1', 'Period 2', 'Period 3'之类的内容传递给IN子句。

一种非常天真的方法是:

Set strValues = Range("C21") & ', ' & Range("C22") & ', ' & Range("C23")

这很乏味但很容易被重构成循环或其他东西。把它与你已经拥有的例子放在一起就应该给你你想要的东西。

答案 1 :(得分:0)

这样的事可以解决这个问题吗?基本上我会从Excel范围中获取相关值并将它们放入VBA中的数组中,通过循环遍历变量创建一个结果数组,然后将数组抛回到excel Range中。

注意我没有包含ADODB连接和记录集声明,我假设你在代码中的某处。

Sub myLoop()

    Dim dept As String
    Dim payperiod As Variant
    Dim result As Variant
    Dim i As Integer

    dept = Range("E6")
    payperiod = Range("C20:C45")
    ReDim result(1 To UBound(payperiod), 1 To 1)

    'don't forget to set your ADODB stuff somewhere

    For i = 1 To UBound(payperiod)
        Set rs = conn.Execute("SELECT sum(Hours)/80 FROM payroll2015_rif WHERE DepartmentCode = '" & dept & "' AND payperiod = '" & payperiod(i,1) & "' and paycode IN ('REG1', 'REG2');")
        result(i, 1) = rs(0)
        rs.Close
    Next i

    Range("H20:H45") = result

End Sub