使用DDE將股票看盤軟體中的某個股成交價連結到 Sheet1 的[A2],當 DDE 有資料變動的時候會觸發工作表的 Calculate 事件,所以我們可以把程式碼寫在 Sheet1 的 Worksheet_Calculate() 裡,以每五分鐘為一時段,記錄成交的價格:
D 欄:記錄這個時段的開始價,就是第一筆成交價。
E 欄:記錄這個時段的最高價。
F 欄:記錄這個時段的最低價。
G 欄:記錄這個時段的結束價,就是最後一筆成交價。
這個程式裡面的關鍵就是 Excel 的 "時間值 (TimeValue)",Now() 函數會從系統時鐘取得執行當時的 "日期和時間" 時間值。時間值是一個實數,它的整數部份代表日期,小數部份代表時間。
Excel 用小於1的正小數來表示一天從午夜開始算起的秒數,一天有24x60x60=86400秒,所以每天的第一秒, "12:00:01 AM" 用時間值表示就是 1/86400 (86400分之一, 大約 0.00115741), 第二秒就是 2/86400......依此類推。
所以若要把每 5 分鐘的資料歸在一列, 就產生了 288 這個 "魔術數字",288 = 86400/ (5x60) 就是這麼來的。
Private Sub Worksheet_Calculate()
Dim NowDateTime, nowTime, startTime, stopTime
Dim tr As String
NowDateTime = Now '現在的時間值, 去掉整數部份,
nowTime = (NowDateTime - Int(NowDateTime)) '得到現在的時間值
startTime = Range("A6") '開盤時間, 例如: "09:00:00 AM"
stopTime = Range("A8") '收盤時間, 例如: "01:30:00 PM"
If nowTime <= startTime Then '尚未開盤
Exit Sub
ElseIf nowTime > stopTime Then '已經收盤
Exit Sub
ElseIf [A2] <> "-" And [A2] <> "###" Then '清盤的狀態, 不取其資料
tr = Int((nowTime - startTime) * 288) + 2 '每差 300 秒就換一列
If Range("D" & tr) = "" Then
Range("D" & tr) = Range("A2") '開始價
End If
If Range("E" & tr) = "" Or Range("A2") > Range("E" & tr) Then
Range("E" & tr) = Range("A2") '最高價
End If
If Range("F" & tr) = "" Or Range("A2") < Range("F" & tr) Then
Range("F" & tr) = Range("A2") '最低價
End If
Range("G" & tr) = Range("A2") '結束價
End If
End Sub