Board logo

標題: 程式碼如何寫以紀錄EXCEL的DDE數據每秒鐘紀錄)(已解決) [打印本頁]

作者: jiuhtsair    時間: 2011-4-19 16:17     標題: 程式碼如何寫以紀錄EXCEL的DDE數據每秒鐘紀錄)(已解決)

本帖最後由 jiuhtsair 於 2011-8-23 17:55 編輯

各位大大好:
      對於VBA我是新手!
      在網路上看到許多高手寫出有關DDE紀錄的問題,但大多是紀錄一分鐘或是一分鐘以上的時間。曾嘗試將其更改成每秒紀錄一次,卻總是不得其門而入...
      我想要把DDE傳給EXCEL的資料(時間、開盤價、最高價、最低價、收盤價、單量、成交量),依照時間每一秒紀錄一次(放在另一個工作表中),不知道能否請大大們協助?謝謝!

      另外,能否介紹幾本VBA入門書,在坊間有許多書,但看的眼花撩亂,也懇請大大們已過來人經驗介紹幾本好書...謝謝!
作者: GBKEE    時間: 2011-4-19 16:36

回復 1# jiuhtsair
  1. Sub Ex()
  2.         Dim A As Date
  3.         A = Time
  4.         Do
  5.           DoEvents
  6.           If Time > A Then
  7.             A = Time
  8.             Sheet2.Range("A" & Rows.Count).End(xlUp).Offset(1) = Time & Sheet1.[A1]
  9.             '請自行修改->EXCEL的資料(時間、開盤價、最高價、最低價、收盤價、單量、成交量)
  10.           End If
  11.         Loop
  12. End Sub
複製代碼

作者: jiuhtsair    時間: 2011-4-19 21:00

感謝大大開示。曾研究了大大回答EXCEL的DDE數據每分鐘紀錄的文,可惜沒完全弄懂...這程式已經煩惱一星期了,感謝大大解除困惑。謝謝!
作者: atuan207    時間: 2011-4-19 21:12

我也還是新手,雖然程式的部分還沒辦法給予幫助,不過書籍的話可以推薦給你
Excel VBA 2007 程式設計全圖解 電腦人文化 出版
作者:七條達弘 渡邊健 ...等人注
這本說的還蠻詳細的,我目前自學三週,雖然沒辦法像版主他們程式打得很精簡,
要什麼有什麼,但是已經可以自己做出一些基本功能,
上一步、下一步、在介面中輸入資料並送回..等功能
且書中的範例可以下載
網址:http://www.pcuser.com.tw/download/2AC710/samples.zip
推薦給你~~
作者: jiuhtsair    時間: 2011-4-20 12:14

謝謝分享!我也找到個不錯的教學網站
http://210.240.125.13/phcno1/index.htm 請參考!
作者: jiuhtsair    時間: 2011-4-24 12:43

我將程式碼貼上後,它告訴我"執行階段錯誤424,此處需要物件"
但沒有看到他所指的錯誤區域在哪裡,請問這要如何改呢?
另外,DDE傳回的時間是值=(X小時*3600+Y分鐘*60)/86400,不知道這樣把設A=Time會不會有問題,我是否要先將(X小時*3600+Y分鐘*60)/86400轉化成 "X小時:Y分鐘:Z秒鐘"的型態呢?
謝謝!
作者: jiuhtsair    時間: 2011-4-24 13:21

抱歉!怕陳述的不清楚,我把我的DDE檔案也傳上來。懇請網上大大解惑!謝謝!
想要做的功能就是把sheet1的內容每秒鐘(a2儲存格內容變化時動作)存入Sheet2中!希望能夠紀錄一整天以便分析參考。謝謝!
[attach]5789[/attach][attach]5789[/attach][attach]5789[/attach]
作者: GBKEE    時間: 2011-4-24 15:38

回復 7# jiuhtsair


