Board logo

標題: [發問] 如何將EXCEL的即時資料定時複製到下方 (DDE) [打印本頁]

作者: pipe    時間: 2012-5-30 14:16     標題: 如何將EXCEL的即時資料定時複製到下方 (DDE)

本帖最後由 pipe 於 2012-5-31 16:06 編輯

小弟完全不懂VBA,想請教各位前輩一個問題:
使用券商DDE連結EXCEL,檔案中會有即時資料,但只有即時
我想要將目前的及時資料每五分鐘複製數值貼在下方
如下
[attach]11196[/attach]      

即時資料會一直變動,我想要每五分鐘將即時欄位複製值貼在下方欄位
從08:30 一直到13:45, 請問EXCEL要怎麼做呢??

請各位高手幫忙,謝謝.
作者: c_c_lai    時間: 2012-5-30 14:24

回復 1# pipe
請參考:
關於盤中DDE紀錄
作者: pipe    時間: 2012-5-30 15:53

本帖最後由 pipe 於 2012-5-30 16:01 編輯

回復 2# c_c_lai

CC大抱歉,我努力爬文也看完您的範例檔案,但真的無法對應修改成我自己的需求, 一竅不通阿
請您幫忙修改一下我的附件excel好嗎? 謝謝!!

資料從08:29:50開始,每五分鐘往下存一筆當時的及時資料"值"(不是公式,之後內容值不會再變動),直到收盤 13:45:10
作者: c_c_lai    時間: 2012-5-30 21:33

本帖最後由 c_c_lai 於 2012-5-31 20:33 編輯
回復  c_c_lai

CC大抱歉,我努力爬文也看完您的範例檔案,但真的無法對應修改成我自己的需求, 一竅不通阿 ...
pipe 發表於 2012-5-30 15:53

實在是真服了你,想想還是幫你寫好了。
  1. Option Explicit
  2. Dim timerEnabled As Boolean
  3. Dim Pos As Integer      ' 將每隔 "多少時間" 處理時段,移到此處來處理。

  4. Private Sub Workbook_Open()
  5.     Pos = Sheets("sheet1").Range("C" & Rows.Count).End(xlUp).Row
  6.     timerEnabled = False

  7.     Call timerStart      ' 程式一啟始,便去自動執行 timerStart
  8. End Sub

  9. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  10.     On Error Resume Next
  11.     Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.Timer", , False
  12.    
  13.     Me.Save
  14. End Sub

  15. Public Sub Timer()
  16.     On Error Resume Next
  17.     If (TimeValue(Now) > Sheets("sheet1").Range("AV2").Value) Then Exit Sub
  18.    
  19.     If (TimeValue(Now) >= Sheets("sheet1").Range("AV1").Value) Then         ' 開盤、收盤時段設定
  20.         ' 盤中處理,將資料匯入寫入工作表單內儲存。

  21.         With Sheets("sheet1")
  22.             Pos = Pos + 1                  ' 將變動行號加一行
  23.             
  24.             .Cells(Pos, 1).Value = Date     ' 日期
  25.             .Cells(Pos, 2).Value = Time     ' 時間
  26.             .Cells(Pos, 3).Resize(1, 12) = .Range("C8:N8").Value    ' 大均、大差、期均、期差、台指、高點、低點、中關、價差、振福、摩台、加權
  27.             
  28.             .Cells(2, 49).Value = Pos       ' AW2
  29.         End With
  30.     End If
  31.         
  32.     Call timerStart
  33. End Sub

  34. Sub timerStart()
  35.     If timerEnabled Then
  36.         Application.OnTime (Now + Sheets("sheet1").Range("AW1").Value), "ThisWorkbook.Timer"
  37.     Else
  38.         timerEnabled = True
  39.         
  40.         ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,
  41.         ' 這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
  42.         Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.Timer"
  43.     End If
  44. End Sub
複製代碼
剪下後直接貼入到 ThisWorkbook 程式區就 OK 了。
作者: pipe    時間: 2012-5-30 23:28

