Board logo

標題: [發問] 關於盤中DDE紀錄 [打印本頁]

作者: irene83    時間: 2012-5-17 00:48     標題: 關於盤中DDE紀錄

本帖最後由 irene83 於 2012-5-17 10:46 編輯

雖然看到站內很多相關帖子,但我仍無法自己設定完成
想請教站內的高手們,
目前我使用excel接收看盤軟體dde的資訊,並做成即時動態表格在("DATA"A2:V2),
想透過VBA讓他每間隔5分鐘紀錄下來到("Sheet1"A2:V66)貼上值,時間從8:30~13:45,

謝謝大大們的幫忙~有勞了!!!

附上檔案,已參考大大建議的程式碼做修改,但仍無法執行
有請教C大,謝謝!
作者: c_c_lai    時間: 2012-5-17 06:41

本帖最後由 c_c_lai 於 2012-5-17 06:42 編輯

回復 1# irene83
請參閱
EXCEL抓取資料問題
更改一下間格設定時間即可。 例如:  00:00:10 (每隔十秒)、00:01:00 (一分鐘)、 00:05:00 (五分鐘)。
作者: irene83    時間: 2012-5-18 00:19

附上檔案,已參考大大建議的程式碼做修改,但仍無法執行
有請教C大,謝謝!
作者: c_c_lai    時間: 2012-5-18 08:01

本帖最後由 c_c_lai 於 2012-5-18 08:23 編輯
附上檔案,已參考大大建議的程式碼做修改,但仍無法執行
有請教C大,謝謝!
irene83 發表於 2012-5-18 00:19

我看到你的檔案了,請檢察你原本設定欄位座標:
"Y5"  --->  Range("X5").Value = "08:30:00"
"Y6"  --->  Range("X6").Value = "13:50:00"
"Z5"  --->  Range("Y5").Value = "00:05:00"
"Z6"  --->  Range("Y6").Value = 2  
[attach]11008[/attach]
你的等級可能無法下載,所以我將它貼出來,你再試試看,
如有問題再來函,但回覆時,請按下端的"回覆"鈕,
否則我是不知道你已回覆了。
  1. ' DDE 資料紀錄問題
  2. Option Explicit
  3. Dim actEnabled As Boolean
  4. Dim cIndex As Single

  5. Private Sub Workbook_Open()
  6.     ' 以下四列資料之設定,可配合實作、或測試之目的,直接在 "sheet1" 指定之設定欄,得隨時予以異動。
  7.    '  **************************************************************************************************
  8.     If (Sheets("DATA").Range("X5").Value = "") Then Sheets("DATA").Range("X5").Value = "08:30:00"   ' 假設C6欄位為空白,則寫入開盤起始時間
  9.     If (Sheets("DATA").Range("X6").Value = "") Then Sheets("DATA").Range("X6").Value = "13:50:00"   ' D6欄位亦同。(此兩欄紀錄起始終止時間)
  10.     If (Sheets("DATA").Range("Y5").Value = "") Then Sheets("DATA").Range("Y5").Value = "00:05:00"   ' 紀錄資料匯入相隔時間,如每隔一分鐘寫入一次。
  11.     If (Sheets("DATA").Range("Y6").Value = "") Then Sheets("DATA").Range("Y6").Value = 2            ' 紀錄已匯入資料列數。
  12.    '  *************************************************************************************************

  13.     If (TimeValue(Now) > Sheets("DATA").Range("X6").Value) Then       ' 如果目前時間業已超過 D6 的營業時段,則呼叫.......
  14.         Call stopProcedure
  15.     Else                                                                 ' 反之在 D6 設定時間以前,則呼叫.......
  16.         Call startProcedure
  17.     End If
  18. End Sub

  19. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  20.     On Error Resume Next
  21.     Call actStop
  22. End Sub

  23. Sub startProcedure()       ' 保留作為控制項之應用程序,如按鈕之巨集應用等。
  24.     Call actStart
  25. End Sub

  26. Sub stopProcedure()        ' 保留作為控制項之應用程序,如按鈕之巨集應用等。
  27.    Call actStop
  28. End Sub

  29. Sub newTitle()
  30.     Sheets(Sheet1).[A1].Resize(, 22) = Sheets(DATA).[A1:V1].Value  ' 套上你欲匯入資料的表頭名稱
  31. End Sub

  32. Sub Starter()
  33.     If (actEnabled = True And TimeValue(Now) >= Sheets("DATA").Range("X5").Value And TimeValue(Now) <= Sheets("DATA").Range("X6").Value) Then
  34.         cIndex = Sheets("DATA").Range("Y6").Value

  35.         If (cIndex = 0) Then Call newTitle  ' newTitle 程序 (由使用者自行定義) 是將第一列的資料抬頭名稱寫入到sheet2;如日期、時間的對應欄位資料等。

  36.         Sheets("DATA").Range("X6").Value = cIndex + 1       ' 紀錄列號加一。

  37.         ' 複製從券商DDE匯入之相對應位置資料,如 A1、B1、C1、D1 對應的可能是內盤、外盤、成交、漲跌等等,以此類推。
  38.         Sheets(Sheet1).[A65536].End(xlUp).Offset(1).Resize(, 22) = Sheets(DATA).[A2:V22].Value

  39.         cIndex = Sheets("sheet1").Range("X6").Value      ' 切記 Counter (計數器) 要加一,否則永遠為零 (當然已也可以不予紀錄資料列述,依個人習性)。
  40.     End If
  41. End Sub

  42. Sub actStart()

  43. actEnabled = True

  44. Application.OnTime (Now + Sheets("DATA").Range("Y5").Value), "ThisWorkBook.onStarter"         ' 寫入資料的排程 (目前是每隔五分鐘寫入一次)

  45. End Sub


  46. Sub onStarter()
  47.     If Not IsError(Sheets(DATA).[A2]) Then Call Starter
  48.     If actEnabled Then Call actStart
  49. End Sub


  50. Sub actStop()
  51.     actEnabled = False

  52.     On Error Resume Next
  53.     Application.OnTime Now, "ThisWorkBook.onStarter", , False
  54. End Sub
