Board logo

標題: [發問] DDE記錄資料求助 [打印本頁]

作者: n8975067    時間: 2013-4-12 16:53     標題: 有關excel自動紀錄即時資料

各位前輩們好,小弟有excel上的問題想請教大家,自己本身沒什麼excel的基本功,所以想請大家幫幫忙

我有使用群益超級贏家"匯出EXCEL"功能,可以將盤中跳動資料匯出到EXCEL中,我匯出的項目主要有期貨的委買口數 委賣口數 委買筆數 委賣筆數 委買均口 委賣均口,但這是即時資料,是會一直跳動的

請問我如何將他的資料紀錄下來,在例如0850,0855,0900,0905等,每隔五分鐘便自動將資料保存紀錄下來?

我該做哪些動作?
作者: GBKEE    時間: 2013-4-12 17:25

回復 1# n8975067
本程式區已有許多相關的討論,請多多詳看
作者: lbt    時間: 2013-4-12 17:48

Sub updateFollow()
  
       Sheet1.Range("a" & Rows.Count).End(xlUp).Offset(1) = Sheet1.[a2]
       Sheet1.Range("b" & Rows.Count).End(xlUp).Offset(1) = Sheet1.[b2]
       Sheet1.Range("c" & Rows.Count).End(xlUp).Offset(1) = Sheet1.[c2]

End Sub

剛好我也是這幾天 才爬文學會的~~
作者: lbt    時間: 2013-4-12 17:51

Sub TimePlus1()
         '每五分呼叫 一次
         Application.OnTime Now + 300 / 86400#, "UpdateFollow"
      
End Sub

希望對你有幫助
作者: n8975067    時間: 2013-4-12 21:03

各位前輩,這些程式語言的能力,我趨近於零,今天惡補了一些相關知識,這些程式語言是要放置在"巨集"內嗎?
作者: barrykuo    時間: 2013-4-13 12:26

回復 5# n8975067


    按Ibt大大的方法可以寫成一個巨集,不需要兩個吧!我也不懂是不是這樣寫可以。
  1. Sub updateFollow()
  2.   
  3.        Sheet1.Range("a" & Rows.Count).End(xlUp).Offset(1) = Sheet1.[a2]
  4.        Sheet1.Range("b" & Rows.Count).End(xlUp).Offset(1) = Sheet1.[b2]
  5.        Sheet1.Range("c" & Rows.Count).End(xlUp).Offset(1) = Sheet1.[c2]


  6.          '每五分呼叫 一次
  7.          Application.OnTime Now + 300 / 86400#, "UpdateFollow"

  8. End Sub
複製代碼

作者: GBKEE    時間: 2013-4-13 16:53

回復 5# n8975067
這裡先把玩一下

[attach]14663[/attach]
作者: n8975067    時間: 2013-4-14 11:25

本帖最後由 n8975067 於 2013-4-14 11:27 編輯

Sheet1.Range("a" & Rows.Count).End(xlUp).Offset(1) = Sheet1.[a2]
有顏色的部分是會包誇整個a的資料嗎,還是說要設程"a2"這樣,我只想要會跳動的數字部分
作者: n8975067    時間: 2013-4-15 11:33

中文也要打進去嗎?
今天試了上面的語法,結果沒辦法
作者: n8975067    時間: 2013-4-19 11:04

回復 6# barrykuo
大大你好,這個程式碼我套用進去後,在開盤時間開啟,沒有任何動作,告訴我此專案巨集已被暫止,這是什麼意思?
作者: n8975067    時間: 2013-4-19 12:27     標題: DDE記錄資料求助

[attach]14709[/attach]各位大大,當開盤後,excel沒有任何動作,進入巨集內按執行,跳出"此專案的巨集已被暫止"的框框,這是出現了什麼問題?
而且也沒辦法正常關閉excel
作者: GBKEE    時間: 2013-4-19 14:29

回復 1# n8975067
如圖修改後,須關閉excel重新開檔

[attach]14712[/attach]
作者: c_c_lai    時間: 2013-4-21 09:52

