Board logo

標題: [發問] 我也想問DDE利用Private Sub Worksheet_Calculate()取資料方式 [打印本頁]

作者: albertbug    時間: 2011-7-26 15:08     標題: 我也想問DDE利用Private Sub Worksheet_Calculate()取資料方式

各位大大你們好
我知道我很嫩
但是近日剛好有需求想要請教各位大大

先在Sheet1(Sheet1)上打上
其他大大的神奇程式(如下)

Private Sub Worksheet_Calculate()
Dim NowDateTime, nowTime, startTime, stopTime
Dim tr As String

NowDateTime = Now  '現在的時間值, 去掉整數部份,
nowTime = (NowDateTime - Int(NowDateTime)) '得到現在的時間值
startTime = Range("A6") '開盤時間, 例如: "09:00:00 AM"
stopTime = Range("A8")  '收盤時間, 例如: "01:30:00 PM"

If nowTime <= startTime Then  '尚未開盤
    Exit Sub
ElseIf nowTime > stopTime Then '已經收盤
    Exit Sub
Else
    If [C2] <> "-" And [C2] <> "###" Then   '清盤的狀態, 不取其資料
        tr = Int((nowTime - startTime) * 288) + 2  '每差 300 秒就換一列
        If Range("D" & tr) = "" Then Range("D" & tr) = Range("C2")  '開始價
        If Range("E" & tr) = "" Or Range("C2") > Range("E" & tr) _
            Then Range("E" & tr) = Range("C2")                      '最高價
        If Range("F" & tr) = "" Or Range("C2") < Range("F" & tr) _
            Then Range("F" & tr) = Range("C2")                      '最低價
        Range("G" & tr) = Range("C2")                               '結束價
    End If
End If
End Sub

但最後還是無法存取
不知道哪邊錯誤了  還是要打在ThisWorkbook那邊呢???
我是使用富邦e01 DDE存取資料放在C2

再請各位大大了 我有爬文但是還是不會 感謝
作者: luhpro    時間: 2011-7-26 21:34

所謂的 "無法存取" 不知道是什麼情形?
1. 盤中該跳動的數字不會跳動?
2. 還是出現錯誤訊息,例如: "無法存取遠端資料" 或是 "某某程式無法開啟?"
3. 亦或是 結果儲存格內容無法跟著來源儲存格內容變動?

因訊息不足所以只能先用猜的 :
1. 先檢查一下是否之前有調整過設定變成是 "手動計算" 或是 "儲存前再計算" 之類的設定.
[attach]7145[/attach]
2. 該看盤程式應比Excel檔先執行,還應確認已登入並正常連線以接收行情資料中,
又或者是儲存格內的公式是否不正確-
可以考慮依看盤軟體所提供的功能看是直接轉成(或匯出到)Excel檔 或是 可直接拖曳到儲存格上.
再依其規律推導出正確的公式. (例如不同股票代號 與 不同價別名稱(買進價, 成交價...)間公式的差異)
3. 先確認來源儲存格變動情形正常,再確認結果儲存格公式是否正常.
作者: albertbug    時間: 2011-7-26 21:54

感謝大大幫忙回覆
1.數字是會跳動的
2.無錯誤訊息
3.我設定為D E F G 跟著C2變化 但是D E F G從來沒有出現過數值過??

檢查後
1.正常
2.好像是這邊出問題 我改用元大DDE後就出現程式錯誤 不過正在摸熟錯誤碼中
  似乎是富邦e01使用為格式問題
3.目前就在疑惑 根據我的解讀 是否 D E F G就應該開始存取資料後換行持續紀錄
   但完全沒有動靜 感謝大大了
作者: luhpro    時間: 2011-7-27 02:25

本帖最後由 luhpro 於 2011-7-27 02:36 編輯
檢查後
2.好像是這邊出問題 我改用元大DDE後就出現程式錯誤 不過正在摸熟錯誤碼中
  似乎是富邦e01使用為格式問題
3.目前就在疑惑 根據我的解讀 是否 D E F G就應該開始存取資料後換行持續紀錄
   但完全沒有動靜
albertbug 發表於 2011-7-26 21:54


2. 不同的看盤軟體會因為其 程式(或資料庫)名稱(位於 "|" 左方) 與 對價別名稱定義 的不同而有不同的套用公式,
一般來說不修改公式內容是不能直接抓到資料的,
請參閱這篇內的敘述來修改公式.
3. 請上傳該檔案以便大家判斷問題點在哪.
作者: albertbug    時間: 2011-7-27 11:16

附件為測試檔案
A6為開始時間
A8為結束時間
C2的Data原本是想放入期貨跳動
但由於想測試整天所以是放上元大匯率跳動

再麻煩各位大大了
感謝

關於第二點修改公式部分已在學習感謝各位
作者: GBKEE    時間: 2011-7-27 13:50

本帖最後由 GBKEE 於 2011-11-12 06:44 編輯

