Board logo

標題: [發問] 請問該如何自動記錄加總 [打印本頁]

作者: leefing    時間: 2012-2-9 00:11     標題: 請問該如何自動記錄加總

本帖最後由 leefing 於 2012-2-9 00:32 編輯

如題

當單量>=10時,判斷     成交=買進       記在  空   那一欄
                                , 判斷      成交=賣出      記在  多   那一欄
                                ,判斷     成交同時>買進and賣出  記在     多    那一欄
                              ,判斷       成交同時<買進and賣出   記在    空    那一欄

每次出現  就累加上次,而不會取代掉

那該如何解決呢?
[attach]9502[/attach]
作者: register313    時間: 2012-2-9 01:06

回復 1# leefing
  1. Sub RR()
  2. Range(Cells(2, "T"), Cells([A65536].End(xlUp).Row, "U")) = ""
  3. For X = 2 To [A65536].End(xlUp).Row
  4.   If Cells(X, "J") >= 10 Then
  5.      If (Cells(X, "F") = Cells(X, "D")) Then
  6.        Cells(X, "U") = "空"
  7.      End If
  8.      If (Cells(X, "F") = Cells(X, "E")) Then
  9.        Cells(X, "T") = "多"
  10.      End If
  11.      If (Cells(X, "F") > Cells(X, "D")) And (Cells(X, "F") > Cells(X, "E")) Then
  12.        Cells(X, "T") = Cells(X, "T") & "多"
  13.      End If
  14.      If (Cells(X, "F") < Cells(X, "D")) And (Cells(X, "F") < Cells(X, "E")) Then
  15.        Cells(X, "U") = Cells(X, "U") & "空"
  16.      End If
  17.    End If
  18. Next X
複製代碼
是這樣嗎?
不了解 每次出現  就累加上次,而不會取代掉?
作者: leefing    時間: 2012-2-9 01:30

本帖最後由 leefing 於 2012-2-9 01:37 編輯

回復 2# register313


    "不了解 每次出現  就累加上次,而不會取代掉?"
因為我是接DDE,所以價格一定會一直變動。所以是一出現單量>=10就開始做那些動作了
一直加上去
舉例來說:第一次跳動  單量10,然後成交=買進,所以"空"下面那一格出現10
                     第二次跳動   單量20 ,然後成交=買進,所以"空"下面那一格出現30

這個動作只需要做 台指近月 那一列就可以了
要等明天開盤才能測式了。謝謝R大回覆
作者: register313    時間: 2012-2-9 08:12

回復 3# leefing

工作表模組
  1. Private Sub WORKSHEET_CHANGE(ByVal TARGET As Range)
  2. If TARGET.Address = "$J$2" And Cells(2, "J") >= 10 Then
  3. X = Cells(2, "U")
  4. Y = Cells(2, "T")
  5.   If Cells(2, "J") >= 10 Then
  6.      If (Cells(2, "F") = Cells(2, "D")) Then
  7.        Cells(2, "U") = Cells(2, "J") + X
  8.      End If
  9.      If (Cells(2, "F") = Cells(2, "E")) Then
  10.        Cells(2, "T") = Cells(2, "J") + Y
  11.      End If
  12.      If (Cells(2, "F") > Cells(2, "D")) And (Cells(2, "F") > Cells(2, "E")) Then
  13.        Cells(2, "T") = Cells(2, "J") + Y
  14.      End If
  15.      If (Cells(2, "F") < Cells(2, "D")) And (Cells(2, "F") < Cells(2, "E")) Then
  16.        Cells(2, "U") = Cells(2, "J") + X
  17.      End If
  18.    End If
  19. End If
  20. End Sub
複製代碼

作者: leefing    時間: 2012-2-9 17:48

回復 4# register313

謝謝R大的回覆,那如果另一張表也用這樣的做法,是不是修改TARGET這個地方
就可以一樣畫葫蘆了?
作者: register313    時間: 2012-2-9 17:55

回復 5# leefing

工作表模組
程式只會作用在該工作表
若另一工作表也須相同之功能,則該工作表模組也要有相同之程式