本帖最後由 c_c_lai 於 2013-4-21 10:03 編輯
各位大大,當開盤後,excel沒有任何動作,進入巨集內按執行,跳出"此專案的巨集已被暫止"的框框,這是出現了 ...
n8975067 發表於 2013-4-19 12:27
  1. Sub updateFollow()
  2.     Dim Rng As Range
  3.    
  4.     With Sheet2
  5.         Set Rng = .Range("A" & .Range("A" & .Rows.Count).End(xlUp).Row + 1)

  6.         Rng = Sheet1.[c2]
  7.         Rng.Offset(, 1) = Sheet1.[d2]
  8.         Rng.Offset(, 2) = Sheet1.[e2]
  9.         Rng.Offset(, 3) = Sheet1.[f2]
  10.         Rng.Offset(, 4) = Sheet1.[g2]
  11.         Rng.Offset(, 5) = Sheet1.[h2]
  12.         Rng.Offset(, 6) = Sheet1.[i2]
  13.         Rng.Offset(, 7) = Sheet1.[j2]
  14.         Rng.Offset(, 8) = Sheet1.[k2]
  15.         Rng.Offset(, 9) = Sheet1.[l2]
  16.     End With
  17.    
  18.     Application.OnTime Now + 300 / 86400#, "[color=Red]ThisWorkbook.[/color]updateFollow"             '  每五分鐘呼叫 一次
  19.     '  Application.OnTime Now + 60 / 86400#, "[color=Red]ThisWorkbook.[/color]updateFollow"    '  每一分鐘呼叫 一次
  20. End Sub
複製代碼
Application.OnTime Now + 300 / 86400#, "UpdateFollow" 程式碼在執行時,無法自動找到 updateFollow,
所以請在它的前面明確指定此涵式模組是放置在何方?
譬如: Application.OnTime Now + 300 / 86400#, "ThisWorkbook.updateFollow"  ,抑或是
              Application.OnTime Now + 300 / 86400#, "Module1.updateFollow"
作者: n8975067    時間: 2013-4-22 01:09

回復 13# c_c_lai
c_c_大,謝謝您,明天開盤來測試看看
作者: n8975067    時間: 2013-4-22 21:31

回復 13# c_c_lai
c_c_大你好,今天使用的結果:
"無法開啟巨集Application.OnTime Now + 300 / 86400#, "ThisWorkbook.updateFollow" "
這個出現
作者: n8975067    時間: 2013-4-22 21:40

回復 13# c_c_lai
"ThisWorkbook.updateFollow"
這一句
作者: c_c_lai    時間: 2013-4-23 07:19

回復  c_c_lai
"ThisWorkbook.updateFollow"
這一句
n8975067 發表於 2013-4-22 21:40

整段程式碼應放置於 ThisWorkbook 內,如果放置於模組內,
你便要去修正 ThisWorkbook.updateFollow 為 Modulex.updateFollow。
作者: n8975067    時間: 2013-4-23 08:36

回復 17# c_c_lai
c_c_大

我是放置於ThisWorkbook 沒錯
作者: c_c_lai    時間: 2013-4-23 13:46

回復  c_c_lai
c_c_大

我是放置於ThisWorkbook 沒錯
n8975067 發表於 2013-4-23 08:36

你 E-Mail 給我,我把檔案傳給你。
作者: n8975067    時間: 2013-4-23 19:43

回復 19# c_c_lai
[email protected]
作者: c_c_lai    時間: 2013-4-24 04:31

本帖最後由 c_c_lai 於 2013-4-24 04:36 編輯

