Board logo

標題: [發問] 請教如何修改程式來提高執行效率呢? [打印本頁]

作者: 藍天麗池    時間: 2024-1-16 09:52     標題: 請教如何修改程式來提高執行效率呢?

本帖最後由 藍天麗池 於 2024-1-16 09:59 編輯

        版上前輩,附件附上一個檔案,其主要功能是用來記錄數值的變動
[attach]37294[/attach]
        其程式分兩部分 1.K12<>L12,將J5:M10的數值複製到J14:M19,I14-I18跟N14-N18是將J5-M10跟J14:M19相加減得出(主要就是讓現值跟變動前的值做相加減),然後我主要是要求I14-I18跟N14-N18的數值
                           
                          2.B2=I14-I18的值相加,C2=N14-N18的值相加,然後一直往下紀錄

        目前執行這個程式發現程式在執行上不效率不好,資料來源是券商DDE,其資料來源有時候可能內變動6-8次,但我執行程式後,所記錄下來的資料同個時間大多在大多在2-3筆居多,想請教一下版上前輩,我的程式要如何修改才能提升其效率呢?

[attach]37295[/attach]

作者: Andy2483    時間: 2024-1-17 13:59

回復 1# 藍天麗池


如果沒有這些數值運算 前輩的EXCEL可以記錄到每秒6~8筆記錄嗎?
作者: 藍天麗池    時間: 2024-1-17 22:27

回復 2# Andy2483


    對,就是因為這些運算才導致效率變差
作者: Andy2483    時間: 2024-1-18 07:14

本帖最後由 Andy2483 於 2024-1-18 07:30 編輯

回復 3# 藍天麗池


    請教前輩:
1.範例工作表模組裡沒有Call Price,它需要執行嗎? 原程式碼如下:
Option Explicit
Private Sub Worksheet_Calculate()
Call RecordPrice
End Sub

2.下圖黃色區域儲存格值取消,只做A到E欄的結果值記錄可以嗎? 還是黃色區域儲存格值一定要存在並隨DDE變動?
因為這些黃色區域儲存格值變化可能會影響效能,如果在VBA計算這些值後寫入A到E欄可能比較快
[attach]37300[/attach]
作者: 藍天麗池    時間: 2024-1-18 14:06

本帖最後由 藍天麗池 於 2024-1-18 14:16 編輯

回復 4# Andy2483
1.可以刪除
2.a-e的數值就是黃色部分計算所得,如果黃色部分沒有,要如何得出a-e的值?
裡面黃色部分都可以不要,唯獨j5-m10是資料來源,我不知道是否有其他方法可以得出a-e的值
作者: Andy2483    時間: 2024-1-18 14:11

本帖最後由 Andy2483 於 2024-1-18 14:17 編輯

回復 5# 藍天麗池


範例工作表模組裡沒有Call Price,它需要執行嗎?

a-e的數值就是黃色部分計算所得,如果黃色部分沒有,要如何得出a-e的值?
在陣列/變數/字典經運算或許可以得到A~E

