我目前有一个代码连接到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
答案 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