回復 20# n8975067
  1. Sub updateFollow()
  2.     Dim Rng As Range
  3.    
  4.     With Sheet2
  5.         '  Set Rng = .Range("A" & .Range("A" & .Rows.Count).End(xlUp).Row + 1)
  6.         '
  7.         '  Rng = Sheet1.[c2]
  8.         '  Rng.Offset(, 1) = Sheet1.[d2]
  9.         '  Rng.Offset(, 2) = Sheet1.[e2]
  10.         '  Rng.Offset(, 3) = Sheet1.[f2]
  11.         '  Rng.Offset(, 4) = Sheet1.[g2]
  12.         '  Rng.Offset(, 5) = Sheet1.[h2]
  13.         '  Rng.Offset(, 6) = Sheet1.[i2]
  14.         '  Rng.Offset(, 7) = Sheet1.[j2]
  15.         '  Rng.Offset(, 8) = Sheet1.[k2]
  16.         '  Rng.Offset(, 9) = Sheet1.[l2]
  17.         '  上面之敘述表達與下列的敘述結果是一樣的,差異只在於使用語法之巧妙不同。
  18.         Set Rng = .Range("A" & .Range("A" & .Rows.Count).End(xlUp).Row + 1).Resize(1, 10)
  19.         
  20.         Rng(1) = Sheet1.[c2]
  21.         Rng(2) = Sheet1.[d2]
  22.         Rng(3) = Sheet1.[e2]
  23.         Rng(4) = Sheet1.[f2]
  24.         Rng(5) = Sheet1.[g2]
  25.         Rng(6) = Sheet1.[h2]
  26.         Rng(7) = Sheet1.[i2]
  27.         Rng(8) = Sheet1.[j2]
  28.         Rng(9) = Sheet1.[k2]
  29.         Rng(10) = Sheet1.[l2]
  30.     End With
  31.    
  32.     '  Application.OnTime Now + 60 / 86400#, "ThisWorkbook.updateFollow"    '  每一分鐘呼叫 一次
  33.     Application.OnTime Now + 300 / 86400#, "ThisWorkbook.updateFollow"      '  每五分鐘呼叫 一次
  34. End Sub
複製代碼
已傳給你了!
在 Sheet1 加上了啟動按鈕,方便你執行查核。
作者: n8975067    時間: 2013-4-25 14:47

回復 21# c_c_lai
報告c_c_大,今天試用,已經可以記錄了,但是否是要按按鈕才會啟動?
另外我想要在早上0845時,每隔整數5分鐘開始記錄(例如0850 0900),我有看到您的另一篇文章,上面有提到方法,是照那上面的語法嗎?



PS:大大,有個地方我不太了解,為何會有五分鐘跟一分鐘的呼叫呢?
作者: c_c_lai    時間: 2013-4-25 15:17

回復  c_c_lai
報告c_c_大,今天試用,已經可以記錄了,但是否是要按按鈕才會啟動?
另外我想要在早上084 ...
n8975067 發表於 2013-4-25 14:47

因為我要測試你所說的問題癥結,為節省測試時間,
所以我以每隔一分鐘一次,來觀察執行結果之故。
按鈕之用意,是在於當你要開始執行時方便你啟用,
而不須再到程式區啟動程式。
如此說明可以嗎?
作者: c_c_lai    時間: 2013-4-25 15:40

回復 22# n8975067
如果你想要系統自動控管開盤、與關盤,
那麼你便要參考其他範例了!
作者: n8975067    時間: 2013-4-25 20:29

回復 24# c_c_lai
c_c_大,我有找到一篇範例
http://forum.twbts.com/viewthrea ... a=pageD9&page=3
那我是否能將開盤收盤那行移植過來就可以使用?
作者: c_c_lai    時間: 2013-4-26 06:14