例如:
Option Explicit
Public Z, BBS(1 To 5), BB(1 To 5), BA(1 To 5), BAS(1 To 5), FBS, FAS
Sub 時間()
[A1] = WorksheetFunction.Text(Now(), "hh:mm:ss")
Application.OnTime Now() + TimeValue("00:00:01"), "時間"
If Not IsObject(Z) Then
   Set Z = CreateObject("Scripting.Dictionary")
   BBS(1) = "XQTISC|Quote!'FITXN*1.TF-BestBidSize1'"
   BBS(2) = "XQTISC|Quote!'FITXN*1.TF-BestBidSize2'"
   BBS(3) = "XQTISC|Quote!'FITXN*1.TF-BestBidSize3'"
   BBS(4) = "XQTISC|Quote!'FITXN*1.TF-BestBidSize4'"
   BBS(5) = "XQTISC|Quote!'FITXN*1.TF-BestBidSize5'"
   
   BB(1) = "=XQTISC|Quote!'FITXN*1.TF-BestBid1'"
   BB(2) = "=XQTISC|Quote!'FITXN*1.TF-BestBid2'"
   BB(3) = "=XQTISC|Quote!'FITXN*1.TF-BestBid3'"
   BB(4) = "=XQTISC|Quote!'FITXN*1.TF-BestBid4'"
   BB(5) = "=XQTISC|Quote!'FITXN*1.TF-BestBid5'"
   
   BA(1) = "=XQTISC|Quote!'FITXN*1.TF-BestAsk1'"
   BA(2) = "=XQTISC|Quote!'FITXN*1.TF-BestAsk2'"
   BA(3) = "=XQTISC|Quote!'FITXN*1.TF-BestAsk3'"
   BA(4) = "=XQTISC|Quote!'FITXN*1.TF-BestAsk4'"
   BA(5) = "=XQTISC|Quote!'FITXN*1.TF-BestAsk5'"
   
   BAS(1) = "=XQTISC|Quote!'FITXN*1.TF-BestAskSize1'"
   BAS(2) = "=XQTISC|Quote!'FITXN*1.TF-BestAskSize2'"
   BAS(3) = "=XQTISC|Quote!'FITXN*1.TF-BestAskSize3'"
   BAS(4) = "=XQTISC|Quote!'FITXN*1.TF-BestAskSize4'"
   BAS(5) = "=XQTISC|Quote!'FITXN*1.TF-BestAskSize5'"
   
   FBS = "=XQTISC|Quote!'FITXN*1.TF-FiveBidSize'"
   FAS = "=XQTISC|Quote!'FITXN*1.TF-FiveAskSize'"
End If
End Sub
作者: 藍天麗池    時間: 2024-1-18 14:18

回復 6# Andy2483
Andy能寫個大概我去執行看看嗎?不然你這樣說我也不太清楚,能不能還是要執行後才能確定
作者: Andy2483    時間: 2024-1-18 14:19

本帖最後由 Andy2483 於 2024-1-18 14:21 編輯

回復 7# 藍天麗池


    範例工作表模組裡沒有Call Price,它需要執行嗎?
裡面有程式 Sub Price() 但又沒被 Call Price
I14-I18跟N14-N18的數值又跟它有關
作者: 藍天麗池    時間: 2024-1-18 14:22

回復 8# Andy2483
可以刪除
作者: 藍天麗池    時間: 2024-1-18 14:22

本帖最後由 藍天麗池 於 2024-1-18 14:25 編輯

回復 8# Andy2483
另外andy,請教一下,我黃色部分i14到i18是有用到if去做判別,然後才做數字運送,但你上面貼的程式碼也有做判別然後運算的功能?
作者: Andy2483    時間: 2024-1-18 14:25

本帖最後由 Andy2483 於 2024-1-18 14:27 編輯

回復 9# 藍天麗池


    [B2]=I14+I15+I16+I17+I18
這跟Sub Price() 有關係,又說可以刪除,有矛盾
是否有新的範例檔
作者: 藍天麗池    時間: 2024-1-18 14:29

回復 8# Andy2483
抱歉,有price,我用手機回的,沒看到附件,price內容就是執行黃色上面部分的複製,複製到下面,然後去做運送阿,我的附件裡面沒有嗎?還是我誤刪了
作者: Andy2483    時間: 2024-1-18 14:30

回復 10# 藍天麗池


i14到i18是有用到if去做判別,然後才做數字運送
沒有看到 做數字運送的公式或程式碼
作者: 藍天麗池    時間: 2024-1-18 14:32

回復 13# Andy2483

抱歉,我人在外面,無法開檔案,我回去後再跟你確認,感謝你
作者: Andy2483    時間: 2024-1-18 14:33

回復 12# 藍天麗池

有程式碼,但是不會被執行,因為少了 Call Price,所以要確定一下正確程式碼是如何運作
Option Explicit
Private Sub Worksheet_Calculate()
Call RecordPrice
End Sub
作者: 藍天麗池    時間: 2024-1-18 14:36

回復 15# Andy2483
那應該是誤刪了,要加回去
作者: Andy2483    時間: 2024-1-18 14:38

回復 16# 藍天麗池


    所以是這樣嗎?
Option Explicit
Private Sub Worksheet_Calculate()
Call Price
Call RecordPrice
End Sub
作者: 藍天麗池    時間: 2024-1-18 14:39

回復 15# Andy2483

