Board logo

標題: 請問此功能有其他的方式解決嗎? [打印本頁]

作者: 藍天麗池    時間: 2024-1-2 21:32     標題: 請問此功能有其他的方式解決嗎?

本帖最後由 藍天麗池 於 2024-1-2 21:33 編輯

請教版上前輩,我目前有個VBA用來記錄期貨數據,其功能為成交量有變動就紀錄,然後我去做計算,目前是用成交量有變動就紀錄的方式去寫,但期貨的跳動速度很快(有時候1秒會寫入6-8筆的資料),從開盤到收盤會寫入大量的資料

       目前我的VBA的運作如下(A1的值是券商DDE得來的,大概就如同我附件那樣)
       A1 10
       A2 15      B2 = A2-A1 =5
       A3 18      B3 = A3-A2 =3
       A4 20                   .
       A5 25                   .
            .                        .
            .                        .
        依次下去       依次下去

因為我抓的資料不少所以資料有點大,目前是先將資料都先記錄下來,再求差,導致運算速度變慢,所以想請教版上前輩,我上述的需求如果不用變動寫入的方式去求差,有其他的解決方式嗎?
作者: Andy2483    時間: 2024-1-3 07:46

回復 1# 藍天麗池


    謝謝前輩發表此主題與範例
前輩敘述的情境與範例不一樣,可以再補充一下?
[attach]37222[/attach]
作者: 藍天麗池    時間: 2024-1-3 20:40

回復 2# Andy2483
主要就是不要用紀錄的方式求差值,想了解有無其他方式

隨時間推進B、C欄會有值一直寫進去,然後再求B3-B2、B4-B3......一直下去

詳細說就是假設B2在84500(時間)的值是252,84501的值是300,我想要求差值300-252,但不想用紀錄的方式求差值要如何做呢?
作者: Andy2483    時間: 2024-1-4 09:35

回復 3# 藍天麗池


    謝謝前輩回復
後學很想學DDE, Worksheet.Calculate 事件 (Excel) 怎麼應用
工作領域不在這區塊,尚未研究,請前輩稍等其他厲害的前輩幫忙
作者: Andy2483    時間: 2024-1-4 10:35

本帖最後由 Andy2483 於 2024-1-4 14:23 編輯

回復 3# 藍天麗池


    謝謝前輩
後學學習 Private Sub Worksheet_Calculate()方案如下,請前輩參考
模擬結果:
[attach]37248[/attach]
範例檔:
[attach]37249[/attach]
作者: hcm19522    時間: 2024-1-4 13:38

=SUMPRODUCT(N(OFFSET(A1,LOOKUP(1,0/(A:A<>""),ROW(A:A))-{1,2},))*{1,-1})
作者: 藍天麗池    時間: 2024-1-4 14:49

回復 6# hcm19522

請教前輩這是用函數的方式來解?能幫我解釋一下嗎?有點看不懂,感謝
作者: 藍天麗池    時間: 2024-1-4 14:50

回復 5# Andy2483
我回家試試看,再跟你說結果
作者: 藍天麗池    時間: 2024-1-4 20:24

本帖最後由 藍天麗池 於 2024-1-4 20:29 編輯

回復 5# Andy2483


    Andy,感謝你的回覆,但你好像誤解我的意思了,你以下的程式碼還是需要把總委賣跟總委賣往下寫才能去相減得出差,這樣如果我有20個總委買賣的資料就會有40欄,資料量會很大
   [F2] = [B2] - Cells(Rows.Count, 2).End(3)
   [G2] = [C2] - Cells(Rows.Count, 3).End(3)

我要的結果是我往下寫的值只留差值,如同我在附件幫你標示的樣子[attach]37251[/attach]
作者: Andy2483    時間: 2024-1-4 20:27

回復 9# 藍天麗池


    謝謝前輩回覆
明天再下載來研究看看
作者: singo1232001    時間: 2024-1-5 01:13

本帖最後由 singo1232001 於 2024-1-5 01:20 編輯

回復 1# 藍天麗池


    [attach]37253[/attach]
access  跟 excel 要放在同一資料夾下


access 可以打開來看 按F5刷新
不同股票可以自建選擇不同資料表 欄位六欄 NO,A,B,C,D,E
NO會自動編號  E欄是放建檔日時間而已
ABCD放你的資料
若用excel 看 可以問GPT語法 輸入B1欄


要再更強 就安裝ms sql八
access至少存讀資料應該比excel 快1~5倍 但我對部分測試不深