回復 25# n8975067
  1. Option Explicit
  2. Dim timerEnabled As Boolean    ' 判定開啟本工作表單的時段是否為開盤前啟動。

  3. Private Sub Workbook_Open()
  4.     timerEnabled = False
  5.      
  6.     Call timerStart            ' 程式一啟始,便去自動執行 timerStart
  7. End Sub

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

  14. Sub timerStart()   
  15.     If timerEnabled Then
  16.         ' 第二次(含)以後均以設定之 "間隔時段" 來處理執行序的作業。
  17.         Application.OnTime (Now + TimeValue("00:05:00")), "ThisWorkbook.updateFollow"    '  每隔五分鐘執行一次
  18.     Else
  19.         timerEnabled = True
  20.         
  21.         ' 將第一次啟動時間更改為設定 "開盤時間"前,如果開啟 Excel 時,已經過了設定 "開盤時間",則一進入系統即直接去執行紀錄作業。
  22.         If (TimeValue(Now) <= TimeValue("08:45:00")) Then
  23.             Application.OnTime (TimeValue("08:45:00")), "ThisWorkbook.updateFollow"
  24.         Else
  25.             ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,
  26.             ' 這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
  27.             Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.updateFollow"
  28.         End If
  29.     End If
  30. End Sub

  31. Sub updateFollow()
  32.     Dim Rng As Range
  33.    
  34.     On Error Resume Next
  35.     If (TimeValue(Now) < TimeValue("08:45:00") Or TimeValue(Now) > TimeValue("13:45:00")) Then Exit Sub

  36.     With Sheet2
  37.         '  Set Rng = .Range("A" & .Range("A" & .Rows.Count).End(xlUp).Row + 1)
  38.         '
  39.         '  Rng = Sheet1.[c2]
  40.         '  Rng.Offset(, 1) = Sheet1.[d2]
  41.         '  Rng.Offset(, 2) = Sheet1.[e2]
  42.         '  Rng.Offset(, 3) = Sheet1.[f2]
  43.         '  Rng.Offset(, 4) = Sheet1.[g2]
  44.         '  Rng.Offset(, 5) = Sheet1.[h2]
  45.         '  Rng.Offset(, 6) = Sheet1.[i2]
  46.         '  Rng.Offset(, 7) = Sheet1.[j2]
  47.         '  Rng.Offset(, 8) = Sheet1.[k2]
  48.         '  Rng.Offset(, 9) = Sheet1.[l2]
  49.         '  上面之敘述表達與下列的敘述結果是一樣的,差異只在於使用語法之巧妙不同。
  50.         Set Rng = .Range("A" & .Range("A" & .Rows.Count).End(xlUp).Row + 1).Resize(1, 10)
  51.         
  52.         Rng(1) = Sheet1.[c2]
  53.         Rng(2) = Sheet1.[d2]
  54.         Rng(3) = Sheet1.[e2]
  55.         Rng(4) = Sheet1.[f2]
  56.         Rng(5) = Sheet1.[g2]
  57.         Rng(6) = Sheet1.[h2]
  58.         Rng(7) = Sheet1.[i2]
  59.         Rng(8) = Sheet1.[j2]
  60.         Rng(9) = Sheet1.[k2]
  61.         Rng(10) = Sheet1.[l2]
  62.     End With
  63.    
  64.     If timerEnabled Then Call timerStart
  65. End Sub
複製代碼
我把你的 updateFollow() 與你的需求,全部整合在一起,
請將它全部覆蓋於 ThisWorkbook 程式碼編輯區塊內。
每日 08:45:00 以前開啟它 , 08:45:00時間一到,系統便會自動啟動執行,
13:45:00一超過時間,程式便會自動停止不再執行。
按鈕你可以保留,如果系統於突發狀況下停止運作,
你可以點選按鈕恢復系統運作。
作者: n8975067    時間: 2013-4-29 13:45

回復 26# c_c_lai

感謝c_c_大,但我今天遇到一個問題,就是電腦突然當機無回應,強制關機後, 這個excel開啟都會"沒有回應",盤中的資料也沒有儲存下來,這是怎麼回是呢?
作者: c_c_lai    時間: 2013-4-29 14:58

回復 27# n8975067
收收 E-Mail,下載後明天
你再用我的檔案試試看!
作者: GBKEE    時間: 2013-4-29 16:01

