Board logo

標題: DDE動態資料如何定時篩選? [打印本頁]

作者: corcovado886    時間: 2015-11-17 19:26     標題: DDE動態資料如何定時篩選?

有 一排DDE動態資料,每三秒記錄一次,
請問如何定時篩選出漲幅大於 9 的對應股號?

目前我想到的方法是錄製巨集,然後做進階篩選,複製在固定表格內。
但不知道怎麼定時篩選,最好是能夠複製在橫向表格裡。
[attach]22470[/attach]
作者: c_c_lai    時間: 2015-11-18 16:16

回復 1# corcovado886
你的意思是這樣?
[attach]22482[/attach]
作者: corcovado886    時間: 2015-11-18 18:32

回復 2# c_c_lai

哇! 我沒權限下載耶.....

就是將第二列的動態資料,把大於9的篩選出來,
再將對應的號碼顯示在固定一排表格內。

可以放程式碼上來嗎? 感激不盡 ^^
作者: c_c_lai    時間: 2015-11-19 05:24

本帖最後由 c_c_lai 於 2015-11-19 09:30 編輯

回復 3# corcovado886
是否如此結果?
  1. Sub 自動記錄()
  2.     Dim cts As Integer
  3.     If uMode = 0 Then Exit Sub
  4.     If Time > TimeValue(EndTime) Then '收盤時間以後不執行
  5.         Sht1.[W4] = "已過收盤"
  6.         uMode = 0
  7.         Exit Sub
  8.     End If
  9.     With Sht1
  10.         .Range("W2") = Time '當前時間(時間碼表)
  11.         '----------------------------------------------------------
  12.         '每1分鐘記錄,5分鐘則改為 Mod 5
  13.         If Second(Time) Mod 3 = 0 Then
  14.             xRow = .Range("A65536").End(xlUp).Row + 1 '從最後一格往上尋找有資料的儲存格, 是在第幾列,然後再加1列
  15.             If xRow < 11 Then xRow = 11 '如果列數小於11,則從第11列開始
  16.             .Range("A" & xRow & ":V" & xRow).Value = .Range("A2:V2").Value
  17.            For cts = 1 To 22
  18.                 .Range(Chr(64 + cts) & xRow).Font.Color = IIf(.Range(Chr(64 + cts) & xRow).Value >= 9, vbRed, vbBlack)
  19.             Next
  20.             .Range("W" & xRow).Value = Time 'W欄位的時間值往下記錄
  21.             '------------------------------------------------
  22.             If ActiveSheet.Name = .Name And xRow > 20 Then
  23.                 ActiveWindow.ScrollRow = xRow - 12 '讓最新資料保持在可見視窗中
  24.             End If
  25.         End If
  26.     End With
  27.     Application.OnTime Now + TimeValue("00:00:01"), "自動記錄"   '每一秒遞迴一次
  28. End Sub
複製代碼

作者: c_c_lai    時間: 2015-11-19 11:18

回復 3# corcovado886
  1.                 ActiveWindow.ScrollRow = xRow - 12   '  讓最新資料保持在可見視窗中
複製代碼
修改成如下,較吻合事實。即最新一筆資料永遠會保持在可見視窗中最底筆。
  1.                 ActiveWindow.ScrollRow = xRow - 11   '  讓最新一筆資料保持在可見視窗中最底筆
複製代碼

作者: corcovado886    時間: 2015-11-19 17:38

回復 5# c_c_lai

好像不是這樣....:$

只要將第二列的動態資料,篩選大於 9 的 股號,
放在第六列就可以了(是顯示股號 ),下面每筆的記錄不用更動。

[attach]22506[/attach]
作者: c_c_lai    時間: 2015-11-19 18:58

