返回列表 上一主題 發帖

請問高手要將以下DDE 每分鐘記錄改為30秒自動記錄一次要怎改

回復 1# xu123
就以你手上案例來討論的話,你只要將 "00:00:01" (每一秒)
修改為 "00:00:30"  (每三十秒) 便完成了!

TOP

回復 3# xu123
不須等開盤,你只要開啟該Excel 表單,於 8:45 後觀察每隔30秒是否會寫入一筆紀錄,
答案便即知曉。

TOP

回復 6# xu123
請附上檔案由我這方來觀察,因為那本來就可行的,
否則你的 "00:00:01" 亦無法執行。

TOP

回復 6# xu123
附上圖片以及程式碼供你實務參考:
一、 DDE 每分鐘記錄改為30秒自動記錄一次要怎改 [修改]
3.png
2012-5-26 09:33
  1. Option Explicit
  2. Dim counter As Single      ' 為加深印象,用它來顯示程式有否在運行處理

  3. Private Sub Workbook_Open()
  4.     counter = 0

  5.     Call timerStart        ' 當開啟本 Excel 檔案,程式則自動執行 timerStart 程式段。
  6. End Sub

  7. Sub timerStart()
  8.     ' 本範例設定時間是從每日八點四十五分開始起算,每隔 30 秒便會自動去執行 ThisWorkbook 程式區域內的 ExeSelf。
  9.     ' 如果覺得等太久了,也可以去異動時段。例如: "00:00:01"(每隔 1 秒)、"00:00:10"(每隔 10 秒)、"00:00:20"(每隔 20 秒) 等等。
  10.     If (TimeValue(Now) > TimeValue("08:45:00")) Then Application.OnTime (Now + TimeValue("00:00:30")), "ThisWorkbook.ExeSelf"
  11. End Sub

  12. Sub ExeSelf()
  13.     counter = counter + 1   ' counter 會逐次加一

  14.     [F8].Value = counter    ' 08:45 後每隔 30 秒,請觀察 F1 欄位數字是否會異動?
  15.     Call timerStart         ' 程式之所以會反覆執行,就在於本行自動再去回頭呼叫執行 timerStart 程式段一次之故。
  16. End Sub
複製代碼
二、 多空力道 (O/H/L/C) 實際之程式運作程式碼,請細心端倪。
  1. Option Explicit

  2. Dim timerEnabled As Boolean  '
  3. Dim counter As Single        ' 示範用計數器
  4. Dim Ov As Single, Hv As Single, Lv As Single, Cv As Single As Single  ' 開盤價、最高價、最高價、收盤價(成交價) 等設定之變數。
  5. Dim turnKey As Integer   ' 判斷每一輪迴上列變數初始值之設定。
  6. Dim nums As Integer      ' 將每隔 "多少時間" 處理時段,移到此處來處理。

  7. Private Sub Workbook_Open()
  8.     counter = 0

  9.     nums = 30            ' 設定每隔 30 秒處理時段,亦可更改成 10 (每隔 10 秒)、20 (每隔 20 秒)等等。
  10.                          ' 此處不建議使用 1 秒時段來處理,因為還要去求出開盤、最高、最低、成交價。
  11.     timerEnabled = False
  12.     Call timerStart      ' 程式一啟始,便去自動執行 timerStart      
  13. End Sub

  14. Sub timerStart()
  15.     turnKey = 0          ' 每一輪迴盤中初始值之設定。

  16.     If timerEnabled Then
  17.         Application.OnTime (Now), "ThisWorkbook.ExeSelf"
  18.     Else
  19.         ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
  20.         Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.ExeSelf"
  21.     End If
  22. End Sub

  23. Sub ExeSelf()
  24.     timerEnabled = True

  25.     If IsError(Sheets("工作表1").Range("E5").Value) Then ' 假設 E5 欄位為多空力道
  26.         Cv = 0
  27.     Else
  28.         Cv = Sheets("工作表1").Range("E5").Value          ' 多空力道成交價
  29.     End If
  30.    
  31.     If (turnKey = 0 Or Ov = 0) Then                     ' 當 turnKey 值為0,表示其為初始值設定。為考量系統剛連上 DDE,
  32.                                                         ' 有時在第一根數值產生時 Ov = Cv 值可能為 0 (IsError()的狀態)。
  33.         Ov = Cv                                         ' 多空力道開盤價初始值設定
  34.         Hv = Cv                                         ' 多空力道最高價初始值設定
  35.         Lv = Cv                                         ' 多空力道最低價初始值設定
  36.     End If
  37.    
  38.     turnKey = turnKey + 1
  39.    
  40.     If (Cv > Hv) Then Hv = Cv                           ' 判斷多空力道最高價
  41.     If (Cv < Lv) Then Lv = Cv                           ' 判斷多空力道最低價

  42.     counter = counter + 1
  43.     [F1].Value = counter    ' 08:45 後每隔 30 秒,請觀察 F1 欄位數字是否會異動?
  44.    
  45.     If (turnKey < nums) Then
  46.         Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.ExeSelf"
  47.     Else
  48.         If (Cv > 0) Then Call Timer
  49.         Call timerStart
  50.     End If
  51. End Sub

  52. Sub Timer()
  53.     Dim str As String
  54.    
  55.     If (TimeValue(Now) >= TimeValue("08:45:00") And TimeValue(Now) <= TimeValue("13:46:01")) Then    ' 開盤、收盤時段設定
  56.         ' 盤中處理,將資料匯入寫入工作表單內儲存。

  57.     End If
  58. End Sub
