- 帖子
- 523
- 主題
- 56
- 精華
- 0
- 積分
- 601
- 點名
- 61
- 作業系統
- win 10
- 軟體版本
- []
- 閱讀權限
- 50
- 性別
- 男
- 註冊時間
- 2013-3-19
- 最後登錄
- 2025-3-14
           
|
回復 5# GBKEE
如下的 ADO recordset 方式可以達到目的:
1.先處理時間欄位使其可成為分組的新欄位
2.以時間組處理分組的數值欄位平均值
但還是期望用一個 SQL 字串完成目的- '目的: 每間隔 10 分鐘、每一個 CTcode 做 欄位 Volts,Hz 的平均值,
- ' 並依已間隔之時間序及CTcode 序呈現結果
- Option Explicit
- Option Base 1
- Option Private Module
- 'Definitions for ADODB SQL
- Public cnn As ADODB.Connection
- Public rs As ADODB.Recordset
- Public SQL As String, FileName$
- Public ws1 As Worksheet
- Public ws2 As Worksheet
- Public TimeInterval#
- Public Time0#
- Public StartTime$, EndTime$, TimeStr$
- Sub ExcelSQL()
- Dim i&, j%
- Set ws1 = Sheets("CT")
- Set ws2 = Sheets("Temp")
- ws2.Cells.Clear
-
- FileName = ThisWorkbook.FullName
-
- ws1.Select
- StartTime = Format(Cells(2, 1), "yyyy/mm/dd hh:mm")
- EndTime = Format(Cells([A1].CurrentRegion.Rows.Count, 1), "yyyy/mm/dd hh:mm")
- TimeInterval = 10 '間隔 10 分鐘
-
- Time0 = Timer
-
- '=== 賦予時間間格的新欄位 =============
- Set cnn = New ADODB.Connection
- cnn.Provider = "Microsoft.ACE.OLEDB.12.0"
- cnn.ConnectionString = "Data Source=" & FileName & ";Extended Properties=""Excel 12.0 xml;HDR=Yes;"""
- cnn.Open
-
- SQL = "Select format( iif(minute([日期時間]) mod " & TimeInterval & " = 0,[日期時間], " & _
- "DateAdd(""n"", " & TimeInterval & "-minute([日期時間]) mod " & TimeInterval & _
- " ,[日期時間])),""yyyy/mm/dd HH:mm"") " & _
- " From [" & ws1.Name & "$]" & _
- " where [日期時間] >= #" & StartTime & "# " & _
- " order by [日期時間]"
-
- Set rs = cnn.Execute(SQL)
-
- With ws1
- j = .[A1].End(xlToRight).Column
- .Cells(1, j + 1) = "DateTime1"
- .Cells(2, j + 1).CopyFromRecordset rs
- End With
- rs.Close
- cnn.Close
- Set rs = Nothing
- Set cnn = Nothing
- '=== 處理數值欄位的平均 ===========================
- Set cnn = New ADODB.Connection
- cnn.Provider = "Microsoft.ACE.OLEDB.12.0"
- cnn.ConnectionString = "Data Source=" & FileName & ";Extended Properties=""Excel 12.0 xml;HDR=Yes;"""
- cnn.Open
- SQL = "SELECT format([DateTime1],""yyyy/mm/dd HH:mm"") as [DateTime], CTCode, " & _
- "AVG([Volts]) as [avgVolt], AVG([Hz]) as [avgHz], AVG([kW]) as [avgkW] " & _
- " From [" & ws1.Name & "$] " & _
- " Where [日期時間] >= #" & StartTime & "# and [DateTime1] <= #" & EndTime & "# " & _
- " Group by [DateTime1],CTCode " & _
- " Order by [DateTime1] ,CTCode"
- Debug.Print SQL
-
- Set rs = cnn.Execute(SQL)
-
- With ws2
- For i = 0 To rs.Fields.Count - 1
- .Cells(1, i + 1) = rs.Fields(i).Name
- Next
- .Cells(2, 1).CopyFromRecordset rs
- End With
-
- ws1.Select
- Cells(1, ws1.UsedRange.Columns.Count).EntireColumn.Clear
-
- rs.Close
- cnn.Close
- Set rs = Nothing
- Set cnn = Nothing
- ' Debug.Print Timer - Time0
- End Sub
複製代碼 |
|