回復 6# corcovado886
是這樣?
  1. Sub 自動記錄()
  2.     Dim cts As Integer, A As Range, Rng As Range
  3.    
  4.     If uMode = 0 Then Exit Sub
  5.     If Time > TimeValue(EndTime) Then '收盤時間以後不執行
  6.         Sht1.[W4] = "已過收盤"
  7.         uMode = 0
  8.         Exit Sub
  9.     End If
  10.     With Sht1
  11.         .Range("W2") = Time '當前時間(時間碼表)
  12.         '----------------------------------------------------------
  13.         '每1分鐘記錄,5分鐘則改為 Mod 5
  14.         If Second(Time) Mod 3 = 0 Then
  15.             xRow = .Range("A65536").End(xlUp).Row + 1 '從最後一格往上尋找有資料的儲存格, 是在第幾列,然後再加1列
  16.             If xRow < 11 Then xRow = 11 '如果列數小於11,則從第11列開始
  17.             .Range("A" & xRow & ":V" & xRow).Value = .Range("A2:V2").Value
  18.             .[B6:V6].ClearContents
  19.             Set Rng = .[B6]
  20.             cts = 0
  21.             For Each A In .Range("A" & xRow & ":V" & xRow)
  22.                 cts = cts + 1
  23.                 If (A.Value >= 9) Then
  24.                     '  A.Font.Color = vbRed
  25.                     Rng.Value = .Range(Chr(64 + cts) & 10).Value
  26.                     Set Rng = Rng.Offset(, 1)
  27.                 Else
  28.                     '  A.Font.Color = vbBlack
  29.                 End If
  30.             Next
  31.             .Range("W" & xRow).Value = Time 'W欄位的時間值往下記錄
  32.             '------------------------------------------------
  33.             If ActiveSheet.Name = .Name And xRow > 20 Then
  34.                 ActiveWindow.ScrollRow = xRow - 11   '  讓最新一筆資料保持在可見視窗中最底筆
  35.             End If
  36.         End If
  37.     End With
  38.     Application.OnTime Now + TimeValue("00:00:01"), "自動記錄"   '每一秒遞迴一次
  39. End Sub
複製代碼

作者: corcovado886    時間: 2015-11-19 20:12

回復 7# c_c_lai
哇!真是太感動了....
沒錯,就是這樣,非常感謝!

可以請問一下嗎?   Rng.Value = .Range(Chr(64 + cts) & 10).Value   其中的Chr
google 好久,只找到  Chr (10) 是換行,但Chr(64 + cts) & 10就看不懂了....
作者: c_c_lai    時間: 2015-11-19 20:26

回復 8# corcovado886
  1. Rng.Value = .Range(Chr(64 + cts) & 10).Value
複製代碼
也可以寫成如下:
  1. Rng = .Range(Chr(64 + cts) & 10)
複製代碼
當 cts = 1 時,64 +  1 = 65,
ASC(65) = 'A'。 .Range(Chr(64 + cts) & 10) = .Range("A10")
當 cts = 2 時,64 +  2 = 66,
ASC(66) = 'B'。  .Range(Chr(64 + cts) & 10) = .Range("B10")
以此類推。
作者: corcovado886    時間: 2015-11-28 21:43

回復 9# c_c_lai
原來還可以這樣用,真是厲害!
那如果要記錄的欄位超過26個怎麼辦呢?

因為A~Z,接下來就換成 AA、AB、AC....
是否也可用同樣的方法
作者: c_c_lai    時間: 2015-11-29 08:00

本帖最後由 c_c_lai 於 2015-11-29 08:04 編輯

回復 10# corcovado886
以下範例只演算到 A ~ AZ,如果實務值有超出 AZ 者,
依下面例子再往下繼續演算 ( IIf( ... , ... , ...  ) )下去:
  1. .Range(IIf(cts > 26, "A" & Chr(64 + cts - 26), Chr(64 + cts)) & 10)
複製代碼

作者: 准提部林    時間: 2015-11-29 17:59

A7:=IF(COUNT(0/(A2>9)),COLUMN(A1),"--") 右拉至V7
B6:=IF(COLUMN(A1)>COUNT($A7:$V7),"",INDEX($A1:$V1,SMALL($A7:$V7,COLUMN(A1)))) 右拉
作者: geneokimo    時間: 2016-3-4 11:45

感謝您的發帖,獲益良多!!!




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