Board logo

標題: 關於資料比對的寫法 [打印本頁]

作者: 藍天麗池    時間: 2016-7-17 21:12     標題: 關於資料比對的寫法

[attach]24684[/attach]
如果要寫兩個功能1.總量變動就將股價寫入E列
                                2.下次總量再變動時再將E列的資料寫入F列,作這一秒(E列)跟前一秒(F列)的股價作比對
例如:台積電 9:00:00 成交價是100元,先將100寫入E2,之後9:00:10 成交價是101,同時執行將前一秒的100元寫入F2,這一秒的101寫入E2,一直持續下去要如何寫成VBA呢??
還請版上大大幫幫忙,謝謝
作者: c_c_lai    時間: 2016-7-18 11:47

回復 1# 藍天麗池
你是以"總量變動" 抑或是 "成交價" 做為比對標準?
請再仔細描述說明,謝謝!
作者: 藍天麗池    時間: 2016-7-18 13:02

回復 2# c_c_lai


    總量變動就寫入股價,以總量變動為條件來對比股價
c大感謝
作者: c_c_lai    時間: 2016-7-18 20:24

回復 3# 藍天麗池
ThisWorkbook:
  1. Private Sub Workbook_Open()
  2.     Dim rng As Variant
  3.    
  4.     With Sheets(1)
  5.         For Each rng In Range(.[D2], .[D2].End(xlDown))
  6.             rng.Offset(, 26) = IIf(IsNumeric(rng), rng, 0)
  7.             rng.Offset(, 1) = IIf(IsNumeric(rng.Offset(, -1)), rng.Offset(, -1), 0)
  8.         Next
  9.     End With
  10. End Sub
複製代碼
Sheet1:
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Left(Target.Address, 2) = "$D" And IsNumeric(Target) Then
  3.         If Target.Offset(, 26).Value <> Target.Value Then
  4.             Target.Offset(, 26) = Target
  5.             Target.Offset(, 2) = Target.Offset(, 1)
  6.             Target.Offset(, 1) = IIf(IsNumeric(Target.Offset(, -1)), Target.Offset(, -1), 0)
  7.         End If
  8.     End If
  9. End Sub
複製代碼
[attach]24685[/attach]
作者: 藍天麗池    時間: 2016-7-18 20:42

回復 4# c_c_lai
C大,目前手動測試OK,明天開盤試試看
跟C大請教一下,程式碼裡面的26是甚麼阿,簡易的我還看得懂,但是無法理解裡面為什麼會有26?
作者: c_c_lai    時間: 2016-7-18 21:11

回復 5# 藍天麗池
[attach]24691[/attach]
作者: 藍天麗池    時間: 2016-7-18 21:50

回復 6# c_c_lai


    哈哈,這樣我了解了,謝謝c大耐心解釋
作者: 藍天麗池    時間: 2016-7-19 11:01

回復 6# c_c_lai


   c大,跟你報告一下測試結果,測試後無法執行,但我用手動輸入數字卻可行,
我在想會不會是程式對於dde的數值判定有問題呢?
作者: c_c_lai    時間: 2016-7-19 11:08

這跟我預期的一樣,因為 DDE  的匯入資料之變動
確定是不會觸發 Worksheet_Change() 的。
作者: c_c_lai    時間: 2016-7-19 11:52

回復 8# 藍天麗池
用這個程式再試試看行不行
[attach]24695[/attach]
作者: 藍天麗池    時間: 2016-7-19 16:23

回復 9# c_c_lai


    哈哈,原來c大早就知道了,我回家再來看看程式的差別
作者: c_c_lai    時間: 2016-7-19 16:55

回復 11# 藍天麗池
請將 ThisWorkbook 內的
.[Z1] = .[D2]
改成
.[Z1].Formula = "=D2"
如此才能觸發。
作者: c_c_lai    時間: 2016-7-19 17:47

回復 11# 藍天麗池
我已經將 .[Z1].Formula = "=D2" 修正了。
[attach]24703[/attach]
作者: 藍天麗池    時間: 2016-7-19 21:38

本帖最後由 藍天麗池 於 2016-7-19 21:46 編輯

回復 13# c_c_lai

謝謝C大,我明天測試後再向你報告
請教C大這次新加的z1是甚麼啊??
作者: c_c_lai    時間: 2016-7-20 06:59

回復 14# 藍天麗池
Z1 為 Z 欄的第一行,主要用意是當 D2 DDE 匯入資料
有異動時 Z1 欄位公式 (=D2) 的內容值亦會跟著變動,
如此 Z1 數值 的變動便會觸發 Worksheet_Change()。
等確定後再來修正 AD 欄的存入值為數值、抑或是公式。
作者: 藍天麗池    時間: 2016-7-20 09:48

