使用 adodb 会很好。标题是 MYDay,数量。
Sub exeSQLgetdata()
Dim Rs As Object
Dim strConn As String
Dim i As Integer
Dim Fn As String
Dim Ws As Worksheet, toWs As Worksheet
Dim strSQL As String, sWsname As String
Dim vDB As Variant
Dim rngWeek As Range
Dim st, et
st = Timer
Set Ws = Sheets(1) '<~~ data Sheet
Set toWs = Sheets(2) '<~~ Report Sheet
sWsname = "[" & Ws.Name & "$]"
Fn = ThisWorkbook.Path & "\" & "Database9.accdb"
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=Excel 12.0;"
Set Rs = CreateObject("ADODB.Recordset")
strSQL = "SELECT DATEPART('W', MYDay, 1) as WeekDay, AVG(Quantity) AS AVERAGE FROM " & sWsname & " GROUP BY DATEPART('W', MYDay,1) "
Rs.Open strSQL, strConn
If Not Rs.EOF Then
With toWs
For i = 0 To Rs.Fields.Count - 1
.Cells(1, i + 1) = Rs.Fields(i).Name
Next i
.UsedRange.Offset(1).Clear
.Range("a2").CopyFromRecordset Rs
Set rngWeek = .Range("a2", .Range("a" & Rows.Count).End(xlUp))
vDB = rngWeek
For i = 1 To UBound(vDB, 1)
vDB(i, 1) = Format(vDB(i, 1), "ddd", vbSunday)
Next i
rngWeek = vDB
End With
End If
Rs.Close
Set Rs = Nothing
et = Timer
Debug.Print "Get Data time : " & et - st & " seconds"
End Sub
上面的代码是按工作日平均的。每周平均值如下。
Sub exeSQLgetdata2()
Dim Rs As Object
Dim strConn As String
Dim i As Integer
Dim Fn As String
Dim Ws As Worksheet, toWs As Worksheet
Dim strSQL As String, sWsname As String
Dim vDB As Variant
Dim rngWeek As Range
Dim st, et
st = Timer
Set Ws = Sheets(1) '<~~ data Sheet
Set toWs = Sheets(2) '<~~ Report Sheet
sWsname = "[" & Ws.Name & "$]"
Fn = ThisWorkbook.Path & "\" & "Database9.accdb"
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=Excel 12.0;"
Set Rs = CreateObject("ADODB.Recordset")
'2 : Monday to Sunday, 1: Sunday to Saturday
strSQL = "SELECT DATEPART('WW', MYDay, 2) as WeekNum, AVG(Quantity) AS AVERAGE FROM " & sWsname & " GROUP BY DATEPART('WW', MYDay,2) "
Rs.Open strSQL, strConn
If Not Rs.EOF Then
With toWs
For i = 0 To Rs.Fields.Count - 1
.Cells(1, i + 1) = Rs.Fields(i).Name
Next i
.UsedRange.Offset(1).Clear
.Range("a2").CopyFromRecordset Rs
' Set rngWeek = .Range("a2", .Range("a" & Rows.Count).End(xlUp))
' vDB = rngWeek
' For i = 1 To UBound(vDB, 1)
' vDB(i, 1) = Format(vDB(i, 1), "ddd", vbSunday)
' Next i
' rngWeek = vDB
End With
End If
Rs.Close
Set Rs = Nothing
et = Timer
Debug.Print "Get Data time : " & et - st & " seconds"
End Sub
数据表 (1) 图片
Resut Sheet sheet(2) 图片