我原本的程式運作就是當黃色上半部有變動,將上半部複製到下半部,然後求出i跟n那邊的值,然後同時連動到b2跟c2然後一直向下紀錄
作者: 藍天麗池    時間: 2024-1-18 14:40

回復 17# Andy2483


作者: Andy2483    時間: 2024-1-18 14:42

本帖最後由 Andy2483 於 2024-1-18 14:43 編輯

回復 18# 藍天麗池


    就因為有計算過才記錄,所以要問清楚,前輩上傳的範例沒有執行計算黃色區域部分,現在知道了
我試試看想法能不能實現
作者: 藍天麗池    時間: 2024-1-18 14:43

回復 20# Andy2483

應該是誤刪,不好意思
作者: Andy2483    時間: 2024-1-18 15:02

回復 21# 藍天麗池


[J23]值是 2 是固定的嗎? 還是變動的?
[J23:J27] [M23:M27] 值都被引用,但是都沒有被程式變動其值,所以是固定值嗎?
作者: 藍天麗池    時間: 2024-1-18 15:33

本帖最後由 藍天麗池 於 2024-1-18 15:35 編輯

回復 22# Andy2483
J23到m27的值不用管,那個只是我為了測試不同變動速度,程式是否能執行的更有效率用的,d2的值我常會用不同的變動速度去取代,用來觀察效率,一般d2的值是k10+L10
作者: Andy2483    時間: 2024-1-18 15:39

本帖最後由 Andy2483 於 2024-1-18 16:22 編輯

回復 23# 藍天麗池


所以D2的值用 =k10+L10 計算?
這樣就單純多了
作者: 藍天麗池    時間: 2024-1-18 21:35

回復 24# Andy2483


    所以Andy有甚麼想法了嗎?
作者: Andy2483    時間: 2024-1-18 21:51

回復 25# 藍天麗池


    有規劃好了,明天再繼續實現看看
還有一點想請教A2到E2可以不要寫入,只寫入在最後列嗎?
因為每次寫入儲存格都會需要時間

我想設計用VBA的陣列記錄10列再寫入A-E欄的後方,適合嗎?
作者: 藍天麗池    時間: 2024-1-18 22:42

本帖最後由 藍天麗池 於 2024-1-18 22:53 編輯

回復 26# Andy2483


不要寫入?我記錄後會將記錄的值再做運算,沒紀錄能在運算嗎?
我B欄跟C欄的值會每分鐘(這就是我A欄要記錄時間的原因)再做計算,沒紀錄的話我就無法運算,所以我不太懂你的不要寫入指的是啥意思
作者: 藍天麗池    時間: 2024-1-18 22:51

回復 26# Andy2483


    其實你不用管我範例也無妨,之前不丟範例就是怕版上的人被範例的思維帶著走
我要的重點很簡單,資料源是J5-M10,將J5-M10變動後的差值記錄下來做運算,僅此而已
作者: Andy2483    時間: 2024-1-19 09:42

本帖最後由 Andy2483 於 2024-1-19 10:02 編輯

回復 28# 藍天麗池


    謝謝論壇,謝謝前輩耐心的等待,後學藉此帖學到很多知識,但不知道可不可行,我用兩個活頁簿之間的公式做測試每秒可以記錄300列,DDE沒用過,請前輩試試看,計算邏輯可能需要視需求調整,沒有研究這些計算的意義
使用的方法是只留[B1]裡有公式,這公式只是為了讓程式收到DDE變動值觸動 Private Sub Worksheet_Calculate() ,公式是所有DDE值相加的和而已 沒什麼意義 其他由VBA執行,字典key當變數,item當計算值
[attach]37307[/attach]

[attach]37306[/attach]

工作表模組:
Option Explicit
Private Sub Worksheet_Calculate()
Call Price
End Sub