試試看
  1. Sub Ex()
  2.         Dim A As Single
  3.         A = 0.361111   '時間 上午 08:40:00
  4.         j = 2
  5.         Do
  6.           DoEvents
  7.           'If Sheets(2).Cells(j, 2) > A Then
  8.           '  A = Sheets(2).Cells(j, 2)
  9.           If Sheets(1).Cells(2, 1) > A Then   'SHEETS(1)的A2大於 時間
  10.             A = Sheets(1).Cells(2, 1)         '更改時間為SHEETS(1)的A2
  11.         '  -- 附檔 Sheets(1).Cells(3, 5)......   為空白  --
  12.         'Sheets(2).Cells(j, 2) = Sheets(1).Cells(3, 5)
  13.         'Sheets(2).Cells(j, 3) = Sheets(1).Cells(3, 6)
  14.         'Sheets(2).Cells(j, 4) = Sheets(1).Cells(3, 7)
  15.         'Sheets(2).Cells(j, 5) = Sheets(1).Cells(3, 8)
  16.         'Sheets(2).Cells(j, 6) = Sheets(1).Cells(3, 9)
  17.         'Sheets(2).Cells(j, 7) = Sheets(1).Cells(3, 10)
  18.         Sheets(2).Cells(j, 2).Resize(1, 6) = Sheets(1).Cells(2, 5).Resize(1, 6).Value
  19.         O = 0
  20.         H = -99999
  21.         l = 99999
  22.         cumVol = V
  23.         j = j + 1
  24.           End If
  25.         Loop
  26. End Sub
複製代碼

作者: jiuhtsair    時間: 2011-4-24 16:40

感謝大大解惑!
程式碼19行到22行,當初是看其他程式仿造的,如果我沒有用到它的運算式(他原先是利用第一個價錢為開盤價O,第二個價錢如果高於第一個,那最高價就是第二個,如果第二個價錢低於第一個,那最低價就是第二個...)我是否可以把它去除?
明天開盤後試試!感謝!
作者: jiuhtsair    時間: 2011-4-24 16:45

ㄏㄏ..感謝!OK了!
我用手動方式改變時間...執行程式後一如所願!
謝謝大大解惑。感謝!
作者: ABK    時間: 2018-4-25 00:33

回復 8# GBKEE



版大您好!    我用Excel2016版, 跑程式碼卡住了,是哪裡有問題?
資料源 我改成元大RTD了!
作者: GBKEE    時間: 2018-4-25 13:47

回復 11# ABK

Sheets("1")的A 2 公式=RTD("money.excel",,"*SYSTEM","ServerTime")
是否傳回#N/A (錯誤值),導致程式錯誤試試看
  1. Sub Ex()
  2. Set MyBook = ThisWorkbook
  3. Set Sht1 = MyBook.Sheets("1")
  4.         Dim A As Single
  5.         A = 0.361111   '時間 上午 08:40:00
  6.         j = 2
  7.         Do
  8.             DoEvents
  9.             '********測試用  ******************************************
  10.             If IsError(Sht1.Cells(2, 1)) Then Stop  '傳回錯誤值 程式暫停
  11.             '**********************************************************
  12.             If Not IsError(Sht1.Cells(2, 1)) Then
  13.                 If Sht1.Cells(2, 1) > A Then   'SHEETS(1)的A2大於 時間
  14.                     A = Sht1.Cells(2, 1)         '更改時間為SHEETS(1)的A2
  15.                     Sht1.Cells(j, 2).Resize(1, 6) = Sht1.Cells(2, 5).Resize(1, 6).Value
  16.                     O = 0
  17.                     H = -99999
  18.                     l = 99999
  19.                     cumVol = V
  20.                     j = j + 1
  21.                 End If
  22.             End If
  23.         Loop
  24. End Sub
複製代碼

作者: ABK    時間: 2018-4-25 15:35

回復 12# GBKEE


謝謝版大!   出現型態不符
作者: GBKEE    時間: 2018-4-25 18:46

回復 13# ABK

=RTD("money.excel",,"*SYSTEM","ServerTime")
這 式我沒有你的檔案無法測試



[attach]28603[/attach]
作者: ABK    時間: 2018-4-25 22:30

回復 14# GBKEE


謝謝版大!  按下偵錯後如附圖 !
附件我改成元大Yeswin 的 DDE。

15:00~ 隔日05:00  A2:J2  資料會變動 (午夜盤交易時段)

8:45 ~ 13:45   N2:W2    資料會變動 (日盤交易時段)

資料連結需先開啟 元大Yeswin 看盤軟體
作者: GBKEE    時間: 2018-4-26 07:01

回復 15# ABK
我只有台新證券公司的智多星可用.