複製代碼

作者: f3202    時間: 2012-5-18 21:33

回復 4# c_c_lai
因為vba放在模組故
Application.OnTime (Now + Sheets("DATA").Range("Y5").Value), "onStarter"  
且           ' Sheets(Sheet1).[A65536].End(xlUp).Offset(1).Resize(, 22) = Sheets("DATA").[A2:V22].Value  換成
Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(1, 22) = Sheets("DATA").[A2:v2].Value
2007 可執行

' DDE 資料紀錄問題
Option Explicit
Dim actEnabled As Boolean
Dim cIndex As Single

Private Sub Workbook_Open()
    ' 以下四列資料之設定,可配合實作、或測試之目的,直接在 "sheet1" 指定之設定欄,得隨時予以異動。
    If (Sheets("DATA").Range("X5").Value = "") Then Sheets("DATA").Range("X5").Value = "08:30:00"   ' 假設C6欄位為空白,則寫入開盤起始時間
    If (Sheets("DATA").Range("X6").Value = "") Then Sheets("DATA").Range("X6").Value = "13:50:00"   ' D6欄位亦同。(此兩欄紀錄起始終止時間)
    If (Sheets("DATA").Range("Y5").Value = "") Then Sheets("DATA").Range("Y5").Value = "00:05:00"   ' 紀錄資料匯入相隔時間,如每隔一分鐘寫入一次。
    If (Sheets("DATA").Range("Y6").Value = "") Then Sheets("DATA").Range("Y6").Value = 2            ' 紀錄已匯入資料列數。

    If (TimeValue(Now) > Sheets("DATA").Range("X6").Value) Then       ' 如果目前時間業已超過 D6 的營業時段,則呼叫.......
        Call stopProcedure
    Else                                                                 ' 反之在 D6 設定時間以前,則呼叫.......
        Call startProcedure
    End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    Call actStop
End Sub

Sub startProcedure()       ' 保留作為控制項之應用程序,如按鈕之巨集應用等。
    Call actStart
End Sub

Sub stopProcedure()        ' 保留作為控制項之應用程序,如按鈕之巨集應用等。
   Call actStop
End Sub

Sub newTitle()
    Sheets(Sheet1).[A1].Resize(, 22) = Sheets(DATA).[A1:V1].Value  ' 套上你欲匯入資料的表頭名稱
