Board logo

標題: [分享] 分享的定時抓DDE資料程式碼,但是需要人指點迷津 [打印本頁]

作者: handsometrowa    時間: 2013-6-5 13:57     標題: 分享的定時抓DDE資料程式碼,但是需要人指點迷津

這陣子忙著統計資料,一方面又架構系統,感謝此討論區很多版大的協助,終於有一個完整的版本想分享給大家

一般不管是金融業人或是一般投資人 都會利用券商的DDE 去抓資料 並且做分析或式操作

有一個朋友給了我一個範例  如下  我想分享給大家,拍謝因為抓的DDE資料不同 請各位自行調整  但是我有一個地方相當的不懂  希望請前輩用白話文分析

整個程式碼是這樣子 這個程式碼可以自己修改抓資料的時間  願與大家分享共同討論
  1. Option Explicit

  2. Dim T1 As Date

  3. Const 開始 = "08:45:05"
  4. Const 結束 = "13:46:08"
  5. Const 週期1 = "0:0:10"

  6. Sub start()

  7. Call StopTimer

  8. Call Timer1

  9. End Sub

  10. Sub StopTimer()

  11. On Error Resume Next

  12. Application.OnTime T1, "Timer1", , 0

  13. T1 = 0

  14. End Sub

  15. Sub Timer1()

  16. If T1 Then

  17. Sheets("台指").Range("B6000").End(xlUp).Offset(1, 0) = Sheets("sheet1").Range("B2")

  18. Sheets("電指").Range("B6000").End(xlUp).Offset(1, 0) = Sheets("sheet1").Range("B4")

  19. Sheets("金指").Range("B6000").End(xlUp).Offset(1, 0) = Sheets("sheet1").Range("B6")

  20. End If

  21. T1 = TimeNext(開始, 結束, 週期, Now)

  22. If T1 Then Application.OnTime T1, "Timer1"


  23. End Sub

  24. Function TimeNext(TStart As String, TEnd As String, TFrequency As String, TNOW As Date)

  25. If TNOW < Int(TNOW) + TimeValue(TStart) Then

  26.     TimeNext = Int(TNOW) + TimeValue(TStart)
  27.    

  28. ElseIf _
  29.        TNOW >= Int(TNOW) + TimeValue(TEnd) Then
  30.    
  31.        TimeNext = 0
  32.         
  33. Else

  34.     TimeNext = Int((TNOW + TimeValue(TFrequency) + 0.5 / 86400) / TimeValue(TFrequency)) * TimeValue(TFrequency)
  35.    
  36.       
  37.       
  38. End If

  39. End Function
複製代碼
我想請問有沒有人能用很白的白話文解釋這個函式 的最後一個判斷式  
  TimeNext = Int((TNOW + TimeValue(TFrequency) + 0.5 / 86400) / TimeValue(TFrequency)) * TimeValue(TFrequency)
為什麼作者要這樣子設定呢?

不知道當初設計的朋友有沒有再版上  一起說聲感謝~
作者: GBKEE    時間: 2013-6-5 16:58

回復 1# handsometrowa
  1. Option Explicit
  2. Dim T1 As Date
  3. Const 開始 = "08:45:05"
  4. Const 結束 = "13:46:08"
  5. Const 週期1 = "12:00:10 AM"
  6. '******************************
  7. '常數可直接設為時間
  8. 'Const 開始 = #8:45:05 AM#
  9. 'Const 結束 = #1:46:08 PM#
  10. 'Const 週期1 = #12:00:10 AM#   '10分鐘
  11. '***************************
  12. Sub start()
  13. Call StopTimer
  14. Call Timer1
  15. End Sub
  16. Sub StopTimer()
  17. On Error Resume Next
  18. Application.OnTime T1, "Timer1", , 0
  19. T1 = Now
  20. '************************
  21. '建議改為 Time(時間)
  22. 'T1 = Time
  23. '***********************
  24. End Sub
  25. Sub Timer1()
  26. '*********************
  27. '依序只執行最先成立的條件,如後面有成立的條件是不會執行的.
  28. 'If 條件=True Then
  29. '    執行程式碼
  30. 'ElseIf 條件=True Then
  31. '    執行程式碼
  32. 'Else             '所有條件都不成立
  33. '    執行程式碼
  34. 'End If
  35. '**********************
  36. If T1 Then  ' T1> 0 -> T1 = True ,T1= 0 -> T1= False
  37.     Sheets("台指").Range("B6000").End(xlUp).Offset(1, 0) = Sheets("sheet1").Range("B2")
  38.     Sheets("電指").Range("B6000").End(xlUp).Offset(1, 0) = Sheets("sheet1").Range("B4")
  39.     Sheets("金指").Range("B6000").End(xlUp).Offset(1, 0) = Sheets("sheet1").Range("B6")
  40. End If
  41. '******************
  42. 'T1 =函數(參數1,參數2,參數3,參數4)傳回的數值
  43. '******************
  44. T1 = TimeNext(開始, 結束, 週期1, Now)  '建議 Now (日期+時間)  改為 Time (時間)
  45. If T1 Then Application.OnTime T1, "Timer1"
  46. End Sub
  47. Function ATimeNext(TStart As String, TEnd As String, TFrequency As String, TNOW As Date)
  48.    'Int(TNOW)->去掉小數(時間) 傳回日期
  49.    If TNOW < Int(TNOW) + TimeValue(TStart) Then  'TNOW > 日期+時間
  50.         TimeNext = Int(TNOW) + TimeValue(TStart)
  51.        ' imeNext > 日期+時間
  52.     ElseIf TNOW >= Int(TNOW) + TimeValue(TEnd) Then
  53.        TimeNext = 0
  54.     Else
  55.         TimeNext = Int((TNOW + TimeValue(TFrequency) + 0.5 / 86400) / TimeValue(TFrequency)) * TimeValue(TFrequency)
  56.          '86400秒 = 24(小時) * 60(分鐘) * 60(秒)
  57.     End If
  58. End Function
  59. '***********************************************
  60. '常數直接設為時間 'TNOW 改為 Time(時間)
  61. 'T1 = TimeNext(開始, 結束, 週期1, Time)
  62. '函數參數的型態須修改
  63. Function TimeNext(TStart As Date, TEnd As Date, TFrequency As Date, TNOW As Date) '改為 Time(時間)
  64.     If TNOW < TStart Then
  65.         TimeNext = TStart
  66.     ElseIf TNOW >= TEnd Then
  67.        TimeNext = 0
  68.     Else
  69.         TimeNext = Time + TFrequency
  70.     End If
  71. End Function
  72. '***********************************************
複製代碼

作者: handsometrowa    時間: 2013-6-6 09:56

感謝版主的回應阿 ~修改之後我看得比較懂了@@" 但是我還是有點好奇

為什麼作者他要這樣子設定
Int((TNOW + TimeValue(TFrequency) + 0.5 / 86400) / TimeValue(TFrequency)) * TimeValue(TFrequency)      

這個公式裡面  

(TNOW + TimeValue(TFrequency) + 0.5 / 86400) / TimeValue(TFrequency)
然後又乘TimeValue(TFrequency)   
這是什麼意思阿???





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