回復 26# c_c_lai
  1. Option Explicit
  2. Sub updateFollow()
  3.     Dim Rng As Range
  4.     With Sheet2
  5.         'Set Rng = .Range("A" & .Range("A" & .Rows.Count).End(xlUp).Row + 1).Resize(1, 10)
  6.         Set Rng = .Range("A" & .Rows.Count).End(xlUp).Offset(1).Resize(1, 10) '這樣可簡略些
  7.         Rng = Sheet1.[c2:L12].Value        'C:L 共10欄,且為連續 可用如此語法
  8.         'Rng(1) = Sheet1.[c2]
  9.         'Rng(2) = Sheet1.[d2]
  10.         'Rng(3) = Sheet1.[e2]
  11.         'Rng(4) = Sheet1.[f2]
  12.         'Rng(5) = Sheet1.[g2]
  13.         'Rng(6) = Sheet1.[h2]
  14.         'Rng(7) = Sheet1.[i2]
  15.         'Rng(8) = Sheet1.[j2]
  16.         'Rng(9) = Sheet1.[k2]
  17.         'Rng(10) = Sheet1.[l2]
  18.     End With
  19.     '凌晨 零點零分       #12:00:00 AM#
  20.     '凌晨 零點零分30秒   #12:00:30 AM#
  21.     '凌晨 零點1分        #12:01:00 AM#
  22.     '凌晨 零點5分        #12:05:00 AM#
  23.     Application.OnTime Now + #12:00:30 AM#, "ThisWorkbook.updateFollow"     '  每30秒鐘呼叫 一次
  24. '  Application.OnTime Now + #12:01:00 AM#, "ThisWorkbook.updateFollow"     '  每一分鐘呼叫 一次
  25. '  Application.OnTime Now +  #12:05:00 AM#, "ThisWorkbook.updateFollow"    '  每五分鐘呼叫 一次
  26. '  Application.OnTime Now + 60 / 86400#, "ThisWorkbook.updateFollow"       '  每一分鐘呼叫 一次
  27. '  Application.OnTime Now + 300 / 86400#, "ThisWorkbook.updateFollow"      '  每五分鐘呼叫 一次
  28. End Sub
複製代碼

作者: c_c_lai    時間: 2013-4-29 16:23

回復  c_c_lai
GBKEE 發表於 2013-4-29 16:01

好久沒聯絡了,近來順意吧!
Application.OnTime Now + 300 / 86400#, "ThisWorkbook.updateFollow"
是順應他原本的程式而未加以異動,我個人習慣用您指教的語法、
或是抓取某設定欄位作為動態處理,謝謝您!
作者: n8975067    時間: 2013-4-29 23:04

回復 28# c_c_lai
ok! 收到,明天來試試看~
作者: saleen    時間: 2013-6-4 11:10

回復 26# c_c_lai

嗨 c_c_lai 大大您好
小妹最近也想學DDE拉入資料
需求剛好跟樓主一樣
可是我丟進去後卻顯示"變數未定義"
是在
Sub updateFollow()
    Dim Rng As Range
   
    On Error Resume Next
    If (TimeValue(Now) < TimeValue("08:45:00") Or TimeValue(Now) > TimeValue("13:45:00")) Then Exit Sub

    With Sheet2
這段
請問該怎麼修正 >"<
作者: c_c_lai    時間: 2013-6-4 12:24

回復  c_c_lai

嗨 c_c_lai 大大您好
小妹最近也想學DDE拉入資料
需求剛好跟樓主一樣
可是我丟進去後 ...
saleen 發表於 2013-6-4 11:10

妳是完整複製 26# 上的程式碼嗎?
妳把執行畫面複製到小畫家 (Print Screen -> 小畫家 -> 貼上 ) 上傳。
謝謝!
作者: saleen    時間: 2013-6-5 10:46

c_c_lai 大大感謝
我已經解決了 , 把程式中的 "Sheet2" 全都改成 Excel 左下方的 "工作表1" 就可以了 ^^
不過不知道為什麼我如果把左下角的"工作表1"改成 "Sheet2" 卻沒用 ~ 怪

而且又多了好多問題噢
看來要開另一篇文章了 >~<
作者: handsometrowa    時間: 2013-6-5 11:31

你設定的那個DDE 是抓取動態資料的
所以你每次在開啟這個巨集的時候要注意的部分就是

1.你的DDE 報價資料來源要先啟動(一般都是券商的報價軟體)
2.你的巨集在2003 以上的版本上面都要手動開啟  他才會做程式的動作
不管是外部資料還是你要做動態DDE 的開啟 ,他在EXCEL輸入公式的那行旁邊
他會告知你 是否要啟動




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