一般模組:
Option Explicit
Public Z, BBS(1 To 5), BB(1 To 5), BA(1 To 5), BAS(1 To 5), FBS$, FAS$, E_2$, TT$, A(1 To 1, 1 To 5), j%
Sub Price()
If Not IsObject(Z) Then'一開始的[B1]公式建立
   Set Z = CreateObject("Scripting.Dictionary")
   BBS(1) = "=XQTISC|Quote!'FITXN*1.TF-BestBidSize1'"
   BBS(2) = "=XQTISC|Quote!'FITXN*1.TF-BestBidSize2'"
   BBS(3) = "=XQTISC|Quote!'FITXN*1.TF-BestBidSize3'"
   BBS(4) = "=XQTISC|Quote!'FITXN*1.TF-BestBidSize4'"
   BBS(5) = "=XQTISC|Quote!'FITXN*1.TF-BestBidSize5'"
   
   BB(1) = "=XQTISC|Quote!'FITXN*1.TF-BestBid1'"
   BB(2) = "=XQTISC|Quote!'FITXN*1.TF-BestBid2'"
   BB(3) = "=XQTISC|Quote!'FITXN*1.TF-BestBid3'"
   BB(4) = "=XQTISC|Quote!'FITXN*1.TF-BestBid4'"
   BB(5) = "=XQTISC|Quote!'FITXN*1.TF-BestBid5'"
   
   BA(1) = "=XQTISC|Quote!'FITXN*1.TF-BestAsk1'"
   BA(2) = "=XQTISC|Quote!'FITXN*1.TF-BestAsk2'"
   BA(3) = "=XQTISC|Quote!'FITXN*1.TF-BestAsk3'"
   BA(4) = "=XQTISC|Quote!'FITXN*1.TF-BestAsk4'"
   BA(5) = "=XQTISC|Quote!'FITXN*1.TF-BestAsk5'"
   
   BAS(1) = "=XQTISC|Quote!'FITXN*1.TF-BestAskSize1'"
   BAS(2) = "=XQTISC|Quote!'FITXN*1.TF-BestAskSize2'"
   BAS(3) = "=XQTISC|Quote!'FITXN*1.TF-BestAskSize3'"
   BAS(4) = "=XQTISC|Quote!'FITXN*1.TF-BestAskSize4'"
   BAS(5) = "=XQTISC|Quote!'FITXN*1.TF-BestAskSize5'"
   
   FBS = "=XQTISC|Quote!'FITXN*1.TF-FiveBidSize'"
   FAS = "=XQTISC|Quote!'FITXN*1.TF-FiveAskSize'"
   E_2 = "=VALUE(HOUR(NOW())&IF(LEN(MINUTE(NOW()))=1,0&MINUTE(NOW()),MINUTE(NOW()))&IF(LEN(SECOND(NOW()))=1,0&SECOND(NOW()),SECOND(NOW())))"
   TT = "=(" & Mid(FBS, 2) & "+" & Mid(FAS, 2)
   For j = 1 To 5
      TT = TT & "+" & Mid(BBS(j), 2) & "+" & Mid(BB(j), 2) & "+" & Mid(BA(j), 2) & "+" & Mid(BAS(j), 2)
   Next
   TT = TT & ")"
   ThisWorkbook.Sheets(1).[B1] = TT
End If
'=================================================================================
'以下是以字典key計算DDE值
Z("J5") = Evaluate(BBS(1)): Z("J6") = Evaluate(BBS(2)): Z("J7") = Evaluate(BBS(3)): Z("J8") = Evaluate(BBS(4)): Z("J9") = Evaluate(BBS(5))
Z("K5") = Evaluate(BB(1)): Z("K6") = Evaluate(BB(2)): Z("K7") = Evaluate(BB(3)): Z("K8") = Evaluate(BB(4)): Z("K9") = Evaluate(BB(5))
Z("L5") = Evaluate(BA(1)): Z("L6") = Evaluate(BA(2)): Z("L7") = Evaluate(BA(3)): Z("L8") = Evaluate(BA(4)): Z("L9") = Evaluate(BA(5))
Z("M5") = Evaluate(BAS(1)): Z("M6") = Evaluate(BAS(2)): Z("M7") = Evaluate(BAS(3)): Z("M8") = Evaluate(BAS(4)): Z("M9") = Evaluate(BAS(5))
Z("K10") = Evaluate(FBS): Z("L10") = Evaluate(FAS)

