Board logo

標題: DDE 擷取分鐘最高最低 [打印本頁]

作者: vzcen    時間: 2013-6-20 16:22     標題: DDE 擷取分鐘最高最低

版大您好 想請教您有關DDE取最高以及最低價格的寫法 在EXCEL表格中 B5為DDE的時間輸入 B6為DDE的價格輸入若想讓他每分鐘都能抓出最高與最低價格顯示在D8和E8欄中並依序向下  且B5時間輸入的部分是經由程式計數所顯示出來的不是經由DDE聯結 想請教一下該怎麼寫 麻煩您了 感謝您!!
作者: stillfish00    時間: 2013-6-21 11:06

本帖最後由 stillfish00 於 2013-6-21 11:20 編輯

回復 1# vzcen
沒用過DDE,僅供參考。
  1. Private gbStart As Boolean
  2. Private recTime
  3. Private recValue
  4. Private Sub Worksheet_Calculate()
  5.     Dim ddeValue
  6.    
  7.     If gbStart Then
  8.         ddeValue = [B6].Value
  9.         If IsEmpty(recValue) Then recTime = Time: recValue = ddeValue
  10.         
  11.         If Minute(recTime) = Minute(Time) Then
  12.             If ddeValue > recValue Then recTime = Time: recValue = ddeValue
  13.         Else
  14.             '紀錄時間在D欄最後一列下方
  15.             Cells(Rows.Count, "D").End(xlUp).Offset(1).Value = recTime
  16.             '紀錄價格在E欄最後一列下方
  17.             Cells(Rows.Count, "E").End(xlUp).Offset(1).Value = recValue
  18.             recTime = Time: recValue = ddeValue
  19.         End If
  20.     End If
  21.    
  22. End Sub
  23. '可建立按鈕開始或結束
  24. Private Sub StartRecordData()
  25.     gbStart = True
  26. End Sub
  27. Private Sub StopRecordData()
  28.     gbStart = False
  29.     recTime = Empty
  30.     recValue = Empty
  31. End Sub
複製代碼

作者: GBKEE    時間: 2013-6-21 16:10

本帖最後由 GBKEE 於 2013-6-24 16:18 編輯

回復 1# vzcen
這DEE工作表物件的程式碼
  1. Option Explicit
  2. Private Sub Worksheet_Calculate()
  3.     Dim Rng As Range
  4.     Static Msg As Boolean    '以 Static 陳述式宣告的變數,在程式執行期間,會一直保留內容。
  5.     If Weekday(Date, vbMonday) > 5 Or Time < #9:00:00 AM# Or Time > #1:30:00 PM# Then Exit Sub  '非營業日 或 非營業時間
  6.     If Msg = False Then
  7.         清除舊資料
  8.         Msg = True
  9.     End If
  10.     With Cells(Rows.Count, "C").End(xlUp)
  11.         If .Row = 7 Then
  12.             Set Rng = .Offset(1)
  13.         Else
  14.             Set Rng = .Cells
  15.         End If
  16.     End With
  17.     If Rng = "" Or Rng.Text <> Format([b5], "hh:mm") Then
  18.         If Rng <> "" Then Set Rng = Rng.Offset(1)
  19.         Rng = Format([b5], "hh:mm")
  20.         Rng(1, 2) = [B6].Text
  21.         Rng(1, 3) = [B6].Text
  22.     ElseIf Rng.Text = Format([b5], "hh:mm") Then
  23.         If [B6] > Rng(1, 2) Then Rng(1, 2) = [B6].Text
  24.         If [B6] < Rng(1, 3) Then Rng(1, 3) = [B6].Text
  25.     End If
  26. End Sub
  27. Private Sub 清除舊資料()
  28.     On Error GoTo Er
  29.     If [營業日] <> Date Then            '檢查 定義名稱:"營業日"的值
  30.         Me.Names.Add "營業日", Date     '定義名稱:"營業日"的值為當日
  31.         If Weekday(Date, vbMonday) <= 5 Then Range([C8], [E8].End(xlDown)).Clear '營業日
  32.     End If
  33.     Exit Sub
  34. Er:  '處裡: 沒有定義名稱:"營業日"的錯誤
  35.      Me.Names.Add "營業日", Date        '定義名稱:"營業日"的值為當日
  36.      Resume Next                        '回到錯誤的下一個程式碼:繼續執行
  37. End Sub