sheet1工作表模組放上述之程式
sheet2工作表模組放上述之程式
作者: leefing    時間: 2012-2-9 17:56

回復 6# register313

那麼TERGET這邊需要改嗎?  還是可以共存的?
作者: register313    時間: 2012-2-9 18:02

回復 7# leefing

各工作表模組之程式是互不相干的(獨立的)
要用相同的變數名稱也沒關係
作者: leefing    時間: 2012-2-9 18:03

回復 8# register313


    那這樣我懂了,謝謝
作者: leefing    時間: 2012-2-10 10:57

回復 8# register313


    R大,今天測試自動記錄加總
結果儲存格都沒反應,是電腦不夠快? 還是什麼問題呢?
作者: Hsieh    時間: 2012-2-10 11:44

回復 10# leefing

DDE連結變動,只能觸發 Worksheet_Calculate事件
作者: kobo    時間: 2012-2-10 12:28

除了使用 Worksheet_Calculate事件
還有一個 SetLinkOnData 方法
作者: leefing    時間: 2012-2-10 13:44

回復 11# Hsieh


    所以只要把change改成Calculate,   這樣就可以了嗎?
作者: leefing    時間: 2012-2-10 18:08

回復 12# kobo

K大,SetLinkOnData這個方法,在EXCEL說明 並不太清楚(小弟不太懂上面的意思),是不是要做大改造了??
作者: Hsieh    時間: 2012-2-10 18:28

回復 12# kobo

EXCEL中是利用Worksheet_Calculate事件
透過SetLinkOnData 方法來驅動所要執行的程序
所以還是透過Calculate來捕捉DDE的改變
作者: leefing    時間: 2012-2-11 00:01

本帖最後由 leefing 於 2012-2-11 00:15 編輯

回復 11# Hsieh

H大,我大概寫好了,有接一下DDE  會跳動,可以幫我看看怎樣才會完美或者 最佳
  1. Private Sub Worksheet_Calculate()
  2. Dim buy As Integer
  3. Dim short As Integer

  4. If Range("J2") >= 10 Then
  5. short = Range("Y2") '空
  6. buy = Range("X2") '多
  7.     If (Range("F2") = Range("D2")) Then     '成交=買進  記在空
  8.         Range("Y2") = Range("J2") + short
  9.     End If
  10.     If (Range("F2") = Range("E2")) Then     '成交=賣出 記在多
  11.         Range("X2") = Range("J2") + buy
  12.     End If
  13.     If (Range("F2") > Range("D2")) And (Range("F2") > Range("E2")) Then
  14.         Range("X2") = Range("J2") + buy '成交大於買進和賣出   記在多
  15.     End If
  16.     If (Range("F2") < Range("D2")) And (Range("F2") < Range("E2")) Then
  17.         Range("Y2") = Range("J2") + short '成交小於買進和賣出  記在空
  18.     End If
  19. End If
  20. End Sub
複製代碼
那我隔天要重新計算,那要怎麼釋放? 寫一個按鈕 點歸零嗎?
作者: Hsieh    時間: 2012-2-11 22:42

本帖最後由 Hsieh 於 2012-2-11 23:55 編輯

回復 16# leefing
我只有yeswin試用版
假設[J12]的DDE連結公式=YES|DQ!EXFB2.Volume
提供你測試看看
在Sheet1模組增加Worksheet_Calculate程序
  1. Private Sub Worksheet_Calculate()
  2. ThisWorkbook.SetLinkOnData "YES|DQ!EXFB2.Volume", "Catch_DDE"
  3. End Sub
複製代碼
在一般模組
  1. Sub Catch_DDE()
  2. MsgBox "J1數值變動"  '此行測試是否J12的DDE更新,可取消
  3. With Sheet1
  4. If .[J12].Value >= 10 Then
  5.    If .[D12] = .[F12] Then .[U12] = .[U12] + .[J12]
  6.    If .[E12] = .[F12] Then .[T12] = .[T12] + .[J12]
  7. End If
  8. End With
  9. End Sub

  10. Sub Auto_Open() '開檔時自動執行
  11. With Sheet1
  12. .[U12:T12] .ClearContents
  13. End With
  14. End Sub
