- 註冊時間
- 2006-3-13
- 最後登錄
- 2025-1-10
- 在線時間
- 673 小時
- 閱讀權限
- 200
- 積分
- 417
- 帖子
- 1107
- 精華
- 0
- UID
- 2
  
|
資料來源 http://blog.udn.com/WayCheng/2902612
使用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
複製代碼 |
|