複製代碼
請留意此兩支程式的寫法上之差異,我都盡量一一加以說明為何如此,相信對你會有助益。
我們在人生旅程上都是從不知而獲知中成長的,只要有心都可以成功的。

TOP

回復 9# xu123
3.png
2012-5-26 11:32
  1. Option Explicit
  2. Dim LastMin As String          ' 更改為間隔時段設定

  3. Private Sub Workbook_Open()
  4.     Sheets("策略記錄").Cells(4, 2) = 10     ' 保留你之前的設定,每次一開啟Excel都重新開始
  5.     LastMin = "00:00:30"          ' 每隔 30 秒的時段設定。如需以一分鐘做處哩,則請修正為 "00:01:00"
  6.    
  7.     Call Timer
  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. End Sub


  13. Public Sub Timer()
  14.     Dim Pos, i, HHMM As Integer, RangeStr As String
  15.         
  16.     On Error Resume Next
  17.     Sheets("策略記錄").Cells(3, 2) = Time '將時間show至策略的b3欄位
  18.    
  19.     HHMM = Hour(Time) * 100 + Minute(Time)
  20.     If (HHMM < 845 Or HHMM > 1345) Then Exit Sub '營業時間才執行
  21.         
  22.     With Sheets("策略記錄")
  23.         .Cells(4, 2) = .Cells(4, 2) + 1 '將變動行號加一行
  24.         Pos = .Cells(4, 2)
  25.         .Cells(Pos, 1) = Time
  26.         .Cells(Pos, 2) = .Cells(2, 2)
  27.         .Cells(Pos, 3) = .Cells(2, 3)
  28.         .Cells(Pos, 4) = .Cells(2, 4)
  29.         .Cells(Pos, 5) = .Cells(2, 5)
  30.         .Cells(Pos, 6) = .Cells(2, 6)
  31.         .Cells(Pos, 7) = .Cells(2, 7)
  32.         .Cells(Pos, 8) = .Cells(2, 8)
  33.         .Cells(Pos, 9) = .Cells(2, 9)
  34.         .Cells(Pos, 10) = .Cells(2, 10)
  35.     End With
  36.    
  37.     Application.OnTime Now + TimeValue(LastMin), "ThisWorkbook.Timer"  ' 每 LastMin 執行一次
  38. End Sub
複製代碼
祝星期假日愉快!
自動記錄每分鐘委買賣均值-範例.rar (12.31 KB)

TOP

本帖最後由 c_c_lai 於 2012-6-25 08:42 編輯

回復 17# mead
附上一個可以隨你需求異動的 "自動記錄每分鐘委買賣均值",
以後你就沒有煩惱的事了!
自動記錄每分鐘委買賣均值.rar (13.96 KB)

P.S. 請將 Time() 裡的             .Cells(21, 2).Offset(0).Resize(, 9) = .[B12:J12].Value
更改成                                      .Cells(Pos, 2).Offset(0).Resize(, 9) = .[B2:J2].Value

