Board logo

標題: 請教接收資料只要產生變動就記錄該怎麼寫 [打印本頁]

作者: laieven    時間: 2015-9-10 16:48     標題: 請教接收資料只要產生變動就記錄該怎麼寫

我想寫一個巨集
由a1儲存格接收從看盤軟體傳送進來的成交單量資料
小於10口的成交單量紀錄到d欄大於10口的成交單量紀錄到e欄
每隔1分鐘把小於10口的單量加總並記錄到b欄把大於10口的單量加總並記錄到c欄

我有試過用Calculate事件去做,但不大成功,爬了文,有人說必須用change事件去做

請問
1.我該用哪個事件程序去做呢?
原理是a1儲存格有變動就記錄
2.倘若連續幾筆單都是1口成交量而已,程式能判別?總不能連續10個成交紀錄都是1但我卻只記錄1口而已
3.連續推疊的d欄和e欄每隔1分鐘是否要清空紀錄,好讓下1分鐘的單量重新累計

煩請各位高手幫忙!!感謝!!
作者: GBKEE    時間: 2015-9-11 08:44

回復 1# laieven


看盤軟體如有成交單總量資料,Calculate事件可參考它來記錄成交單量資料
作者: laieven    時間: 2015-9-11 11:43

回復 2# GBKEE

1.能請教比較具體的簡單寫法,感謝!!!

2.個人持續研究中,我還是用CHANGE事件
把看盤軟體資料拉進EXCEL~~~我先定義Target為L2儲存格,只要L2儲存格有變動,我就CALL紀錄這個巨集~~~而"這個巨集紀錄",主要是記錄K2儲存格, 若K2儲存格數字為1-10~~我就排序記錄在E欄
若K2儲存格的數字大於10我就記錄在F欄,藉以把成交口數區分開來
但@@@@@不會動!!
附上截圖及檔案請高手幫忙!!感謝!
    [attach]21951[/attach]
[attach]21952[/attach]
作者: owen06    時間: 2015-9-11 11:55

回復 3# laieven


    看盤軟體的資料是直接傳送進來,而不是你手動輸入資料,所以使用change會無效,
    用版主所說的Calculate去寫程式吧
作者: laieven    時間: 2015-9-11 12:45

回復 4# owen06


    原來如此~~~學藝不精!!!見笑了!!

能否指導一下"Calculate"的撰寫邏輯!!!
萬分感謝!!
作者: owen06    時間: 2015-9-11 13:26

回復 5# laieven


    去看看准提部林大大的文章吧,可能最近同樣性質的問題太多了,他跳出來拯救為此苦腦不已的同胞們了。
    http://forum.twbts.com/thread-15062-1-1.html
作者: laieven    時間: 2015-9-11 13:37

回復 6# owen06


    感謝提醒~~我再去觀摩一下!!
作者: laieven    時間: 2015-9-14 10:25

回復 2# GBKEE


   


請問能否告知大概的撰寫邏輯
我想了一天~~還是不能理解

用dde串聯到excel~~使用calculate如何偵測"成交單總量的變動"
假設目前
單筆成交量為1口~~成交總量為100口
又一筆成交單為1口~~成交總量為101口

成交量沒變~~但成交總量改變!!!
我該如何撰寫去監看這樣的狀況並將之設定為我想要移動的狀態
懇請協助!!!感謝!!!
作者: GBKEE    時間: 2015-9-14 11:15

回復 8# laieven

[attach]21973[/attach]

[attach]21972[/attach]

請模擬在 模擬DEE![A2]  輸入成交量
模擬DEE [工作表模組]  的程式碼
  1. Option Explicit
  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3.     With Target.Cells(1)
  4.         If .Address(0, 0) = "A2" Then [b2] = [b2] + .Cells
  5.     End With
  6. End Sub
複製代碼
DEE紀錄 [工作表模組]  的程式碼
  1. Option Explicit
  2. Dim 總成交量 As Integer
  3. Private Sub Worksheet_Calculate()
  4.     If IsError([b2]) Then Exit Sub      'dee 軟體在開盤前重整時會傳回錯誤值
  5.     If Time <= #9:00:00 AM# Then Exit Sub '開盤前不理會
  6.     If 總成交量 <> [E2].Value Then
  7.         Application.EnableEvents = False
  8.         With [C65536].End(xlUp).Offset(1)
  9.             .Cells(1, 1) = Time
  10.             .Cells(1, 2) = [D2]
  11.             .Cells(1, 3) = [E2]
  12.         End With
  13.         總成交量 = [E2]
  14.         Application.EnableEvents = True
  15.     End If
  16. End Sub
複製代碼

作者: laieven    時間: 2015-9-14 11:55

回復 9# GBKEE


感謝GBKEE兄無私的協助
我又爬文了一早上
下午就來研究你的幫忙
先感謝了!!!!
作者: laieven    時間: 2015-9-15 09:07

回復 9# GBKEE


   原理我大致上了解了!!