End Sub

Sub Starter()
    If (actEnabled = True And TimeValue(Now) >= Sheets("DATA").Range("X5").Value And TimeValue(Now) <= Sheets("DATA").Range("X6").Value) Then
        cIndex = Sheets("DATA").Range("Y6").Value

        If (cIndex = 0) Then Call newTitle  ' newTitle 程序 (由使用者自行定義) 是將第一列的資料抬頭名稱寫入到sheet2;如日期、時間的對應欄位資料等。

        Sheets("DATA").Range("X6").Value = cIndex + 1       ' 紀錄列號加一。

        ' 複製從券商DDE匯入之相對應位置資料,如 A1、B1、C1、D1 對應的可能是內盤、外盤、成交、漲跌等等,以此類推。
       ' Sheets(Sheet1).[A65536].End(xlUp).Offset(1).Resize(, 22) = Sheets("DATA").[A2:V22].Value
Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(1, 22) = Sheets("DATA").[A2:v2].Value
        cIndex = Sheets("sheet1").Range("X6").Value      ' 切記 Counter (計數器) 要加一,否則永遠為零 (當然已也可以不予紀錄資料列述,依個人習性)。
    End If
End Sub

Sub actStart()

actEnabled = True

Application.OnTime (Now + Sheets("DATA").Range("Y5").Value), "onStarter"         ' 寫入資料的排程 (目前是每隔五分鐘寫入一次)

End Sub


Sub onStarter()
    If Not IsError(Sheets("DATA").[A2]) Then Call Starter
    If actEnabled Then Call actStart
End Sub


Sub actStop()
    actEnabled = False

    On Error Resume Next
    Application.OnTime Now, "ThisWorkBook.onStarter", , False
End Sub
作者: irene83    時間: 2012-5-21 14:51

回復 4# c_c_lai
  
謝謝C大的熱心指導,目前可以正常執行了
真的非常謝謝你~~

同時也謝謝f大的指教,有站內這麼多高手的協助,
我真是太幸運了^_____^
作者: devidlin    時間: 2012-5-23 14:39

請教此盤中DDE紀錄是適用元大的下單軟體嗎?
作者: c_c_lai    時間: 2012-5-23 16:35

回復 7# devidlin
此處探討的是如何將盤中DDE資料匯入到你欲儲存的 Excel 表單內,
供做盤中參考或觀察紀錄的異動。只要是券商有支援 DDE 功能,
你都可以自行連結到你的Excel。(券商軟體 <---> DDE <---> Excel)
作者: devidlin    時間: 2012-5-29 15:33

關於盤中DDE紀錄 20120517---1.rar     檔案抓下來測試不能使用,可以另提供檔案嗎?謝謝。
作者: f3202    時間: 2012-5-30 07:56

回復 9# devidlin
煩請說明那裡出問題
1:沒來源dde會出現" #REF!  "
2:sheets("data")之 x5, x6 時間須調整到您需要的區間
參考先
作者: devidlin    時間: 2012-6-10 10:33

1.假設將DATA欄位 X5.X6.Y5.Y6刪除,剛試過執行巨集時會當掉
2.Y5欄位如果紀錄資料匯入相隔時間,如每隔五分鐘寫入一次,剛看此欄位為12:05:00 AM,這樣對嗎?
3.另打開看盤軟體,打開此EXCEL檔案後,他會自動執行巨集,還是要手動去按才會執行巨集?  煩請大哥指教,謝謝。
作者: GBKEE    時間: 2012-6-12 14:13