複製代碼
[attach]15279[/attach]
作者: vzcen    時間: 2013-6-21 21:24

非常感謝強者版大們的指導 昨晚爬文爬到半夜兩點多 還是爬不出一個所以然來 我真的太愚昧了... 這兩天我會測試一下 後續再跟版大們報告狀況與請益 感謝!!!!!!
作者: vzcen    時間: 2013-6-21 22:53

GBKEE版大您好 我剛改了一下營業的時間測試了一下現在連結的DDE報價 發現一個問題想請板大解惑 就是由於各家系統的報價時間格式不同 例如:假設現在是10:29:03   但DDE 連結到B5的內容會顯示成102903......結果測試後 只要DDE一跳動 就會在CDE欄一直往下紀錄..不是每分鐘紀錄一次最大最小值...所以想請教版大 在B5的時間顯示 該怎麼讓它透過程式顯示時間 統一用的是電腦的系統時間.... 謝謝您了 ~
作者: vzcen    時間: 2013-6-22 00:12

還有一個小問題 不好意思 要再麻煩您一下 就是說 當下一分鐘若沒有出現大於或小於上一分鐘的最大值最小值 那麼好像就不會繼續往下跳動 舉例來說 C8儲存格10:01.. D8儲存格最大值100... E8儲純格最小值50 ... 若B6儲存格的價格沒有跳超過100以上,50以下   那麼好像就只會停留在D8 E8 之中 直到B6大於100或小於50  才會更新數據....懇請大大解惑 如何能每一分鐘由D欄及E欄依序的往下顯示取得每分鐘的最大值跟最小值...謝謝您了~~
作者: GBKEE    時間: 2013-6-22 15:07

回復 6# vzcen
這問題請附檔看看

5# 可如圖示修改格式


[attach]15286[/attach]
作者: vzcen    時間: 2013-6-22 19:34

版大您好 謝謝您的回覆 我會先試著改看看 不過有個小問題想請教版大 由於程式裡面有限定"非營業日" 那現在是周六日的情況 若我要拿掉"非營業日"的程式碼 是不是只要將05行的 If Weekday(Date, vbMonday) > 5 Or Time < #9:00:00 AM# Or Time > #1:30:00 PM# Then Exit Sub  '非營業日 或 非營業時間>>>>>改成  If  Time < #9:00:00 AM# Or Time > #1:30:00 PM# Then Exit Sub  '非營業日 或 非營業時間       改完後我是不是就可以在週六日的時間 用手動的方式 輸入 DDE聯結的儲存格B5跟B6......讓程式跑跑看進行測試    .....懇請大大解惑 麻煩您了 謝謝您~
作者: GBKEE    時間: 2013-6-23 14:34

回復 8# vzcen
今天是週日,試的如何!
作者: handsometrowa    時間: 2013-6-24 10:24

分析程式碼當中..

不過版大問的問題裡面  

有時候會包含星期六也會開盤喔...@@"  

這樣子 你那個特殊的交易日  就沒辦法記錄了
作者: vzcen    時間: 2013-6-24 10:39

版大您好 跟您報告一下 我已將程式上傳依照版大您的指導改了儲存格的時間隔式  測式的結果為時間隔式的部分皆顯示成0:00:00  只要價格跳動 CDE欄就會一直持續往下紀錄  檔案附上的內容裡 都是同一分鐘所顯示出來的   想請教版大這個部分該怎麼辦...麻煩您了~~
作者: c_c_lai    時間: 2013-6-24 13:54

回復 11# vzcen
回復 9# GBKEE
[attach]15299[/attach]
作者: GBKEE    時間: 2013-6-24 16:19

本帖最後由 GBKEE 於 2013-6-24 16:23 編輯