按下定時啟動access按鈕 應該就能執行了
但因為手邊沒dde
所以都用預判的
我只擔心 Worksheet_Calculate 沒作動
作者: 藍天麗池    時間: 2024-1-5 09:12

回復 11# singo1232001


    前輩感謝你,但跟我的需求好像不太一樣,且我對access也不太熟,感謝回復
作者: singo1232001    時間: 2024-1-5 09:20

回復 12# 藍天麗池


    需求應該沒錯喔
作者: hcm19522    時間: 2024-1-5 10:05

回復 7# 藍天麗池


    LOOKUP(1,0/(A:A<>""),ROW(A:A))找整欄最後非空白--> -{1,2}是往上找1  2數值-->*{1,-1}一正一負-->相加成差值
作者: singo1232001    時間: 2024-1-5 10:45

本帖最後由 singo1232001 於 2024-1-5 10:52 編輯

回復 12# 藍天麗池


    幾個問題點要小心
1.因為你的選項設定上  公式部分 要選自動  不然DDE 不會變更 (也可能是open巨集改的)
我把DDE刷新頻率先改成預設 (刪除掉open 跟close)

2.再一開始更新連結會出現問題
因為我沒有先測試是否為數字 已修正[attach]37259[/attach]

基本上 我記得一天的跳動下 加上excel的效能 累積資料的情況下
沒改用access 應該掛4~5小時 就會卡了
跳動大的一天就3000~5000筆了
假設1分鐘跳20次  1小時1200   4小時就4800  
若你C欄用公式A-B 應該中午吃飽飯  回家就卡了

用access可以避開上述所有問題
若資料表(一股一表)開的多
一天要存10幾檔的完整資料都沒問題
作者: 藍天麗池    時間: 2024-1-5 13:40

回復 15# singo1232001


    前輩感謝,用EXCEL+ACCESS的方式我不熟,所以就先不考慮了
作者: 藍天麗池    時間: 2024-1-5 13:47

本帖最後由 藍天麗池 於 2024-1-5 13:51 編輯

回復 14# hcm19522


    前輩感謝回復,可是前輩好像誤會我的意思了,看你的函數好像也是要將數值記錄下來才能去做運算得差值

    我想問的是有無不將值紀錄然後直接得差值的方法,結果大約像我附件那樣[attach]37260[/attach]
作者: Andy2483    時間: 2024-1-5 14:47

或許 同一個儲存格裡有指數連接間隔符號 再連接變動量,這樣的方式可以符合需求,例如:
120__0
123__3
125__2
126__1
這樣的方式不增加欄位,又能兩種數據都看得到又能保留
作者: 藍天麗池    時間: 2024-1-5 16:52

回復 18# Andy2483

可是如果差值的數據要再做運算也是要多拆一欄出來做資料的處理
作者: Andy2483    時間: 2024-1-5 20:45

回復 19# 藍天麗池

[B6]=[B2]&"__"& [B2] -Val( [B5])
這樣的方式就可以不必多一欄 舉例如下:
B2是變動總委買

B1 總委買
B2  126
B3. 120__0
B4. 123__3
B5. 125__2
B6. 126__1
作者: 藍天麗池    時間: 2024-1-5 21:09

回復 20# Andy2483


    可是假設我要後面的差去做運算,也是要拆一欄放數據才能做運算
作者: Andy2483    時間: 2024-1-5 21:15

回復 21# 藍天麗池
要運用變動量做運算只要用
Split([B6],"__")(1)  就可以取得了 不必拆一欄喔
作者: 藍天麗池    時間: 2024-1-5 21:25

回復 22# Andy2483


    Andy請教你能給我個完整的程式我星期一試試看嗎?
作者: Andy2483    時間: 2024-1-5 21:36

回復 23# 藍天麗池
我媽媽住院要到下星期三,不方便處理
如果具體的變動量要做什運算如果能夠具體說明或上傳更完整的範例
版上高手雲集也都能與前輩做交流
作者: 藍天麗池    時間: 2024-1-5 22:08

回復 24# Andy2483


    好,感謝
作者: 藍天麗池    時間: 2024-1-6 20:41

回復 24# Andy2483

         Andy再跟你請教一下,我原本是的想法是B1放資料來源,C1當輔助格,A1=C1-B1,然後程式寫成當B1<>C1的時候將B1的值複製到C1然後相減,之後幫A1有變動在往下紀錄,後來發現這樣做值會相等,相減會一直等於0,有沒有類似我說的這種方式的寫法呢?
作者: Andy2483    時間: 2024-1-6 22:20

