返回列表 上一主題 發帖

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

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

我對VBA都不懂在網上找好久找到一個比較接近我要的範例
可是他是每分鐘記錄一次
可以請高手幫我改每30秒就記錄一次嗎
也謝謝這位提供範例的網友


Option Explicit
Dim LastMin As Integer

Private Sub Workbook_Open()
    Sheets("策略記錄").Cells(4, 2) = 10
    LastMin = Minute(Time)
    Call Timer
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.Timer", , False
End Sub


Public Sub Timer()
    Dim Pos As Integer, i As Integer, RangeStr As String
        
    On Error Resume Next
    Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.Timer" '每秒顯示
    Sheets("策略記錄").Cells(3, 2) = Time '將時間show至策略的b3欄位
    Dim HHMM As Integer
    HHMM = Hour(Time) * 100 + Minute(Time)
    If (HHMM < 845 Or HHMM > 1345) Then Exit Sub '營業時間才執行
    If Minute(Time) <> LastMin Then '開始後做
        With Sheets("策略記錄")
            .Cells(4, 2) = .Cells(4, 2) + 1 '將變動行號加一行
            Pos = .Cells(4, 2)
            .Cells(Pos, 1) = Time
            .Cells(Pos, 2) = .Cells(2, 2)
            .Cells(Pos, 3) = .Cells(2, 3)
            .Cells(Pos, 4) = .Cells(2, 4)
            .Cells(Pos, 5) = .Cells(2, 5)
            .Cells(Pos, 6) = .Cells(2, 6)
            .Cells(Pos, 7) = .Cells(2, 7)
            .Cells(Pos, 8) = .Cells(2, 8)
            .Cells(Pos, 9) = .Cells(2, 9)
            .Cells(Pos, 10) = .Cells(2, 10)
           
         
        End With
   
        LastMin = Minute(Time)
    End If
End Sub

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

TOP

謝謝c_c_lai 大的回復
下周開盤再試試看

TOP

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

TOP

回復  xu123
不須等開盤,你只要開啟該Excel 表單,於 8:45 後觀察每隔30秒是否會寫入一筆紀錄,
答案便 ...
c_c_lai 發表於 2012-5-25 21:14

請問要改哪兒?
Application.OnTime Now + TimeValue("00:00:30"), "ThisWorkbook.Timer" '每秒顯示
我改這邊後  時間就不動也不記錄了?

謝謝  感恩

TOP

c_c_lai 大
試過了不行ㄋ
``我改開盤時間去測試
還是一分鐘記一次

TOP

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

TOP

回復 6# xu123
附上圖片以及程式碼供你實務參考:
一、 DDE 每分鐘記錄改為30秒自動記錄一次要怎改 [修改]
  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

謝謝c_c_lai 大用心的回復我附上檔案了 自動記錄每分鐘委買賣均值-範例.rar (11.08 KB)

TOP

回復  xu123
附上圖片以及程式碼供你實務參考:
一、 DDE 每分鐘記錄改為30秒自動記錄一次要怎改 [修改] ...
c_c_lai 發表於 2012-5-26 09:44

感謝c_c_lai 大這麼詳細用心的解說
又進一步學習了
來測試研究一下

感恩再感恩

TOP

        靜思自在 : 【停滯不前,終無所得】人都迷於尋找奇蹟,因而停滯不前;縱使時間再多、路再長,也了無用處,終無所得。
返回列表 上一主題