可再試試看
  1. Sub Ex()
  2.     Dim Sht1 As Worksheet, MyBook As Workbook, A As Date
  3.     Set MyBook = ThisWorkbook
  4.     Set Sht1 = MyBook.Sheets("1")
  5.         A = #8:40:00 AM#
  6.         'Date 函數 傳回一 Variant (Date),內容為系統日期 (電腦所記錄的現在日期)。
  7.         j = 2
  8.         Do
  9.             DoEvents
  10.             '********測試用  ******************************************
  11.            ' If IsError(Sht1.Cells(2, 1)) Then Stop  '傳回錯誤值 程式暫停
  12.             '**********************************************************
  13.             If Not IsError(Sht1.Cells(2, 1)) Then
  14.               '''  MsgBox TypeName(Sht1.Cells(2, 1).Value)
  15.                 If Sht1.Cells(2, 1) > A Then   'SHEETS(1)的A2大於 時間
  16.                     A = Sht1.Cells(2, 1)         '更改時間為SHEETS(1)的A2
  17.                     Sht1.Cells(j, 2).Resize(1, 6) = Sht1.Cells(2, 5).Resize(1, 6).Value
  18.                     O = 0
  19.                     H = -99999
  20.                     l = 99999
  21.                     cumVol = V
  22.                     j = j + 1
  23.                 End If
  24.             End If
  25.         Loop
  26. End Sub
複製代碼

作者: ABK    時間: 2018-4-26 22:01

回復 16# GBKEE


    感謝版主 !      可以記錄了!
   目前是1秒鐘記錄一次,  如何修改 讓它1分鐘 記錄一次 ?
   如果我要指定它在 15:00:00  (下午3點時自動停止)  要如何寫?
作者: GBKEE    時間: 2018-4-27 09:17

本帖最後由 GBKEE 於 2018-4-27 09:41 編輯

回復 17# ABK
試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Sht1 As Worksheet, MyBook As Workbook, Rng As Range
  4.     Dim xTime As Date
  5.     Set MyBook = ThisWorkbook
  6.     Set Sht1 = MyBook.Sheets("1")
  7.     xTime = Time       '不要管Sht1.Cells(2, 1)的時間
  8.     Do
  9.             DoEvents
  10.            If Time >= xTime Then  
  11.                 xTime = TimeSerial(Hour(Time), Minute(Time) + 1, 0)   '下一分鐘
  12.                 Set Rng = Nothing
  13.                 If Time >= #8:40:00 AM# And Time <= #1:30:00 PM# Then    '日盤
  14.                     Set Rng = [N2:W2]
  15.                 ElseIf Time >= #2:59:50 PM# Or Time <= #5:00:10 AM# Then
  16.                 '時間要跨過隔日
  17.                 'http://forum.twbts.com/thread-20727-1-1.html
  18.                 '夜盤 StartTime 14:59:50  /  EndTime 隔日 05:00:10
  19.                     Set Rng = [A2:J2]
  20.                
  21.                 End If
  22.                 If Not Rng Is Nothing Then
  23.                     With Cells(Rows.Count, "A").End(xlUp).Offset(1)
  24.                         .Resize(, Rng.Count) = Rng.Value
  25.                     End With
  26.                 End If
  27.             End If
  28.         Loop
  29. End Sub
複製代碼

作者: ABK    時間: 2018-4-27 15:56

回復 18# GBKEE


謝謝版大 !     可以跑了!

紀錄時間都在58秒 是我的電腦時間比卷商主機時間(A2儲存格) 快2秒的原因!
作者: yen956    時間: 2018-5-4 15:04

本帖最後由 yen956 於 2018-5-4 15:05 編輯

ABK大大你好:
請問大大, 你是如何修改 標題 的?(如:加上 已解決)
是積分問題嗎? 我總是試不出來, 謝謝!!
作者: ABK    時間: 2018-5-26 14:25     標題: RE: 程式碼如何寫以紀錄EXCEL的DDE數據每秒鐘紀錄)(已解決)

回復 20# yen956

Yen 大您好, 我是接續 jiuhtsair大的PO文發問的, 我發問時他的標題上就已經有(已解決)
你可以試試 在回復時,主題的右邊有 [修改], 按一下後再加入你要加入的字試試看 !




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