回復 15# c_c_lai


    c大,測試後完全沒有動作,只有dde在跳動,程式完全無法執行
作者: c_c_lai    時間: 2016-7-20 10:37

回復 16# 藍天麗池
試試這隻程式!
[attach]24704[/attach]
作者: 藍天麗池    時間: 2016-7-20 10:45

回復 17# c_c_lai


    c大還是一樣沒有動作
作者: c_c_lai    時間: 2016-7-20 11:05

回復 18# 藍天麗池
如此,便不能藉由 Worksheet_Change)
來處理了。
DDE 的處裡以往我是以程式來直接作業,即從開盤起,
每隔多少時間回顧一下,直到收盤為止。
但是它會占用一些CPU資源。讓我思考一下。
作者: 藍天麗池    時間: 2016-7-20 11:13

回復 19# c_c_lai


    c大,請教一下,如果用第一個程式更改程式對dde的判定或是增加輔助欄位這樣可行嗎?
作者: c_c_lai    時間: 2016-7-20 11:13

回復 18# 藍天麗池
目前我的電腦環境裡無安裝卷商軟體,所以無從測試。
我再整理一個適合你的程式吧!
其實你也可以向 GBKEE、准提部林 等版大,以及站上
許多前輩請益的。他們亦均是我的指導老師。
作者: c_c_lai    時間: 2016-7-20 11:48

本帖最後由 c_c_lai 於 2016-7-20 11:49 編輯

回復 20# 藍天麗池
再試一次
[attach]24705[/attach]
作者: c_c_lai    時間: 2016-7-20 12:08

本帖最後由 c_c_lai 於 2016-7-21 07:10 編輯

回復 20# 藍天麗池
  1. Private Sub Workbook_Open()
  2.     Dim rng As Variant
  3.    
  4.     With Sheets(1)
  5.         For Each rng In Range(.[D2], .[D2].End(xlDown))
  6.             rng.Offset(, 26) = IIf(IsNumeric(rng), rng, 0)
  7.             rng.Offset(, 1) = IIf(IsNumeric(rng.Offset(, -1)), rng.Offset(, -1), 0)
  8.         Next

  9.         If Time < TimeValue("08:45") Then                   '  早於開盤時間
  10.             Application.OnTime TimeValue("08:45"), "ThisWorkbook.MyWay"  '  設定於08:45 執行 MyWay 程序
  11.         ElseIf Time >= TimeValue("08:45") And Time <= TimeValue("13:30") Then '  於交易時間內
  12.             MyWay                                           '  執行 MyWay 程序
  13.         End If
  14.     End With
  15. End Sub

  16. Sub MyWay()
  17.     With Sheets(1)
  18.         For Each rng In Range(.[D2], .[D2].End(xlDown))
  19.             If IsNumeric(rng) Then
  20.                 If rng.Offset(, 26).Value <> rng.Value Then
  21.                     rng.Offset(, 26) = rng
  22.                     rng.Offset(, 2) = rng.Offset(, 1)
  23.                     rng.Offset(, 1) = IIf(IsNumeric(rng.Offset(, -1)), rng.Offset(, -1), 0)
  24.                 End If
  25.             End If
  26.         Next
  27.     End With
  28.    
  29.     Application.OnTime Now + TimeValue("00:00:10"), "ThisWorkbook.MyWay"  '  設定 10 秒後 執行 MyWay 程序
  30. End Sub

  31. Sub addN()         '  手動測試用
  32.     Dim rng As Range
  33.    
  34.     With Sheets(1)
  35.         For Each rng In Range(.[AD2], .[AD2].End(xlDown))
  36.             rng = rng + 1
  37.         Next
  38.     End With
  39. End Sub
複製代碼

作者: 藍天麗池    時間: 2016-7-20 12:10

回復 23# c_c_lai


    c大我出門了,可能要明天才能測試,明天再跟你說結果
作者: 藍天麗池    時間: 2016-7-20 21:11

本帖最後由 藍天麗池 於 2016-7-20 21:21 編輯

回復 23# c_c_lai

Application.OnTime Now + TimeValue("00:00:10"), "ThisWorkbook.MyWay"  '  設定 10 秒後 執行 MyWay 程序

C大請教一下,以上程式碼是指開盤後10秒執行(也就是8:45:10),還是指之後都是每10秒執行一次??
剛剛回到家看程式碼這個地方不太了解
作者: c_c_lai    時間: 2016-7-21 06:24

本帖最後由 c_c_lai 於 2016-7-21 06:34 編輯

回復 25# 藍天麗池
第一次執行完之後,每10秒會再去執行一次。
順便將
  1. Application.OnTime TimeValue("08:45"), "MyWay"