回復 11# devidlin
可參考一下
  1. 'DDE 資料紀錄問題 在'一般模組(Module1)的程式碼
  2. Option Explicit
  3. Dim 開盤 As Range, 收盤 As Range, 間隔 As Range, 次數 As Range, Time_Dee As Date
  4. '------在一般模組(Module1)不起作用的----------------
  5. 'Private Sub Workbook_Open()                          '是 ThisWorkbook的程序 此活頁簿關閉時 自動執行的程式
  6. 'Private Sub Workbook_BeforeClose(Cancel As Boolean)  '是 ThisWorkbook的程序 此活頁簿關閉時 自動執行的程式
  7. '---------------------------------------------------
  8. Private Sub Auto_Open()    '---* 一般模組(Module1)的程序 此活頁簿開啟時 自動執行的程式
  9.     StartProcedure
  10. End Sub
  11. Private Sub Auto_Close()   '---* 一般模組(Module1)的程序 此活頁簿關閉時 自動執行的程式
  12.     StopProcedure
  13.     ThisWorkbook.Save
  14. End Sub
  15. Sub StartProcedure()
  16.     '----- 可設 按鈕 指定此巨集手動應用-------
  17.     '------啟動 Dee_Set 程序的 執行巨集-------
  18.     If 收盤 Is Nothing Then Time_Set                        '變數未設定
  19.     If Sheets("Sheet1").[A2] <> Date Then Sheets("Sheet1").UsedRange.Offset(1) = ""
  20.                                                             '當日第一此開啟檔案 清除就有Dee資料
  21.     If Time > 收盤 Then                                     '已過 收盤時間
  22.         MsgBox "已過 " & 收盤
  23.     Else                                                    '未到 收盤時間
  24.         If Time >= 開盤 And Time <= 收盤 Then               '股市交易時間內
  25.             If Time_Dee > 開盤 Then Exit Sub                '預防重復:' 下次執行 Dee_Set 的時間大於開盤時間
  26.             Dee_Set
  27.         Else                                                '未開盤前
  28.             次數 = 0                                        '清除昨日紀錄 DEE 次數
  29.             Time_Dee = #8:30:00 AM#
  30.             Application.OnTime Time_Dee, "Dee_Set"
  31.             MsgBox "預定 於   " & #8:30:00 AM# & "更新 Dee資料"
  32.         End If
  33.     End If
  34. End Sub
  35. Sub StopProcedure()
  36.     '----- 可設 按鈕 指定此巨集手動應用-------
  37.     '------停止 Dee_Set 程序的 執行巨集-------
  38.     On Error Resume Next
  39.    Application.OnTime Time_Dee, "Dee_Set", , False
  40.    Time_Dee = #12:00:00 AM#                 '下次執行 Dee_Set 的時間: 小於開盤時間
  41. End Sub
  42. Private Sub Time_Set()                      '變數 設定
  43.     With Sheets("DATA")
  44.         Set 開盤 = .Range("X5")             '開盤時間
  45.         Set 收盤 = .Range("Y5")             '收盤時間
  46.         Set 次數 = .Range("X6")             '紀錄 DEE 次數
  47.         Set 間隔 = .Range("Y6")             '匯入DEE的 時間間隔
  48.         開盤 = "8:30:00"
  49.         收盤 = "13:30:00"
  50.         If 間隔 = "" Then 間隔 = "00:01:00" '未設未設立 間隔
  51.     End With
  52. End Sub
  53. Private Sub Dee_Set()
  54.     If Time > 收盤 Then Exit Sub
  55.     '----------紀錄 DEE -----------
  56.     Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(1, 22).Value = Sheets("DATA").[A2:v2].Value
  57.      次數 = 次數 + 1                        ' 切記 Counter (計數器) 要加一,否則永遠為零 (當然已也可以不予紀錄資料列述,依個人習性)。
  58.     Time_Dee = Time + 間隔                  '下次執行 Dee_Set 的時間
  59.     Application.OnTime Time_Dee, "Dee_Set"
  60. End Sub
複製代碼

作者: c_c_lai    時間: 2012-6-12 17:02

回復 12# GBKEE
原來 Module1 和 ThisworkBook 之間的置放有這些 Open以及Close的區別,
我將它記錄起來了,謝謝 GBKEE 大大的解說。

我發覺前天與昨日間的提問及回文都不翼而飛,是被刪除了,抑或論壇的資料庫發生了問題?
作者: devidlin    時間: 2012-6-12 17:27

小弟也想知道,提問及回文都不翼而飛,是被刪除了,抑或論壇的資料庫發生了問題?
作者: GBKEE    時間: 2012-6-12 17:34

我也有阿 應是 論壇的資料庫發生了問題
作者: roger1124    時間: 2014-5-4 19:55

請教此盤中DDE紀錄…可否適用康和e閃電的下單軟體嗎?




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