回復 26# 藍天麗池
如果是這種邏輯我覺得
1.A1如果是為了顯示最後的差值,就不要再用公式計算,因爲B1值換位到C1時A1公式值都是0,A1值改由VBA給值
2. VBA裡寫:
如果跳動的B1<>C1,就令A1=B1-C1,再令C1=B1,這樣的方式只有B1變動時if 判斷式才會成立,且A1也不會是0
最後把A1值也填入A欄的第一個空白格
作者: 藍天麗池    時間: 2024-1-7 10:36

回復 27# Andy2483


    好的,感謝
作者: 准提部林    時間: 2024-1-7 16:47

沒法使用DDE, 只能另寫模擬程序, 套用時要自己去改//
[attach]37261[/attach]
作者: 藍天麗池    時間: 2024-1-8 22:42

回復 27# Andy2483


    Andy,請教一下,我照你的方式改了之後會出現堆疊空間不足的問題,能幫我看一下問題出在哪嗎?[attach]37263[/attach]
作者: singo1232001    時間: 2024-1-9 08:05

回復 11# singo1232001


     修正一堆bug
可以玩玩
excel 跟acces 須放在同資料夾下
[attach]37265[/attach]
1.啟動匯入access紀錄  
2.啟動模擬DDE
3.查詢資料可以根據語法表查詢 列出不同的資料
作者: 藍天麗池    時間: 2024-1-9 08:34

回復 29# 准提部林


         感謝前輩回復,但我開這帖主要是想了解不記錄原始資料去求差的方式,但看前輩的程式好像也是要將資料來源記錄下來再去做運算
另外,我有試著修改我的程式,但出現堆疊空間不足的訊息,能請前輩幫忙看看是哪裡出問題嗎?[attach]37266[/attach]
作者: Andy2483    時間: 2024-1-9 10:38

本帖最後由 Andy2483 於 2024-1-9 11:12 編輯

回復 30# 藍天麗池


    可能是數據變動太快運算不及
實際需求是幾秒要記錄一次?
間隔時間到才運算

Option Explicit
Private Sub Worksheet_Calculate()
If Val(Format([A1], "SS")) Mod 3 = 0 Then'間隔3秒
   Call RecordPrice
   Call Price
End If
End Sub
作者: singo1232001    時間: 2024-1-9 12:32

本帖最後由 singo1232001 於 2024-1-9 12:34 編輯

回復 31# singo1232001


    [attach]37267[/attach]

因為excel 會卡
所以對於dde 我都只用access (就算用上arraylist  一樣卡)
先玩玩看這版超好玩

顯示筆數那�� 可能要按兩次
作者: singo1232001    時間: 2024-1-9 12:38

本帖最後由 singo1232001 於 2024-1-9 12:39 編輯

回復 33# Andy2483


    dde 快的時候很快 1秒3~5次
慢的時候很慢 1分鐘2~3次

平均 一分鐘20~30次
一小時800~1500次
一早盤約3000~5000次
作者: Andy2483    時間: 2024-1-9 13:23

回復 35# singo1232001


    謝謝前輩
羨慕前輩可以有很多軟體可以學習,後學不懂DDE,只是趁此機會多學習
作者: 藍天麗池    時間: 2024-1-9 13:36

回復 33# Andy2483

需要隨時記錄,我主要是要紀錄f14-f18,k14-k18
有其他的寫法可以有同樣的效果嗎?
作者: Andy2483    時間: 2024-1-9 16:14

回復 37# 藍天麗池


    好難!猜著改改看
[attach]37268[/attach]
作者: 藍天麗池    時間: 2024-1-9 20:28

本帖最後由 藍天麗池 於 2024-1-9 20:40 編輯

回復 38# Andy2483

剛剛試了一下可以運作,但不知道紀錄的量會不會有誤差,要明天測試才知道
這個程式碼主要的功用是啥啊?加上去就能運作了,好酷Application.EnableEvents = False
Andy有空能跟我解釋一下Application.EnableEvents = False的功用嗎?
作者: Andy2483    時間: 2024-1-9 20:56

回復 39# 藍天麗池
1.會不會有誤差不知道,後學只試著讓執行,裡面的邏輯計算沒研究
2.兩個副程式對調
3.Application.EnableEvents = False 是為了不讓執行的過程連續再觸發
作者: 藍天麗池    時間: 2024-1-9 21:23

回復 40# Andy2483


    我明天是是在跟你說結果
作者: Andy2483    時間: 2024-1-10 09:08

回復 29# 准提部林


    謝謝論壇,謝謝前輩設計指導此範例
後學藉此帖學習到以全域變數 uMode%, xMode%, Tm 控制無限迴圈
[attach]37269[/attach]




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