'以下是計算,應該很眼熟,只是把儲存格置換成key而已
Z("K12") = Z("K10") + Z("L10")
If Z("K12") <> Z("L12") Then
   Z("I14") = 0
   If Z("K14") = Z("K5") Then
      Z("I14") = Z("J5") - Z("J14")
      ElseIf Z("K14") = Z("K6") Then
         Z("I15") = Z("J6") - Z("J14")
   End If
   Z("I15") = 0
   If Z("K15") = Z("K5") Then
      Z("I15") = Z("J5") - Z("J15")
      ElseIf Z("K15") = Z("K6") Then
         Z("I15") = Z("J6") - Z("J15")
      ElseIf Z("K15") = Z("K7") Then
         Z("I15") = Z("J7") - Z("J15")
   End If
   Z("I16") = 0
   If Z("K16") = Z("K6") Then
      Z("I16") = Z("J6") - Z("J16")
      ElseIf Z("K16") = Z("K7") Then
         Z("I16") = Z("J7") - Z("J16")
      ElseIf Z("K16") = Z("K8") Then
         Z("I16") = Z("J8") - Z("J16")
   End If
   Z("I17") = 0
   If Z("K17") = Z("K7") Then
      Z("I17") = Z("J7") - Z("J17")
      ElseIf Z("K17") = Z("K8") Then
         Z("I17") = Z("J8") - Z("J17")
      ElseIf Z("K17") = Z("K9") Then
         Z("I17") = Z("J9") - Z("J17")
   End If
   Z("I18") = 0
   If Z("K18") = Z("K8") Then
      Z("I18") = Z("J8") - Z("J18")
      ElseIf Z("K18") = Z("K9") Then
         Z("I18") = Z("J9") - Z("J18")
   End If
   Z("N14") = 0
   If Z("L14") = Z("L5") Then
      Z("N14") = Z("M5") - Z("M14")
      ElseIf Z("L14") = Z("L6") Then
         Z("N14") = Z("M6") - Z("M14")
   End If
   Z("N15") = 0
   If Z("L15") = Z("L5") Then
      Z("N15") = Z("M5") - Z("M15")
      ElseIf Z("L15") = Z("L6") Then
         Z("N15") = Z("M6") - Z("M15")
      ElseIf Z("L15") = Z("L7") Then
         Z("N15") = Z("M7") - Z("M15")
   End If
   Z("N16") = 0
   If Z("L16") = Z("L6") Then
      Z("N16") = Z("M6") - Z("M16")
      ElseIf Z("L16") = Z("L7") Then
         Z("N16") = Z("M7") - Z("M16")
      ElseIf Z("L16") = Z("L8") Then
         Z("N16") = Z("M8") - Z("M16")
   End If
   Z("N17") = 0
   If Z("L17") = Z("L7") Then
      Z("N17") = Z("M7") - Z("M17")
      ElseIf Z("L17") = Z("L8") Then
         Z("N17") = Z("M8") - Z("M17")
      ElseIf Z("L17") = Z("L9") Then
         Z("N17") = Z("M9") - Z("M17")
   End If
   Z("N18") = 0
   If Z("L18") = Z("L8") Then
      Z("N18") = Z("M8") - Z("M18")
      ElseIf Z("L18") = Z("L9") Then
         Z("N18") = Z("M9") - Z("M18")
   End If

'以下是 [J14:M19] = [J5:M10].Value 以字典方式轉換
   Z("J14") = Z("J5"): Z("J15") = Z("J6"): Z("J16") = Z("J7"): Z("J17") = Z("J8"): Z("J18") = Z("J9"): Z("J19") = Z("J10")
   Z("L14") = Z("L5"): Z("L15") = Z("L6"): Z("L16") = Z("L7"): Z("L17") = Z("L8"): Z("L18") = Z("L9"): Z("L19") = Z("L10")
   Z("M14") = Z("M5"): Z("M15") = Z("M6"): Z("M16") = Z("M7"): Z("M17") = Z("M8"): Z("M18") = Z("M9"): Z("M19") = Z("M10")
End If