回復 11# vzcen
B5的格式就不必修改了
B5的內容會顯示成102903, 此為6位數,請問 B5, 10點以前會顯示成95959, 此為5位數
  1. Option Explicit
  2. Private Sub Worksheet_Calculate()
  3.     Dim Rng As Range
  4.     Static Msg As Boolean    '以 Static 陳述式宣告的變數,在程式執行期間,會一直保留內容。
  5.    ' If Time < #10:28:00 AM# Or Time > #1:30:00 PM# Then Exit Sub   '非營業日 或 非營業時間
  6.     If Msg = False Then
  7.         清除舊資料
  8.         Msg = True
  9.     End If
  10.     With Cells(Rows.Count, "C").End(xlUp)
  11.         If .Row = 7 Then
  12.             Set Rng = .Offset(1)
  13.         Else
  14.             Set Rng = .Cells
  15.         End If
  16.     End With
  17.     'If Rng = "" Or Rng.Text <> Mid([B5].Text, 1, IIf(Len([B5]) = 6, 4, 3)) Then '如果[B5]10點以前的的數值是95959, 5位數 用此程式碼
  18.     If Rng = "" Or Rng.Text <> Mid([B5].Text, 1, 4) Then
  19.         If Rng <> "" Then Set Rng = Rng.Offset(1)
  20.         With Rng
  21.             .NumberFormatLocal = "@"
  22.              '.Cells = Mid([B5].Text, 1, IIf(Len([B5]) = 6, 4, 3))                 '如果[B5]10點以前的的數值是95959. 5位數 用此程式碼
  23.           .Cells = Mid([B5].Text, 1, 4)
  24.             .Cells(1, 2) = [B6].Text
  25.             .Cells(1, 3) = [B6].Text
  26.         End With
  27.    'ElseIf Rng.Text = Mid([B5].Text, 1, IIf(Len([B5]) = 6, 4, 3)) Then                '如果[B5]10點以前的的數值是95959. 5位數 用此程式碼
  28.     ElseIf Rng.Text = Mid([B5].Text, 1, 4) Then
  29.         If [B6] > Rng(1, 2) Then Rng(1, 2) = [B6].Text
  30.         If [B6] < Rng(1, 3) Then Rng(1, 3) = [B6].Text
  31.     End If
  32. End Sub
複製代碼
  1. Private Sub 清除舊資料()
  2.     On Error GoTo Er
  3.     If [營業日] <> Date Then            '檢查 定義名稱:"營業日"的值
  4.         Me.Names.Add "營業日", Date     '定義名稱:"營業日"的值為當日
  5.         If Weekday(Date, vbMonday) <= 5 Then Range([C8], [E8].End(xlDown)).Clear ' 修改 3#   
  6.     End If
  7.     Exit Sub
  8. Er:  '處裡: 沒有定義名稱:"營業日"的錯誤
  9.      Me.Names.Add "營業日", Date        '定義名稱:"營業日"的值為當日
  10.      Resume Next                        '回到錯誤的下一個程式碼:繼續執行
  11. End Sub
複製代碼

作者: vzcen    時間: 2013-6-24 16:31

感謝C_C_lai版大的回覆 經過測試後時間可以正常的往下累積每分鐘的最大值最小值 真是太感激您了 ...但有個問題還想請教一下版大們 ...由於每家的系統報價格式不同 有的甚至沒有提供時間的DDE連結....所以我想請問有辦法做的到利用程式去跑出時間嗎??  因為若遇到沒有提供時間DDE的連結的系統那麼程式就不能順利執行了  懇請板大們幫忙解答 感謝您們了..........
另外....我知道我這樣問好像很蠢  但..我想....學習了解程式的過程中 我也該學著有關禮貌的回覆方式 因為我常看到板大們的回覆有 11# 6# 針對該文所提出的內容做回覆...所以想問問版大們 我若要回覆時 要按哪一個鈕才是針對該文的回答.....我想這樣回覆好像會更有禮貌  同時也是對辛苦版大們所做的回答內容更尊重......呵呵
作者: vzcen    時間: 2013-6-24 20:43

各位版大們好 我下午時開著電腦讓它跑了一下....發現一個奇怪的問題.....就是報價軟體的時間與價格是有跳動的    但是DDE的時間好像有時會停住...測試結果 我附上檔案  檔案裡 時間無法連續的顯示每一分鐘....好比17:44 接下來就掉到17:46   又或者是18:14 接著跳到18:17 ......請問強者版大們這個情況是哪邊出現問題嗎??
作者: c_c_lai    時間: 2013-6-25 05:29

本帖最後由 c_c_lai 於 2013-6-25 05:34 編輯

回復 15# vzcen
基本上,時間是會以每分鐘持續地記錄的,因為程式啟動後 Calculate 會不停地掃描。
此時,如果電腦另開啟了別的應用軟體 (耗用資源大)在運作而占據了 CPU ,那麼是會
有所影響的,或者是又同時開啟瞭一個以上的 Excel 檔等,亦會有所影響。
個人是常碰到類似相關問題 (券商DDE連線品質、電腦運作環境等)  , 純供參考。