回復 4# c_c_lai
CC 大真英雄也!
信手拈來輕鬆寫出一段程式,對小弟幫助太大了,明天開盤時來測試一下
感謝CC大的幫忙!!

不嫌棄的話,小弟願意分享應用在台指期的高勝率戰法(如果CC大有在玩期貨的話)
小弟目前無法下載附件,也無法寄出站內短訊息,歡迎用站內信件聯繫告知聯絡方式!!謝謝CC大!!
作者: pipe    時間: 2012-5-30 23:48

回復 4# c_c_lai

CC大,雖然程式可以說看不懂,但是我在程式碼中沒有看到 08:30 或是 13:45 這樣的時間設定
請問這個程式是設定一開啟就自己執行,每五分鐘記錄一次(不管開盤收盤)嗎?
作者: c_c_lai    時間: 2012-5-31 07:27

回復 6# pipe
你的 "AV1"、以及 "AV2" 欄位不就已經載明了嗎?
本段程式它是可以由外部來控制的 (方便測試用),假設測試時間是在晚上八點到九點之間,是以每隔 20 秒寫入一筆資料,你便可以
這麼做,  將以下欄位內容異動成 (千萬不要加上 "" 符號,即直接打入 20:00:00、21:00:00、以及 00:00:20 等時間數據, 以此類堆):
AV1 = "20:00:00",AV2 = "21:00:00", AW1 = "00:00:20", 然後去再行測試答案即出!
寫程式要切記一點,千萬不要寫死程式,否則會成為一個掰腳仙!
My E-Mail:  [email protected]
你可以記檔案到此,謝謝!
作者: pipe    時間: 2012-5-31 11:23

回復 7# c_c_lai

小弟眼拙,CC大提醒後就了解怎麼做了,目前盤中測試一切OK
感謝CC大的幫忙!!

等到收盤後較有空的時間,再跟CC大聊一下期貨
作者: c_c_lai    時間: 2016-10-24 20:17

回復 8# pipe
盤中測試
[attach]25624[/attach]
作者: c_c_lai    時間: 2016-10-25 10:36

回復 8# pipe
[attach]25633[/attach]
  1. Option Explicit
  2. Dim timerEnabled As Boolean

  3. Private Sub Workbook_Open()
  4.     timerEnabled = False

  5.     Call timerStart      ' 程式一啟始,便去自動執行 timerStart
  6. End Sub

  7. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  8.     On Error Resume Next
  9.     Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.Timer", , False
  10.    
  11.     Me.Save
  12. End Sub

  13. Public Sub Timer()
  14.     Dim ws As Worksheet
  15.     Dim Pos As Integer      ' 將每隔 "多少時間" 處理時段,移到此處來處理。
  16.    
  17.     timerEnabled = True
  18.         
  19.     On Error Resume Next
  20.     Set ws = Sheets("工作表1")
  21.     If (TimeValue(Now) > ws.Range("I2").Value) Then Exit Sub
  22.    
  23.     If (TimeValue(Now) >= ws.Range("I1").Value) Then         ' 開盤、收盤時段設定
  24.         ' 盤中處理,將資料匯入寫入工作表單內儲存。

  25.         With Sheets("工作表2")
  26.             Pos = .Range("A" & Rows.Count).End(xlUp).Row + 1   ' 將變動行號加一行
  27.             
  28.             .Cells(Pos, 1).Value = Date        ' 日期
  29.             .Cells(Pos, 2).Value = ws.[B3]     ' 時間 (=DDEEXCEL|FUTURE!TXF16.時間)
  30.             .Cells(Pos, 3).Resize(1, 8) = ws.Range("B4:B11").Value    ' 市價    漲跌    漲跌幅  開盤價  最高價  最低價  累計交易量  乖離率
  31.         End With
  32.     End If
  33.         
  34.     Call timerStart
  35. End Sub

  36. Sub timerStart()
  37.     If timerEnabled = False Then
  38.         Application.OnTime (Now + Sheets("工作表1").Range("I1").Value), "ThisWorkbook.Timer"
  39.     Else
  40.         ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,
  41.         ' 這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
  42.         Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.Timer"
  43.     End If
  44. End Sub
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)