'以下是 將計算值帶入A陣列並寫入儲存格
Z("L12") = Z("K19") + Z("L19")
Z("A2") = Format(Now, "HH:MM:SS")
Z("B2") = Z("I14") + Z("I15") + Z("I16") + Z("I17") + Z("I18")
Z("C2") = Z("N14") + Z("N15") + Z("N16") + Z("N17") + Z("N18")
Z("D2") = Z("K10") + Z("L10")
Z("E2") = Evaluate(E_2)
A(1, 1) = Z("A2"): A(1, 2) = Z("B2"): A(1, 3) = Z("C2"): A(1, 4) = Z("D2"): A(1, 5) = Z("E2")
ThisWorkbook.Sheets(1).Cells(Rows.Count, "A").End(3)(2).Resize(, 5) = A
Application.EnableEvents = True
End Sub

Sub 清除()
[A3].Resize(1000000, 5).ClearContents: ActiveWindow.ScrollRow = 1
End Sub

Sub 自動重算()
Application.Calculation = xlAutomatic
End Sub

Sub 手動重算()
Application.Calculation = xlManual
End Sub
作者: 藍天麗池    時間: 2024-1-19 10:03

回復 29# Andy2483


   我下載下來了,但要如何使用阿?這個程式碼已經超出我目前能理解的範圍了
打開後點自動重算?
作者: Andy2483    時間: 2024-1-19 10:05

本帖最後由 Andy2483 於 2024-1-19 10:10 編輯

回復 30# 藍天麗池


    是 自動重算 / 停止就按 手動重算
作者: 藍天麗池    時間: 2024-1-19 11:00

回復 31# Andy2483


    [attach]37308[/attach]點開點更新就出現錯誤了
作者: Andy2483    時間: 2024-1-19 11:09

回復 32# 藍天麗池

Z("K10") = Evaluate(FBS): Z("L10") = Evaluate(FAS)
Z("K12") = Z("K10") + Z("L10")

這兩個程式碼值是來自於
FBS = "=XQTISC|Quote!'FITXN*1.TF-FiveBidSize'"
FAS = "=XQTISC|Quote!'FITXN*1.TF-FiveAskSize'"

這兩個DDE連結會每天一樣嗎?
作者: 藍天麗池    時間: 2024-1-19 11:11

回復 33# Andy2483


    會阿
作者: Andy2483    時間: 2024-1-19 11:18

回復 34# 藍天麗池


    請用以下程式碼執行看看結果是什麼或出現錯誤
Sub TEST()
MsgBox Evaluate("=XQTISC|Quote!'FITXN*1.TF-FiveBidSize'")
MsgBox Evaluate("=XQTISC|Quote!'FITXN*1.TF-FiveAskSize'")
End Sub
作者: 藍天麗池    時間: 2024-1-19 11:21

[attach]37309[/attach]回復 35# Andy2483
作者: Andy2483    時間: 2024-1-19 11:25

回復 36# 藍天麗池


    原來
[K10]儲存格是 =XQTISC|Quote!'FITXN*1.TF-FiveBidSize'
[L10]儲存格是 =XQTISC|Quote!'FITXN*1.TF-FiveAskSize'
如果把這兩公式放入儲存格會有值嗎? 或錯誤值? 請試試看
作者: 藍天麗池    時間: 2024-1-19 11:30

回復 37# Andy2483


   一樣出現最早的那個錯誤
作者: 藍天麗池    時間: 2024-1-19 11:32

回復 37# Andy2483

[attach]37310[/attach]左邊會有直出現,但是一樣會出現錯誤
作者: Andy2483    時間: 2024-1-19 11:32

回復 38# 藍天麗池


    [K10] 和 [10] 儲存格有值嗎?
作者: 藍天麗池    時間: 2024-1-19 11:36

回復 40# Andy2483


    有,我有放職進去
作者: Andy2483    時間: 2024-1-19 11:46

本帖最後由 Andy2483 於 2024-1-19 11:49 編輯

回復 41# 藍天麗池


    奇怪了 這兩格植入公式可以顯示數字,VBA卻抓不到值
其他的DDE值VBA都抓到了,就這兩個值抓不到
請檢查一下原本這 L10與K10 這兩格的公式是否正確,貼上來看一下
作者: 藍天麗池    時間: 2024-1-19 11:52

回復 42# Andy2483


    我剛剛又試了一下,這次連左邊A-D都不會顯示任何東西了,只會一直出現原本那個錯誤
作者: Andy2483    時間: 2024-1-19 11:56