TOP

本帖最後由 c_c_lai 於 2012-6-25 17:34 編輯

回復 19# mead
找到了,已  E-Mail 過去了!

TOP

回復 21# usana642
1. 請將下列程式碼複製到 ThisWorkbook 模組內,並予儲存。
  1. Option Explicit
  2. Dim timerEnabled As Boolean    ' 判定開啟本工作表單的時段是否為開盤前啟動。
  3. Dim Pos As Integer             ' 將每隔 "多少時間" 處理時段,移到此處來處理。

  4. Private Sub Workbook_Open()
  5.     Pos = Sheets("策略記錄").Range("B" & Rows.Count).End(xlUp).Row
  6.     If (Pos < 11) Then Pos = 10
  7.     Sheets("策略記錄").Cells(4, 2) = Pos

  8.     If (Sheets("策略記錄").Range("B6").Value = "") Then Sheets("策略記錄").Range("B6").Value = "08:45:00"
  9.     If (Sheets("策略記錄").Range("B7").Value = "") Then Sheets("策略記錄").Range("B7").Value = "13:45:00"
  10.     If (Sheets("策略記錄").Range("B8").Value = "") Then Sheets("策略記錄").Range("B8").Value = "00:00:30"
  11.    
  12.     timerEnabled = False

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

  15. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  16.     On Error Resume Next
  17.     Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.Timer", , False
  18.    
  19.     Me.Save
  20. End Sub

  21. Public Sub Timer()
  22.     On Error Resume Next
  23.     If (TimeValue(Now) > Sheets("策略記錄").Range("B7").Value) Then Exit Sub
  24.    
  25.     If (TimeValue(Now) >= Sheets("策略記錄").Range("B6").Value) Then         ' 開盤、收盤時段設定
  26.         ' 盤中處理,將資料匯入寫入工作表單內儲存。

  27.         With Sheets("策略記錄")
  28.             .Cells(3, 2) = Time             ' 將時間 Show 至策略的 B3 欄位

  29.             Pos = Pos + 1                   ' 將變動行號加一行
  30.             .Cells(4, 2) = Pos

  31.             .Cells(Pos, 1) = Time
  32.             .Cells(Pos, 2).Offset(0).Resize(, 9) = .[B2:J2].Value
  33.         End With
  34.     End If
  35.         
  36.     Call timerStart
  37. End Sub

  38. Sub timerStart()
  39.     If timerEnabled Then
  40.         ' 第二次(含)以後均以設定之 "間隔時段" 來處理執行序的作業。
  41.         Application.OnTime (Now + Sheets("策略記錄").Range("B8").Value), "ThisWorkbook.Timer"
  42.     Else
  43.         timerEnabled = True
  44.         
  45.         ' 將第一次啟動時間更改為設定 "開盤時間"前,如果開啟 Excel 時,已經過了設定 "開盤時間",則一進入系統即直接去執行紀錄作業。
  46.         If (TimeValue(Now) <= Sheets("策略記錄").Range("B6").Value) Then
  47.             Application.OnTime (Sheets("策略記錄").Range("B6").Value), "ThisWorkbook.Timer"
  48.         Else
  49.             ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,
  50.             ' 這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
  51.             Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.Timer"
  52.         End If
  53.     End If
  54. End Sub
複製代碼
2. 工作表單內容如圖,請參考它與程式碼間的關係及運作。
10.png
2012-6-26 06:45

3. 以上完成後,先將本專案儲存並離開。
4. 接下來先打開券商軟體
    (譬如:你製作的工作表單是跟哪一家券商連線的,如 EasyWin、eLeader、或其他券商連線軟體),
    然後啟動你製作的 "自動記錄每分鐘委買賣均值"  Excel,並同時連上券商連線軟體,就大功告成了!

希望它能助益於你,並能幫助你更上一層樓。

TOP

回復 25# steveyeh168
沒 E-Mail Address 如何寄給你?

TOP

謝謝C_C_lai......

再次感謝~*_*
steveyeh168 發表於 2012-9-23 02:35

自動記錄每分鐘委買賣均值.rar (13.96 KB)

TOP

        靜思自在 : 人的心地是一畦田,土地沒有播下好種子,也長不出好的果實。 -
返回列表 上一主題