P.S: 答覆對方時請點選 "回復" 選鈕,否則當事人會不知你有否回復,點按 "回復" 亦是一種禮貌。
作者: handsometrowa    時間: 2013-6-25 09:33

回復 13# GBKEE


    請問版主
With Cells(Rows.Count, "C").End(xlUp)
        If .Row = 7 Then
            Set Rng = .Offset(1)  請問這裡的用法還原:  Cells(Rows.Count, "C").End(xlUp).Offset(1)   這個意思嗎??
        Else
            Set Rng = .Cells       請問這裡的用法還原:  Cells(Rows.Count, "C").End(xlUp).Cells   這個意思嗎?? 這會不斷的增加Range 的大小是嗎?
        End If
    End With

謝謝您的指導^^
作者: GBKEE    時間: 2013-6-25 15:34

回復 17# handsometrowa
沒錯
作者: vzcen    時間: 2013-6-26 00:34

回復 13# GBKEE
回復 16# c_c_lai

感謝強者版大們不吝的指導 原來DDE是這樣時間才無法接續
那想請教版大們 若測識DDE的時間 為周一至周六     9:00PM-隔日的2:00AM
我是不是要將程式05行改成   If Weekday(Date, vbMonday) > 6 Or Time < #9:00:00 PM# Or Time > #2:00:00 AM# Then Exit Sub     '非營業日 或 非營業時間
然後31行的改成 If Weekday(Date, vbMonday) <= 6 Then Range([C8], [E8].End(xlDown)).Clear '營業日
由5改成6是指禮拜一至六的意思嗎?   那時間的部分這樣改是對的嗎?
麻煩各位大大們解惑了  謝謝您們~
作者: c_c_lai    時間: 2013-6-27 06:54

本帖最後由 c_c_lai 於 2013-6-27 06:55 編輯
回復  GBKEE
回復  c_c_lai

感謝強者版大們不吝的指導 原來DDE是這樣時間才無法接續
那想請教版大們 ...
vzcen 發表於 2013-6-26 00:34

1. 試試看便知曉! (因你是跨日的, 所以條件須為 (條件1 And 條件2))
  1. Sub Test()
  2.     If Weekday(Date, vbMonday) > 6 Or (#9:00:00 PM# < #9:00:00 PM# And #9:00:00 PM# > #2:00:00 AM#) Then Exit Sub
  3.     '  If Weekday(Date, vbMonday) > 6 Or (#8:00:00 PM# < #9:00:00 PM# And #8:00:00 PM# > #2:00:00 AM#) Then Exit Sub
  4.    '  If Weekday(Date, vbMonday) > 6 Or (#12:00:00 AM# < #9:00:00 PM# And #12:00:00 AM# > #2:00:00 AM#) Then Exit Sub
  5.     '   If Weekday(Date, vbMonday) > 6 Or (#12:10:00 AM# < #9:00:00 PM# And #12:10:00 AM# > #2:00:00 AM#) Then Exit Sub
  6.    MsgBox "It's OK!"
  7. End Sub
複製代碼
2. 31行 的修改是 OK 可行的!
作者: hhh111    時間: 2013-7-2 17:03

回復 3# GBKEE


    抱歉,想要請教一個很白痴的問題,因為最近正在研究要如何讓EXCEL固定抓取DDE的資料
但是偏偏對VBA不熟,有試的將各位的內容貼入VB編輯器中執行,可是都無法啟動
可否稍微詳細點告知該如何測試
作者: GBKEE    時間: 2013-7-2 17:44

回復 21# hhh111

[attach]15353[/attach]
作者: hhh111    時間: 2013-7-13 14:33

多謝GBKEE的說明,其實後來將GB大分享的貼入VB中,並且設定好B5&6欄位就可以用了
是小弟功力不足還請見諒
作者: hhh111    時間: 2013-7-14 04:33

回復 3# GBKEE


    請問GB大,如果我要的是每兩分鐘或是五分鐘的話又該如何修改呀
能否告知一下,謝謝
作者: GBKEE    時間: 2013-7-14 07:42

回復 24# hhh111

    參考這裡




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