複製代碼

作者: leefing    時間: 2012-2-13 12:57

回復 17# Hsieh


    H大,開啟EXCEL的時候,
If .[J12].Value >= 10 Then
這一行,出現資料型態不符,是因為沒有定義嗎?
我把它按偵測,然後關閉,再按開始巨集,就可以開始運作了。
作者: Hsieh    時間: 2012-2-13 14:07

回復 18# leefing
這可能是開啟檔案時,DDE還沒連上時,[J12]出現#N/A的錯誤所致
Sub Catch_DDE()
MsgBox "J1數值變動"  '此行測試是否J12的DDE更新,可取消
With Sheet1
If IsError(.[J12]) Then Exit Sub
If .[J12].Value >= 10 Then
   If .[D12] = .[F12] Then .[U12] = .[U12] + .[J12]
   If .[E12] = .[F12] Then .[T12] = .[T12] + .[J12]
End If
End With
End Sub
作者: leefing    時間: 2012-2-13 14:34

回復 19# Hsieh


    H大,
If IsError(.[J12]) Then Exit Sub
這一行 怎麼加不上去,出現編譯錯誤:  必須是:陳述式結尾。
then出現黃底

先開軟體再開EXCEL  也會出現型態的問題, 是因為DDE連的沒有EXCEL快嗎?(一開始的時候)
作者: kobo    時間: 2012-2-13 21:18

本帖最後由 kobo 於 2012-2-13 21:28 編輯

因權限無法下載檔案,故僅提供個人使用dde的經驗分享

Worksheet_Calculate事件:此事件會在重新計算工作表後發生。
首先必須清楚了解事件觸發的過程(多測試有助於你的工作),
當開啟檔案時,excel的工作表中如有dde連結,計算公式,或時間函數等(重新計算工作表)均會觸發此一事件,
所以您一開啟檔案且更新dde時,儲存格的dde資料尚未更新完全而Calculate事件己觸發,故發生錯誤,
解決方法如同 Hsieh 所述,
個人所使用的方法為建立一個開關(如何建立見仁見智)
例如:
Private Sub Worksheet_Calculate()

        if [A1]=1 then Call Catch_DDE

End Sub
上述[A1]為開關,只有在[A1]=1時,方執行Catch_DDE
另避免Calculate觸發後,所執行的程序尚未執行完畢又再觸發而產生錯誤,
建議觸發後將 Application.EnableEvents = False
    結束後再將  Application.EnableEvents = True
如上例改為
Private Sub Worksheet_Calculate()
        Application.EnableEvents = False
        if [A1]=1 then Call Catch_DDE
        Application.EnableEvents = True
End Sub

If IsError(.[J12]) Then Exit Sub 這一行 怎麼加不上去,出現編譯錯誤
研判您是在盤中修改程式,dde一直更新,不斷觸發Calculate,程式碼寫不完就觸發事件,當然產生錯誤,
如以後需盤中修改,建議可用複製程式碼再貼上或在修改的行上先加 ' ,變成註解後再編寫,完成後再刪除 '


SetLinkOnData 方法:設定每當更新 DDE 連線時執行的程序名稱。
由字義上說此法只有在 DDE 連線資料更新時方執行 您要設定的程序
故此法與Worksheet_Calculate事件有些不同,是可以分開使用的
這指的DDE是指有引入在工作表的DDE 代碼,
開盤價、最高價、最低價、成交價、成交量等各有各的DDE代碼
例:
Sub 設定成交量DDE()'只有在成交量資料更新時才會執行Catch_DDE,其他DDE代碼更新不會執行

    ThisWorkbook.SetLinkOnData "YES|DQ!EXFB2.Volume", "Catch_DDE"

End Sub

Sub 解除成交量DDE()'成交量資料更新時 也不會執行先前所設定的程序

    ThisWorkbook.SetLinkOnData "YES|DQ!EXFB2.Volume", ""

End Sub

Worksheet_Calculate事件 與 SetLinkOnData 方法 各有各的特點,還望使用者自行測試,
找出符合自己的需求.

祝您學習愉快
作者: Hsieh    時間: 2012-2-14 00:35