回復 43# 藍天麗池


    重新開啟檔案,現在是兩個DDE值VBA抓不到,請檢查一下這兩串字  是不是有錯誤
=XQTISC|Quote!'FITXN*1.TF-FiveBidSize'
=XQTISC|Quote!'FITXN*1.TF-FiveAskSize'
作者: Andy2483    時間: 2024-1-19 11:58

回復 43# 藍天麗池


    試一下以下 執行結果
Sub TEST()
MsgBox Evaluate("=XQTISC|Quote!'FITXN*1.TF-BestBidSize1'")
End Sub
作者: 藍天麗池    時間: 2024-1-19 11:59

回復 44# Andy2483


    [attach]37311[/attach]沒有錯誤,我一直點結束,數字會變動喔
作者: 藍天麗池    時間: 2024-1-19 12:01

回復 45# Andy2483


    出現跟#36一樣的錯誤
作者: Andy2483    時間: 2024-1-19 13:07

回復 47# 藍天麗池


    那代表VBA 一筆DDE值都沒抓到,請再試一下
試一下以下 這沒有"="的執行結果
Sub TEST()
MsgBox Evaluate("XQTISC|Quote!'FITXN*1.TF-BestBidSize1'")
End Sub
作者: Andy2483    時間: 2024-1-19 15:06

回復 47# 藍天麗池


    忘了一件事: If IsError([K12]) Or IsError([L12]) Then 好像DDE值會有錯誤值所以你原來才有這判斷式
所以加了 If IsError(ThisWorkbook.Sheets(1).[B1]) Then Exit Sub    請再試試看新範例檔
[attach]37314[/attach]
作者: 藍天麗池    時間: 2024-1-19 15:26

回復 48# Andy2483


    [attach]37315[/attach]一樣甚麼都沒有
作者: 藍天麗池    時間: 2024-1-19 15:26

回復 49# Andy2483


    一樣出現最一開始的錯誤
作者: Andy2483    時間: 2024-1-19 15:33

回復 51# 藍天麗池


    再試試看
[attach]37316[/attach]
作者: 藍天麗池    時間: 2024-1-19 15:41

回復 52# Andy2483


    [attach]37317[/attach]會動了,可是數值都是0
作者: Andy2483    時間: 2024-1-19 15:51

回復 53# 藍天麗池


    換這個試試看
[attach]37318[/attach]
作者: 藍天麗池    時間: 2024-1-19 15:56

回復 54# Andy2483


    可以跑,但一樣是0
作者: Andy2483    時間: 2024-1-19 15:57

本帖最後由 Andy2483 於 2024-1-19 16:00 編輯

回復 55# 藍天麗池


    每秒的筆數算正常嗎?
真希望自己有DDE可以測試
作者: 藍天麗池    時間: 2024-1-19 16:03

回復 56# Andy2483


    下午是交易的冷清時間,所以不準確,只能先用來看程式是否正常運作,要看筆數是否正確要等到下周一的開盤時間8:45-13:30
作者: Andy2483    時間: 2024-1-19 16:08

本帖最後由 Andy2483 於 2024-1-19 16:12 編輯

回復 57# 藍天麗池


    如果可以跑 而值是0 那可能是計算出了問題,請前輩也自行研究一下算式
我將公式改成用其他活頁簿連結值的變動是可以跑的出正確值的
看圖片D欄好像是空白 沒有值,我再研究看看
作者: 藍天麗池    時間: 2024-1-19 16:16

回復 58# Andy2483


    好,我研究一下公式
作者: Andy2483    時間: 2024-1-19 16:21

回復 59# 藍天麗池


    再試試這個,看提視窗跳出什麼?
[attach]37319[/attach]
作者: 藍天麗池    時間: 2024-1-19 16:36

回復 60# Andy2483
[attach]37321[/attach]要一直按確定
然後剛剛上一個公式沒問題,我剛剛開我之前寫得去比對,沒錯,但是之前那個還有數字出現,但你這個卻都是0
作者: Andy2483    時間: 2024-1-19 17:11

本帖最後由 Andy2483 於 2024-1-19 18:42 編輯

回復 61# 藍天麗池


    啊 DDE傳輸的是文字 不是數字,我以為Evaluate後的值一定是數值,找了資料學習後才知道Evaluate是一個萬用的方法