按版大的規畫我先試運行一下!
但串接DDE之後
把A2儲存格指定為串接進來的DDE
似乎無法觸發~~手動輸入才可觸發
還請板大協助看一下有何異樣之處!!感謝!!!
[attach]21981[/attach]
作者: GBKEE    時間: 2015-9-15 09:51

回復 11# laieven


   [attach]21982[/attach]
作者: laieven    時間: 2015-9-15 11:04

回復 12# GBKEE


    原來我搞錯!!!修正一下!!
但~~好像有點問題!!!還請看一下!
[attach]21983[/attach]

[attach]21984[/attach]
作者: GBKEE    時間: 2015-9-15 11:14

回復 13# laieven
  1. Integer 資料型態Integer 變數係以範圍為 -32,768 到 32,767 之 16 位元 (2 個位元組) 數字的形式儲存。Integer 的型態宣告字元是百分比符號(%)。
複製代碼
  1. Single 資料型態Single (單精度浮點數) 變數係以 IEEE 32 位元 (4 個位元組) 浮點數字的形式儲存,它的範圍在負數的時候是從 -3.402823E38 到 -1.401298E-45,而在正數的時候是從 1.401298E-45 到 3.402823E38。Single 的型態宣告字元為 !。
複製代碼
Integer 不夠用 修改一下
  1. Dim總成交量 As Single
複製代碼

作者: laieven    時間: 2015-9-15 11:33

本帖最後由 laieven 於 2015-9-15 11:43 編輯

回復 14# GBKEE


    原來如此~~難怪會出現"溢出"的訊息

那請問~~
1.為何DDE記錄這邊為何好像沒有 觸發紀錄呢?
2.DDE紀錄的RC儲存格是TIME沒錯吧!!為何他一直顯示是2點多?而不是現在的系統時間呢?
3.Application.EnableEvents======>我查了一下說明---事件都已經啟用指定的物件!!能不能解釋一下
作者: GBKEE    時間: 2015-9-15 11:49

那請問~~
1.為何DDE記錄這邊為何好像沒有 觸 ...
laieven 發表於 2015/9/15 11:33

你看看有沒有在執行 Worksheet_Calculate
  1. Option Explicit
  2. Dim 總成交量 As Single
  3. Private Sub Worksheet_Calculate()
  4.     If IsError([b2]) Then Exit Sub      'dee 軟體在開盤前重整時會傳回錯誤值
  5.     If Time <= #8:45:00 AM# Then Exit Sub  '開盤前不理會
  6.     If 總成交量 <> [E2].Value Then
  7.         Application.EnableEvents = False
  8.         Stop  '程式暫停在這裡 按F8逐步執行程式碼.
  9.         'Stop 給你觀察 DDE記錄有觸發紀錄,程式正常後,刪掉它
  10.         With [C65536].End(xlUp).Offset(1)
  11.             .Cells(1, 1) = Time
  12.             .Cells(1, 2) = [D2]
  13.             .Cells(1, 3) = [E2]
  14.         End With
  15.         總成交量 = [E2]
  16.         Application.EnableEvents = True
  17.     End If
  18. End Sub
複製代碼

作者: laieven    時間: 2015-9-15 12:28

回復 16# GBKEE


運作正常~~~~~@_@
我該給你幾個讚呢?感謝
另外我該怎麼將10口以上以及10口以下的成交單分開
並每1分鐘加總一次呢?
作者: GBKEE    時間: 2015-9-15 13:49

回復 17# laieven
'?? 10口以上的位置  自己設
'?? 10口以下的位置  自己設
  1. If 總成交量 <> [E2].Value Then
  2.         Application.EnableEvents = False
  3.         If 成交單 >= 10 Then
  4.             With [??].End(xlUp).Offset(1) '?? 10口以上的位置
  5.                 .Cells(1, 1) = Time
  6.                 .Cells(1, 2) = [成交單]
  7.             End With
  8.         Else
  9.             With [??].End(xlUp).Offset(1) '?? 10口以下的位置
  10.                 .Cells(1, 1) = Time
  11.                 .Cells(1, 2) = [成交單]
  12.             End With
  13.         End If
  14.         總成交量 = [E2]
  15.         Application.EnableEvents = True
  16.     End If
複製代碼

作者: laieven    時間: 2015-9-15 16:47

回復 18# GBKEE


了解了!!
感謝版主幫忙!
收下研究明天開盤來測試一下!
感謝!
作者: laieven    時間: 2015-9-16 09:20

回復 9# GBKEE


    請問是否要定義一下"成交單"因為出現!!
[attach]21997[/attach]
我把大單位置擺在i~~~小單位置擺在j
是不是把成交單定義成
i2和j2呢?
作者: GBKEE    時間: 2015-9-16 09:33

回復 20# laieven
我也沒有成交單  
[成交單]-你須自己修改為工作表上DEE成交單的位置
作者: laieven    時間: 2015-9-16 10:04

回復 18# GBKEE


    我找到原因並做出一點修正了!!!