複製代碼
改成
  1. Application.OnTime TimeValue("08:45"), "ThisWorkbook.MyWay"
複製代碼
以防尋找不著。只標明 "MyWay" ,一般系統會直接去模組裡搜尋。
作者: 藍天麗池    時間: 2016-7-21 09:08

回復 26# c_c_lai


    那這樣如果價格在10秒內有變動不就無法紀錄?
作者: c_c_lai    時間: 2016-7-21 09:30

回復 27# 藍天麗池
"00:00:10" 那你就不會變動性的依你的需修改?
譬如:兩秒跑一次 "00:00:02"、五秒跑一次 "00:00:05"
作者: 藍天麗池    時間: 2016-7-21 09:38

回復 28# c_c_lai


    喔喔!c大那我了解了,目前測試ok
另外,請教一下c大,目前程式設定是單一個股的總量有變動才寫入,還是任一個股有變動就寫入呢?
因為我剛剛看了一下,感覺好像全部都一起寫入,但有時候這一秒跟前一秒價格一樣所以會有錯覺,所以再問一下c大
作者: c_c_lai    時間: 2016-7-21 09:59

回復 29# 藍天麗池
全部都一起寫入,因為無法使用 Worksheet_Change()
無從判斷是由哪個欄位修正觸發的緣故。
作者: 藍天麗池    時間: 2016-7-21 11:17

本帖最後由 藍天麗池 於 2016-7-21 11:25 編輯

http://forum.twbts.com/viewthrea ... pageD1&page=13b]
回復 30# c_c_lai


    哇!不能個別判段嗎?這樣我設定1秒變動就執行可能會來不及看

c大,不能像上次寫的那個程式一樣有變動才紀錄,其他不變嗎?
如果用上次的邏輯寫也無法嗎?
作者: jackyq    時間: 2016-7-21 11:47

回復 31# 藍天麗池

大大要自己試著學啊
作者: 藍天麗池    時間: 2016-7-21 11:58

回復 32# jackyq


    j大,我有阿,從跟你們的對談中一點一點學阿,只是我還沒有很厲害就是了,所以很感謝論壇這邊有這麼多好前輩
作者: c_c_lai    時間: 2016-7-21 12:42

回復 31# 藍天麗池
明天早上你用這支程式試試看。
[attach]24716[/attach]
作者: c_c_lai    時間: 2016-7-21 12:46

回復 31# 藍天麗池
  1. ThisWorkbook:
  2. Private Sub Workbook_Open()
  3.     Dim rng As Variant, rnt As Range
  4.    
  5.     With Sheets(1)
  6.         Set rnt = [AD2]
  7.         For Each rng In Range(.[D2], .[D2].End(xlDown))
  8.             rng.Offset(, 1) = IIf(IsNumeric(rng.Offset(, -1)), rng.Offset(, -1), 0)
  9.             rnt.FormulaR1C1 = "=RC[-26]"
  10.             Set rnt = rnt.Offset(1)
  11.         Next
  12.     End With
  13. End Sub
複製代碼
  1. 工作表1:
  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3.     With Sheets(1)
  4.         If Left(Target.Address, 3) = "$AD" And IsNumeric(Target) Then
  5.             .Cells(Target.Row, 6) = .Cells(Target.Row, 5)
  6.             '  Debug.Print "Target.Address = " & Target.Address
  7.         ElseIf Left(Target.Address, 2) = "$F" Then
  8.             .Cells(Target.Row, 5) = IIf(IsNumeric(.Cells(Target.Row, 3)), .Cells(Target.Row, 3), 0)
  9.         Else
  10.             
  11.         End If
  12.     End With
  13. End Sub

  14. Private Sub Worksheet_Calculate()
  15.     '  [K1] = [K1] + 1
  16. End Sub
複製代碼

作者: 藍天麗池    時間: 2016-7-21 12:47

回復 34# c_c_lai


    c大,感謝你這麼上心的幫忙,如果你有在忙就先忙喔!
我的沒有很趕,我只是想上來問問順便學習,每次c大都很幫忙,真的很感謝
作者: c_c_lai    時間: 2016-7-21 13:11

回復 36# 藍天麗池
我是想印證 Worksheet_Change() 與DDE 間之微妙牽動,
如透過它欄 ( AD3 "= D3" ) 的對等關係想印證是否能觸發
而已。端結是提問人有否頓悟決心、及好奇求知心。
作者: 藍天麗池    時間: 2016-7-21 16:54

回復 37# c_c_lai


    c大,我了解了,明天測試完跟你報告結果
作者: 藍天麗池    時間: 2016-7-22 09:23

回復 37# c_c_lai


    c大,測試完一樣不行