所以應該是後學偷懶造成的 要用Val轉換為數字才能運算
作者: 藍天麗池    時間: 2024-1-19 20:51

回復 62# Andy2483


    所以程式碼還要更改?
作者: 准提部林    時間: 2024-1-20 11:23

那個Price...逐格寫值, 會拖慢速度//

模擬寫一個//
[attach]37322[/attach]
作者: 藍天麗池    時間: 2024-1-20 19:49

回復 64# 准提部林

感謝前輩,我星期一開盤再試試看
作者: Andy2483    時間: 2024-1-21 08:25

回復 65# 藍天麗池


    前輩早安
藉這帖DDE話題讓後學學習到很多知識,謝謝前輩
再請教前輩一點DDE資料運用的問題,請前輩指點這不懂DDE的後學
1.您所需要的DDE資料為什麼沒有全部接收記錄下來,而是直接計算所需要的值?
2.如果有個方便擴充或縮減DDE記錄欄數的方法,可以方便控制DDE的記錄,再藉由這些資料計算出想要的數據,甚至是自動產生圖表,或到價/到量自動跳出警訊,甚至提示因應對策,這樣的天馬行空想法不知是否對 是否可行?
作者: 藍天麗池    時間: 2024-1-21 10:02

回復 66# Andy2483


    1.券商那邊得來的DDE是交易資訊,要經過處理才能變成對自己有用的資料,如果沒有經過處理我就直接看券商軟體就好了,也不需要紀錄了  
    2.可行,只是一般不會用EXCEL寫,如果寫的東西多了他跑起來的效能不像C++或是其他程式語言順
作者: Andy2483    時間: 2024-1-21 10:30

回復 67# 藍天麗池


    謝謝前輩指點
後學像井底之蛙,這方面涉獵的不多,後學認為Excel 是最容易學的資料處理軟體,有什麼想法都容易自己寫程式或公式實現,這是後學的淺見,懇請前輩以後有機會多發表DDE這方面的話題分享或問題的交流
作者: 藍天麗池    時間: 2024-1-22 09:10

本帖最後由 藍天麗池 於 2024-1-22 09:18 編輯

回復 68# Andy2483


    你看一下64#的前輩寫的,效率不錯
作者: 藍天麗池    時間: 2024-1-22 09:13

本帖最後由 藍天麗池 於 2024-1-22 09:16 編輯

回復 64# 准提部林


      前輩,剛剛測試了一下,效率不錯,另外問一下
1.N14:O18明明沒有任何相關程式碼跟函數,為啥儲存格內的數字還會跳動啊?
2.程式碼放在TEST,而不是放在RTD,這是為什麼?根放在RTD有啥差別呢?
作者: Andy2483    時間: 2024-1-22 09:29

回復 69# 藍天麗池


    謝謝論壇,謝謝 藍天麗池前輩,謝謝 准提部林前輩指導
恭喜您,後學也學到很多知識
後學沒有DDE可以試,後學靠邊站就好了,沒那個能力像 准大沒接收DDE就可以寫出高效能的方案
作者: 准提部林    時間: 2024-1-22 14:58

回復 70# 藍天麗池

給個程序流程//
[attach]37335[/attach]
作者: 藍天麗池    時間: 2024-1-22 21:31

回復 72# 准提部林


  准大感謝你的回覆
另外,跟你再請教一下,你說明的部分提到RTD公式較多容易多重觸發,指的是哪部分,可以在詳細說一下嗎?這樣我下次再寫的時候就能多注意因多重觸發造成的效率不佳的問題
作者: 准提部林    時間: 2024-1-23 10:07

回復 73# 藍天麗池


A格公式變動, 將計算值填入B格,C格公式又引用了B格....這就是連鎖反應~~~
以RTD工作表為例...A區DDE公式變動, 填值至B區, C區引用B區作計算再反饋給a2:e2....表中任一公式都會觸發"自動計算"事件,
而"變動"的偵測, 只要一個儲存格, 挪到TEST工作表即可!!!
作者: 藍天麗池    時間: 2024-1-24 09:23

回復 74# 准提部林


   好的了解,感謝前輩,受益良多,下次遇到相同問題會納入考量




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