回復 20# leefing

本人並無DDE實際經驗,依據kobo的經驗
直接於開檔與關檔使用SetLinkOnData方法就可達到自動化了
  1. Sub Catch_DDE()
  2. '單量10,然後成交=買進,所以"空"下面那一格出現10
  3. If IsError([J12]) Then Exit Sub  '單量連結錯誤就停止計算
  4. If [J12] >= 10 Then  '單量10以上執行
  5.    If [D12] = [F12] Then [U12] = [U12] + [J12]
  6.    If [E12] = [F12] Then [T12] = [T12] + [J12]
  7. End If
  8. End Sub

  9. Sub auto_open()
  10. ThisWorkbook.SetLinkOnData "YES|DQ!EXFB2.Volume", "Catch_DDE"  '啟動SetLinkOnData方法
  11. End Sub

  12. Sub auto_close()
  13. ThisWorkbook.SetLinkOnData "YES|DQ!EXFB2.Volume", ""   '關閉SetLinkOnData方法
  14. End Sub
複製代碼

作者: appr    時間: 2012-2-19 21:02

本帖最後由 appr 於 2012-2-19 22:43 編輯

不好意思!!!想請教各位一下,我自己有在另外發表一篇主題!!不過我在這邊有看到好像跟我類似的

所以想請教一下!!我的這個問題的做法也是要用SetLinkOnData嗎?

我的問題是
             A1         A2        A3
架構: 進貨     退貨     庫存
                                       10

我在進貨的時候是從A1底下輸入

而公式就是=SUM(A3-A1) 那就會出現目前的庫存量

但如果我不小心把進貨的數值Delete 那 庫存的值就會消失!!! 但我不知道說 , 有哪個公式可以自動紀錄A3庫存的數值嗎???

還是說可以把程式關掉的時候自動更新庫存量 以及 把 A1的 數值給清除
作者: register313    時間: 2012-2-19 23:43

回復 23# appr

[attach]9664[/attach]

工作表模組
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Address = "$A$2" And [A2] <> "" Then
  3.    [C2] = [C2] + [A2]
  4.    [A2] = ""
  5. End If
  6. If Target.Address = "$B$2" And [B2] <> "" Then
  7.    [C2] = [C2] - [B2]
  8.    [B2] = ""
  9. End If
  10. End Sub
複製代碼

作者: appr    時間: 2012-2-20 01:22

是的!!這就是我想要做的部分!!!真的很感謝你!!

真不好意思還讓你用這種方法來呈現出來~"~
作者: appr    時間: 2012-2-20 02:00

想在請問一個問題!!!

如果我要連A3或者是A4也是一樣的做法!!那是要一樣複製

然後這個工作表模組A2改成A3  C2 改成 C3 嗎?
作者: register313    時間: 2012-2-20 08:14

回復 26# appr

工作表模組
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. Set RngA = Range("A2:A4")
  3. Set RngB = Range("B2:B4")
  4. Set RngCA = Intersect(Target, RngA)
  5. Set RngCS = Intersect(Target, RngB)
  6. If Not RngCA Is Nothing Then
  7.    RngCA.Offset(0, 2) = RngCA.Offset(0, 2) + RngCA.Value
  8.    RngCA.Value = ""
  9. End If
  10. If Not RngCS Is Nothing Then
  11.    RngCS.Offset(0, 1) = RngCS.Offset(0, 1) - RngCS.Value
  12.    RngCS.Value = ""
  13. End If
  14. End Sub
複製代碼

作者: appr    時間: 2012-2-21 02:21

不好意思!!!又發生問題了!!!

一開始測試是好的重新關閉後 ,重新來過也把後來的模組放進來

結果"Target" 被顯示 不正確的外部程序?

是我一開始的巨集編輯錯誤嗎?

有點搞混了~"~
作者: register313    時間: 2012-2-21 10:20

回復 28# appr

只放27#的程式碼
放在工作表模組,如下圖
[attach]9681[/attach]
還有問題的話,請上傳檔案
作者: appr    時間: 2012-2-21 21:27

可以了!!!!!!!!實在是太謝謝了~~~~~




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