請教一下c大,我看程式裡面ad欄總量有過去阿,但為什麼還是無法執行?
之前無法執行不是因為抓不到dde的數值變化嗎?
作者: c_c_lai    時間: 2016-7-22 10:41

回復 39# 藍天麗池
再試試,觀察新增的 "CD 欄觸發"、"AD 欄動態"、"F 欄動態"
數字有否變化?
[attach]24723[/attach]
作者: 藍天麗池    時間: 2016-7-22 11:03

本帖最後由 藍天麗池 於 2016-7-22 11:13 編輯

回復 40# c_c_lai


    c大,還是一樣不行
作者: c_c_lai    時間: 2016-7-22 11:13

回復 41# 藍天麗池
數字都沒增加嗎?如果都是 0 值,看樣子那只好選擇三至五秒的方式較妥。
作者: 藍天麗池    時間: 2016-7-22 12:36

回復 42# c_c_lai


    都是0值,看來也只能這樣了
c大,請教一下,之前請教你的那個程式,有變動就往下寫的那個,我想不通一點,之前變動就往下寫也是用dde為基準寫的,再我看來,這次的程式是變動就往右邊寫,卻無法執行,這兩個程式的差異是在那邊呢?
作者: c_c_lai    時間: 2016-7-22 17:14

回復 43# 藍天麗池
我已經沒印象了,你將它上傳我瞧瞧。
作者: 藍天麗池    時間: 2016-7-22 21:21

回復 44# c_c_lai
[attach]24728[/attach]
C大,這個檔案你看看
作者: c_c_lai    時間: 2016-7-23 06:43

回復 45# 藍天麗池
[attach]24729[/attach]
作者: 藍天麗池    時間: 2016-7-24 21:18

回復 46# c_c_lai
C大我了解了,我在思考看看,謝謝
作者: 藍天麗池    時間: 2016-8-1 11:03

本帖最後由 藍天麗池 於 2016-8-1 11:07 編輯

回復 46# c_c_lai


    [attach]24791[/attach]
c大,可以幫我看看嗎?
我把原本的檔案加了一些東西進去,然後把對照欄從AD改到AR然後dde就不會跳動了,是我更改的程式有誤嗎?
作者: c_c_lai    時間: 2016-8-1 11:31

回復 48# 藍天麗池
此專案的巨集已被暫停。請參閱指應用程式的線上說明或文件,
找出啟用巨集的方法。
作者: 藍天麗池    時間: 2016-8-1 11:57

回復 49# c_c_lai


    暫停?不太懂c大的意思,我打開檔案進去dde還會更新一次,而且程式碼也沒有什麼變動怎麼會暫停呢?
作者: c_c_lai    時間: 2016-8-1 11:59

回復 50# 藍天麗池
你看看 AR欄有沒有數據?
作者: 藍天麗池    時間: 2016-8-1 12:16

回復 51# c_c_lai


    c大,ar欄有數字阿!
作者: c_c_lai    時間: 2016-8-1 13:02

回復 52# 藍天麗池
你把 AR 欄資料清除,檔案儲存再從新進來
觀看AR欄有沒有資料。
請將
Private Sub Workbook_Open()
    Dim rng As Variant
修改成
Private Sub Workbook_Open()
    Dim rng As Range
就 OK 了。
作者: 藍天麗池    時間: 2016-8-1 13:28

本帖最後由 藍天麗池 於 2016-8-1 13:30 編輯

回復 53# c_c_lai


    c大,還是不行欸,照你說的將ar刪除,且做更改也是不行
另外,請教c大,z1那邊有個數字,那個數字的功用是什麼阿?
作者: c_c_lai    時間: 2016-8-1 15:58

回復 54# 藍天麗池
#53 (Range) 的改了嗎? 我是可以運行的。
但是現已過 13:30 無從測試。
作者: 藍天麗池    時間: 2016-8-1 16:11

本帖最後由 藍天麗池 於 2016-8-1 16:12 編輯

回復 55# c_c_lai


    改了,剛好也1328,所以要明天才能測試,明天再跟c大報告
z1??
另外最下面那個程式的功能是??請教一下c大
作者: c_c_lai    時間: 2016-8-1 16:50

回復 56# 藍天麗池
Z1 是前版本留下的暫存欄,在本程式中
是無作用的,可以將它清除。
作者: 藍天麗池    時間: 2016-8-2 13:58

回復 57# c_c_lai


    c大抱歉,今天早上比較忙,現在才回,目前可以運作了
作者: 藍天麗池    時間: 2016-9-13 17:08

本帖最後由 藍天麗池 於 2016-9-13 17:09 編輯

回復 57# c_c_lai

http://forum.twbts.com/viewthread.php?tid=18350&extra=

C大,小弟又來跟你請教了,在請C大有空的時候指導小弟一下




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