還請板大協助指導我修正一下~~感謝!
[attach]21998[/attach]
作者: laieven    時間: 2015-9-16 12:24

回復 22# laieven


更正一下!!
截至目前為止
已找到解決之道~~萬分感謝版主的幫忙!!
接下來我先進行初步的修正
希望別再出現太大問題!!
先在這裡感謝相助的大大們
尤其是G版主!!!
感謝!!!
作者: laieven    時間: 2015-9-16 13:37

回復 21# GBKEE


GBKEE版主我又來麻煩妳了
整體成是我已經改的差不多了!!
現在有一個比較弔詭的問題請教你
我把大單小丹分開來之後,每一分鐘紀錄一次累計成交量
然後每一分鐘去扣除上一分鐘的累計量得到每分鐘的成交單量
並每一分鐘紀錄一次

可是當我使用每分鐘扣除上一分鐘的設定時
程式卻當掉了

弔詭的是~~~~大單每分鐘扣除上一分鐘沒問題~~小單每分鐘扣除上一分鐘會當掉
更弔詭的是兩邊只有一邊可以順利扣除~~不能同時都做這樣的設定

能幫我看看到底哪裡出問題了嗎?
感謝你!!!
[attach]22002[/attach]

附件如下
[attach]22003[/attach][attach]22003[/attach]
作者: GBKEE    時間: 2015-9-16 15:49

本帖最後由 GBKEE 於 2015-9-16 17:01 編輯

回復 24# laieven

試試看


[attach]22005[/attach]
作者: laieven    時間: 2015-9-18 13:23

回復 25# GBKEE


檔案可運作~~非常感謝~~~但結果跟我要的方向似有不同
我希望能達到的目標是
希望能計算出每一分鐘
大單成交幾口
小單成交幾口
紀錄上必須按分鐘紀錄~我才能將之圖形化
所以我才計算每分鐘大單累計量以及小單累計量
並用每分鐘大單的累計量扣除上一分鐘大單的累計量~~來得到每分鐘大單成交口數為幾口

成功後我將應用到內外盤成交變動去計算
大單每分鐘買幾口買幾口賣幾口
小單每分鐘買幾口買幾口賣幾口
藉以區分出
小單(一般人)每一分鐘內盤成交幾口外盤成交幾口~大單(大咖)每一分鐘內盤成交幾口外盤成交幾口

若版主願意協助我修正我將萬分感謝
我個人也將繼續努力的修正我的錯誤和繼續努力!!!
作者: GBKEE    時間: 2015-9-19 06:08

本帖最後由 GBKEE 於 2015-9-21 05:43 編輯

回復 26# laieven
你附檔00000002.xlsm 的程式碼
  1. Option Explicit
  2. Dim 總成交量 As Single
  3. Private Sub Worksheet_Calculate()
  4.     Dim startTime, stopTime
  5.     Dim Rng As Range, 成交單 As Range
  6.     startTime = Range("A1") '開盤時間, 例如: "09:00:00 AM"
  7.     stopTime = Range("B1")  '收盤時間, 例如: "01:30:00 PM"
  8.     If Time <= startTime Then
  9.         '清理昨日紀錄
  10.         Application.EnableEvents = False
  11.         Range(Range("A5:E5"), Range("A5:E5").End(xlDown)) = ""
  12.         Application.EnableEvents = True
  13.         Exit Sub '尚未開盤
  14.     End If
  15.     If Time > stopTime Then Exit Sub '已經收盤
  16.     If IsError([b2]) Then Exit Sub      'dee 軟體在開盤前重整時會傳回錯誤值
  17.     Set 成交單 = [G2]
  18.     Application.EnableEvents = False
  19.     With [A65536].End(xlUp)
  20.         If Format(.Cells, "HH:MM") <> Format(Time, "HH:MM") Then
  21.             'dde紀錄工作表上,要有一個DEE的時間公式,引發這 Calculate 重算事件
  22.             Set Rng = .Offset(1)
  23.         Else
  24.             Set Rng = .Cells
  25.         End If
  26.     End With
  27.     With Rng
  28.         .Cells = Format(Time, "HH:MM")  '在A欄中記下每一分鐘 , 不管有無成交
  29.         If 總成交量 <> [H2].Value Then
  30.             If 成交單 >= 10 Then
  31.                 .Range("B1") = .Range("B1") + 成交單
  32.             Else
  33.                 .Range("D1") = .Range("D1") + 成交單
  34.             End If
  35.             總成交量 = [H2]
  36.         End If
  37.         '這分鐘 -上一分鐘
  38.         If .Cells.Row > 5 Then
  39.             .Range("C1") = .Range("B1") - .Range("B1").Offset(-1)
  40.             .Range("E1") = .Range("D1") - .Range("D1").Offset(-1)
  41.         Else
  42.             .Range("C1") = .Range("B1")
  43.             .Range("E1") = .Range("D1")
  44.         End If
  45.     End With
  46.     Application.EnableEvents = True
  47. End Sub
複製代碼





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