回復 5# albertbug
[ 2011/11/12 更正 ]
試試看
  1. Private Sub Worksheet_Calculate()
  2.     Dim startTime, stopTime
  3.     Dim Tr As String, Time_Step As Date
  4.    
  5.     Time_Step = #12:05:00 AM#     '設定間隔時間: 5分鐘->300秒
  6.     'Time_Step = #12:00:01 AM#     '設定間隔時間: 1秒
  7.    
  8.     startTime = Range("A6") '開盤時間, 例如: "09:00:00 AM"
  9.     stopTime = Range("A8")  '收盤時間, 例如: "01:30:00 PM"
  10.     If startTime > Time Then  '尚未開盤
  11.         Exit Sub
  12.     ElseIf stopTime < Time Then '已經收盤
  13.         Exit Sub
  14.     Else     
  15.       If [C2] <> "-" And [C2] <> "###" Then   '清盤的狀態, 不取其資料
  16.             'Tr = Int((nowTime - startTime) * 1440) + 30  '每差 300 秒就換一列
  17.             Tr = Int((Time - startTime) / Time_Step) + 30 ' 每5分鐘一列 從第30列開始
  18.             If Range("D" & Tr) = "" Then Range("D" & Tr) = Range("C2")  '開始價
  19.             If Range("E" & Tr) = "" Or Range("C2") > Range("E" & Tr) _
  20.                 Then Range("E" & Tr) = Range("C2")                      '最高價
  21.             If Range("F" & Tr) = "" Or Range("C2") < Range("F" & Tr) _
  22.                 Then Range("F" & Tr) = Range("C2")                      '最低價
  23.             Range("G" & Tr) = Range("C2")                               '結束價
  24.         End If
  25.     End If
  26. End Sub
複製代碼

作者: albertbug    時間: 2011-7-27 16:02

感謝大大的回覆
根據G大你的寫法 目前在 D E F G還是沒有數值寫入並且儲存

我學淺的看著Code
意思上我都懂 但是我覺得有點奇怪
為何沒有執行
If Range("D" & Tr) = "" Then Range("D" & Tr) = Range("C2")  這行
一開始假若沒有數值  會判斷錯誤合理

我的問題就是 數字會跳動 但是數直無法儲存  感謝各位!
作者: GBKEE    時間: 2011-7-27 16:19

回復 7# albertbug
建議你前面加上 Range("C" & tr) = Format(Time, "HH:MM:SS") 來看看
看看你附檔上66列-786列上有不連續的資料,資料是有記錄下來的.
作者: albertbug    時間: 2011-7-27 16:52

真的有記錄下來  是我時間上的差異
導致tr數值比較大
太蠢了我
Sorry

好的 感謝大大 我來在好好研究一下這些資料
感謝各位
作者: albertbug    時間: 2011-7-27 18:47

本帖最後由 albertbug 於 2011-7-27 18:48 編輯

各位大大 我還想做另外一件事情
每行D E F G
皆需要與上行D E F G比較值大小
(因為每行都會根據tr往下排序)
比較完後 根據判斷式輸出文字"+" or "-"

如此比較法要如何寫出
作者: luhpro    時間: 2011-7-27 20:50

本帖最後由 luhpro 於 2011-7-27 21:02 編輯
每行D E F G
皆需要與上行D E F G比較值大小
(因為每行都會根據tr往下排序)
比較完後 根據判斷式輸出文字"+" or "-"
albertbug 發表於 2011-7-27 18:47


你的意思是指要顯示該儲存格數值與上一次數值間的增減方向嗎?
一般來說可以採用 4 個變數(即最近開始價、最高價、最低價與結束價)來儲存最新的數值,
然後於每次更新儲存格數值時就與其做比較並加上 +、- 號,
當然別忘了將新值再度賦予(更新)至該變數.

之所以建議採用此方式是因為發現你的例子中會有空白格子出現,
所以不適合直接去比較目前儲存格的 "上一個" 格子內容.

加的方式應該不困難,
你可以試著實做看看.
另外個人建議你可以考慮將開始時間與結束時間放在該列的左邊(B欄與C欄),
在D29 ~ G29 加上 開始價、最高價、最低價與結束價 等欄位名稱,
這樣應該會更容易判讀盤勢變化或是用來製作圖表.
作者: GBKEE    時間: 2011-7-27 20:58

回復 10# albertbug
If Range("D" & Tr) = "" Then Range("D" & Tr) = Range("C2")  '開始價
            I = Range("D" & Tr) - Range("D" & Tr).Offset(-1)      ' - 上一列         
            Msg = ""
            If I > 0 Then Msg = "+"                  '
            If I < 0 Then Msg = "-"
            Range("??" & Tr) = Msg                                    '?? 你要放的欄位自己設
            If Range("E" & Tr) = "" Or Range("C2") > Range("E" & Tr) _
                Then Range("E" & Tr) = Range("C2")                      '最高價
            I = Range("E" & Tr) - Range("E" & Tr).Offset(-1)
            Msg = ""
            If I > 0 Then Msg = "+"
            If I < 0 Then Msg = "-"
           Range("??" & Tr) = Msg
作者: albertbug    時間: 2011-7-28 00:17

本帖最後由 albertbug 於 2011-7-28 18:09 編輯

感謝luhpro大大的建議
我會自己嘗試撰寫的
並且補上些中文說明
主要當初沒補上是因為想說想把主架構VBA學會  
感謝建議


感謝GBKEE大大
由於下班後使用MAC os沒裝Office
明日會在研究此些程式碼 感謝
原來主要要使用.Offset(-1)
感謝
作者: albertbug    時間: 2011-7-28 11:02

各位大大  判斷已經沒有問題囉
但是又來請問
假若相同的 Worksheet_Calculate
裡面可以計算加法嗎

ex 我有匯出一筆數字(成交量)
但是他每改變一次  我就累積累加起來 一樣五分鐘後換行
此加法是需要額外寫一個Sub計算
還是相同一個也可以???

不好意思  一直問問題 感謝大大指正




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