Board logo

標題: [發問] 請問如何將以連接EXCEL的DDE數據每分鐘紀錄下來? [打印本頁]

作者: j1221    時間: 2010-7-1 09:24     標題: 請問如何將以連接EXCEL的DDE數據每分鐘紀錄下來?

板主,各位前輩大家好

其實這個問題,我之前已經在舊論壇拜讀過相關文章,尤其是jimmy大的那篇經典文章
因為小弟本身的做法和看盤軟體(我是用yeswin)跟之前jimmy大的不一樣
所以我把GBKEE大分享的程式碼稍微改了一下,可是還是不能用....故想請問GBKEE大,我該怎麼改才可以使用

請先讓我簡單說明我的設定:
1.小弟是先將所有我需要的資料(期權)全部都先集中在一個工作表(sheet 1)中(這可能跟其他前輩不一樣)
2.再挑出我今天關注的某一檔(比如說大台),再將大台的相關資訊指向第二個工作表(sheet 2)
3.我希望能將大台的每一分鐘資料都紀錄在sheet 2裡

也就是說,我不是直接紀錄DDE回傳的資料,我是紀錄sheet 1中資料格的變動,
所以我將GBKEE大的程式碼download改成了change,可是還是不能用....可否請問GBKEE大,我該怎麼改才可以使用?

請查閱我附上的檔案,感謝各位
作者: GBKEE    時間: 2010-7-1 16:22

本帖最後由 GBKEE 於 2010-7-1 17:33 編輯

回復 1# j1221
試試看
  1. Private Sub Workbook_Open()
  2. If Time >= TimeValue("08:45:00") And Time <= TimeValue("13:45:00") Then
  3. Sheet2.[B7:G307] = ""
  4. change
  5. Else
  6. Application.OnTime "09:01:00", "ThisWorkbook.change"
  7. End If
  8. End Sub
  9. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  10. Private Sub change()
  11.     Dim TimeRange As Range, Rng As Range, R As Range
  12.     With Sheet2
  13.         Set TimeRange = .[A:A].Find(Format(TimeSerial(Hour(Time), Minute(Time), 0), "hh:mm"), LookIn:=xlValues)
  14.         Set Rng = TimeRange.Offset(, 1).Resize(1, 6)
  15.         Set R = Application.Evaluate(Mid(.Range("A3").Formula, 2))
  16.         'R 是A3的公式 =Data!B2 所指的位置
  17.     End With
  18.     Rng.Value = R.Offset(, 1).Resize(, 6).Value
  19.     If Time > TimeValue("13:45:00") Then Exit Sub
  20.     Application.OnTime Now + TimeValue("00:01"), "ThisWorkbook.change"
  21. End Sub
複製代碼

作者: j1221    時間: 2010-7-1 22:28

本帖最後由 j1221 於 2010-7-2 09:00 編輯

回復 2# GBKEE


先謝謝GBKEE大的回復!!

小弟剛剛試了,貼上程式碼後按F5執行,出現「沒有設定物件變數或 With 區塊變數 (錯誤 91)」的訊息.....
偵錯後,顯示有問題的部份為『Set Rng = TimeRange.Offset(, 1).Resize(1, 6)』,可否請問這是什麼原因呢?

還有另一問想請教您,可否請問您為什麼需要
『Set R = Application.Evaluate(Mid(.Range("A3").Formula, 2))
        'R 是A3的公式 =Data!B2 所指的位置』

因為我實際上想要記錄的是將Sheet1 的C2-H2記錄至Sheet2的B7-G7,然後依時間順序往下記錄
Sheet1!A3 指向Sheet2!B2 只是我為了要方便辨認目前記錄的項目,請問您這樣設定是有什麼特別的作用嗎?

再次謝謝您的幫助
作者: GBKEE    時間: 2010-7-2 16:04

回復 3# j1221
出現「沒有設定物件變數或 With 區塊變數 (錯誤 91)」的訊息.....

請問你測試時的時間是Sheet2的A欄裡有的時間嗎?
2.再挑出我今天關注的某一檔(比如說大台),再將大台的相關資訊指向第二個工作表(sheet 2)

根據你說的 所以->   Set R = Application.Evaluate(Mid(.Range("A3").Formula, 2))
    ** R 是A3的公式 =Data!B2 所指的位置 ->今天關注的某一檔

如果你要
實際上想要記錄的是將Sheet1 的C2-H2記錄至Sheet2的B7-G7

那你改成 Rng.Value = Sheet1.[C2:H2].Value
作者: j1221    時間: 2010-7-3 02:49

回復 4# GBKEE

感謝GBKEE大的回答

我已經改好了。

我是在開盤前,就打開excel檔,我sheet2上的第一個時間是8:45,所以這就是出問題的原因嗎?

那....請問您我該怎麼克服這個情形?等開盤後再打開excel檔?
作者: GBKEE    時間: 2010-7-3 14:54

回復 5# j1221
下週一 08:45 前開啟檔案測試看看
  1. Private Sub Workbook_Open()
  2. Sheet2.[B7:G307] = ""
  3. If Time >= TimeValue("08:45:00") And Time <= TimeValue("13:45:00") Then
  4. change
  5. Else
  6. Application.OnTime "08:45:00", "ThisWorkbook.change"
  7. End If
  8. End Sub
複製代碼

作者: j1221    時間: 2010-7-5 09:05

回復 6# GBKEE


謝謝GBKEE大,

我改了,也在剛剛試了,可是卻還是跳出同樣的錯誤訊息,是否是因為我在sheet3有外加圖表的問題?

可否附上附件,請您再幫我看一下?
作者: GBKEE    時間: 2010-7-5 15:38

回復 7# j1221
   
  1. Private Sub Achange()
  2.     Dim TimeRange As Range, Rng As Range, R As Range
  3.     With Sheet2
  4.         Set TimeRange = .[A:A].Find(TimeSerial(Hour(Time), Minute(Time), 0), LookIn:=xlFormulas)
  5.         Set Rng = TimeRange.Offset(, 1).Resize(1, 6)
  6.     End With
  7.     Rng.Value = Sheet1.[C2:H2].Value
  8.     If Time > TimeValue("13:45:00") Then Exit Sub
  9.     Application.OnTime Now + TimeValue("00:01"), "ThisWorkbook.change"
  10. End Sub
複製代碼

作者: j1221    時間: 2010-7-6 09:21

回復 8# GBKEE


感謝GBKEE大,已經可以用了!!!!

但可否請問,之前不能用是因為甚麼問題呢?

此外,若我還想再增加儲存格,是否只要改動儲存格範圍就可以了?

因為我今天確認可以用之後,想說多加幾格試試看,為了便於觀看,我空了一整行當作分隔線,之後才增加我的儲存格

也就是說我是這樣使用的  --->>   資料 | 空格|資料

結果它依舊只會更新最早指定的那些儲存格,這是因為我中間有空格的關係嗎?還是其實並沒有差別?

再次感謝您
作者: GBKEE    時間: 2010-7-6 17:41

回復 9# j1221
Set TimeRange = .[A:A].Find(Format(TimeSerial(Hour(Time), Minute(Time), 0), "hh:mm"), LookIn:=xlValues) 多了一個h   因為 儲存格時間格式是 h:mm

改成直接尋找時間就不容易出錯
Set TimeRange = .[A:A].Find(TimeSerial(Hour(Time), Minute(Time), 0), LookIn:=xlFormulas)

也就是說我是這樣使用的  --->>   資料 | 空格|資料 ???  不太暸解 請附檔看看
作者: j1221    時間: 2010-7-6 21:14

回復 10# GBKEE


感謝您的解答

第二個問題請您查閱附檔,我加上了均買、均賣兩個簡單的計算在sheet1,然後跟之前一樣,希望在sheet2按照每分鐘記錄下來

今天開盤的時候試,發現新增的欄位沒辦法記錄下來(也就是附檔中的J2、K2)只有舊的欄位可以按每分鐘紀錄

今天的紀錄被我腦殘洗掉了....Orz

再次謝謝您這麼熱心的幫忙,真的太感動了
作者: j1221    時間: 2010-7-7 09:07

回復 10# GBKEE


GBKEE大,我的問題解決了

是我自己腦殘 Rng.Value = R.Offset(, 1).Resize(, 6).Value沒做相對應的更動,難怪不會記錄.....

這樣就不用勞煩您了

真的謝謝你的熱心幫助,感謝您
作者: 7777    時間: 2010-9-6 16:32

GBKEE大
本人  也有類似的問題  借此一問
本人的資訊源 是來至永豐金的易利得軟體 ( 接收 大台指 資料 )
內容如下:

Dim i As Single
Private Sub Workbook_Open()

  Application.OnTime Now + TimeValue("00:00:05"), "ThisWorkBook.ExeSelf"
End Sub
Private Sub ExeSelf()
  On Error Resume Next
  i = i + 1
  If i = 1 Then
  Sheets(1).Cells(1, 1) = Date
  i = i + 1
  End If
  Sheets(1).Cells(i, 2) = Time
  Sheets(1).Cells(i, 3) = Sheets(2).Cells(2, 1)
  Sheets(1).Cells(i, 4) = Sheets(2).Cells(2, 2)
  Sheets(1).Cells(i, 5) = Sheets(2).Cells(2, 3)

  Application.OnTime Now + TimeValue("00:00:05"), "ThisWorkBook.ExeSelf"
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  On Error Resume Next
  Application.OnTime Now + TimeValue("00:00:05"), "ThisWorkBook.ExeSelf", , False
End Sub


問題是:
一啟動檔案,資料就開始接收
非開盤時間沒有資料下,仍然在跑

可否能   我8:30開起檔案
8:45 後才開始  接收資料
13:45 後 就 結束  接收資料

謝謝!!
作者: Hsieh    時間: 2010-9-6 18:43

回復 13# 7777
這樣試試看
  1. Dim i As Single
  2. Private Sub Workbook_Open()
  3.   Application.OnTime TimeValue("08:45:00"), "ThisWorkBook.ExeSelf"
  4. End Sub
  5. Private Sub ExeSelf()
  6.   On Error Resume Next
  7.   If TimeValue(Now) > TimeValue("13:45:00") Then Exit Sub
  8.   i = i + 1
  9.   If i = 1 Then
  10.   Sheets(1).Cells(1, 1) = Date
  11.   i = i + 1
  12.   End If
  13.   Sheets(1).Cells(i, 2) = Time
  14.   Sheets(1).Cells(i, 3) = Sheets(2).Cells(2, 1)
  15.   Sheets(1).Cells(i, 4) = Sheets(2).Cells(2, 2)
  16.   Sheets(1).Cells(i, 5) = Sheets(2).Cells(2, 3)
  17.   Sheets(1).Cells(i, 6) = Sheets(2).Cells(2, 4)
  18.   Application.OnTime Now + TimeValue("00:00:05"), "ThisWorkBook.ExeSelf"
  19. End Sub
複製代碼

作者: 7777    時間: 2010-9-8 19:04

Hsieh 大

太棒了!!

由於 昨天太趕  來不及測試

今天 測試起來 正確無誤

在此 真的~ 超級萬分感謝!!



二.
但是 存檔後 再次進入

預計 想修改 秒數

但在 程式碼編輯器內 的資料

卻變不見了 是 空的ㄝ

再次請教
作者: Hsieh    時間: 2010-9-8 19:30

已經農曆8月,怎麼還會有靈異事件?
作者: 7777    時間: 2010-9-9 14:09

嘿嘿!!  今天 又正常  

不明原因  有如  "消失的密室"  

還是 感謝!!  Hsieh大
作者: humanbondage    時間: 2010-9-15 22:06

小弟初來乍到,也因為想開始透過dde,利用vba的程式將想記錄的固定時間資料存取下來做一些運算
很高興有這麼多高手在此熱心分享
希望能多多學習,謝謉
作者: wearnks    時間: 2010-9-18 09:46

回復 16# Hsieh
請問版主:1.若使用EXCEL DDE+VBA 紀錄期貨資料應該要有哪些條件?  
               2.若使用 (KGI全球通I3_Beta版)+excel2007的DDE數據每5分鐘自動記錄一筆資料應該如何寫?(我沒有VBA的基礎)不好意思。  謝謝。
作者: swapjj    時間: 2010-11-9 12:41

真是厲害的GBKEE 哥哥,雖然我完全看不懂,不過看得出邏輯架構相當完整
看來小弟還有好多牆要去撞,才能將EXECL到達運用自如的火侯
佩服~佩服~~
作者: zenoplay    時間: 2010-12-1 16:03

真是強押!
給他有看沒有懂
我會盡快把他弄懂
作者: chern1008    時間: 2010-12-6 14:25

好厲害!! 謝謝! 
作者: geohsu    時間: 2011-1-7 13:45

太感激了 ! 也太感動了 !
我在一直在尋找這個問題的解答
於在這兒找到了
作者: skybbs    時間: 2011-1-16 11:46

各位大家好,

因為小弟沒有VBA經驗, 在拜讀以上文章之後還是霧煞煞.
不知道要把DDE的資料記錄下來的方法除了使用VBA之外,是否可以使用EXCEL函數來達成呢 ?
作者: skybbs    時間: 2011-1-16 19:35

早上發文後看了許久EXCEL的書籍, 看起來函數應該無法達成將DDE每筆紀錄在Excel的功能,
還是需要靠VBA.

我想要達到的功能與發問者"J1221"先生不太一樣(我使用EasyWin DDE),
以下為我的條件問題, 希望各位高手可以解答.
1.抓取EasyWin DDE中的時間當作數值紀錄標準, 如附件"C6"
2.依照C6的時間帶出每分鐘的買賣資料"E6" & "F6" (非本機電腦時間)
3.將E6 & F6每分鐘的時間紀錄到I2 ~ I273 & J2 ~ J273

逛了一下午的書局, 簡單的寫了一個Sample.
因為我不知道要怎麼設回圈, 如果按照最簡單的方式, 每一分鐘判斷一次, 要寫271個判斷式.
不知道各位高手是否有方法可以減少程式碼的方式呢 ?

謝謝. (隨信附上我的EXCEL檔)
[attach]4413[/attach]
作者: Hsieh    時間: 2011-1-16 22:34

回復 25# skybbs
  1. Private Sub Worksheet_Calculate()
  2. t = Format(TimeValue(Format([C6], "00:00:00")), "hh:mm:ss")
  3. Set a = Range("H:H").Find(t)
  4. If Not a Is Nothing Then a.Offset(, 1).Resize(, 3) = Array([E6], [F6], [E6] - [F6])
  5. End Sub
複製代碼

作者: skybbs    時間: 2011-1-17 13:00

本帖最後由 skybbs 於 2011-1-19 20:22 編輯

回復 26# Hsieh

感謝Hsieh的回覆, 因為昨天我想試一下我的想法是否可行, 所以把判斷式都Key了.
今天一早看到謝大的回覆, 有下面幾點與早上測試VBA部份的問題希望謝大可以撥空回覆.

1. 我把從DDE時間格改為B6, 從09:00開始每一分鐘把D6&E6的資料Copy到H2.I2.
    09:01時Copy到H3.I3, 09:02時Copy到H4.I4依此類推.
    請問謝大的程式要怎麼可以套到我的VBA程式裡 ? 有哪些部份可以刪除的 ?

2. 在我的Sheet1裡都是資料, 所以我把sheet1的資料在Sheet2裡畫圖, 但是發現如果畫面沒有在Sheet1時VBA的程式就不會記錄資料.
    請問這個有解嗎 ?

3. 這個程式要多久(目前我設定3秒)執行一次會比較恰當呢 ?

隨信附上EXCEL檔案, 煩請謝大幫忙看一下. 謝謝.
[attach]4423[/attach]
作者: JERRYHUANG123    時間: 2011-1-17 13:12

Private Sub Workbook_Open()
Sheet2.[B7:J307] = ""
If Time >= TimeValue("08:45:00") And Time <= TimeValue("13:45:00") Then
change
Else
Application.OnTime "08:45:00", "ThisWorkbook.change"
End If
End Sub


Private Sub change()
    Dim TimeRange As Range, Rng As Range, R As Range
    With Sheet2
        Set TimeRange = .[A:A].Find(TimeSerial(Hour(Time), Minute(Time), 0), LookIn:=xlFormulas)
        Set Rng = TimeRange.Offset(, 1).Resize(1, 7)
    End With
    Rng.Value = Sheet1.[N3:T3].Value
    If Time > TimeValue("13:45:00") Then Exit Sub
    Application.OnTime Now + TimeValue("00:01"), "ThisWorkbook.change"
End Sub

這是我使用的程式碼
我Sheet1 是在接收dde加運算的  都有正常
且資料都有出來
而Sheet2就是把每分鍾的資料存起來
但發現  有時有1~3分鍾沒有抓到資料
就變成空白  不曉得是什麼原因呢
作者: skybbs    時間: 2011-1-17 16:57

Hi Jerry,

今天我用我的VBA在作測試, 發現有如下動作時會無法記錄資料, 給您參考.

1. 如果不是在該sheet時, VBA好像不會動作. (最小化OK)
2. 如果開另外一個Excel在做別的事情時, 好像VBA也不會動作.

以上是我今天的發現, 提供參考.
作者: 小俠客    時間: 2011-1-17 17:33

大家好!我是在網上找資料時發現舊壇的一個post而到這兒的:
http://gb.twbts.com/index.php?topic=9871.0
我覺得這正是我希望找到的答案,也可能與大家討論的東西有關,可惜我看不到附件呢...
作者: JERRYHUANG123    時間: 2011-1-17 18:03

HI skybbs
那我明天再來試看看 你的方法
謝謝你的分享
作者: skybbs    時間: 2011-1-17 21:47

Hello Jerry,

我知道我的程式為什麼會缺資料了, 應該只要加入如下碼應該就可以解決了.
Worksheets("sheet1").Activate
作者: skybbs    時間: 2011-1-24 13:40

經過 #25樓, 謝大的指導與這幾天的K書, 終於把程式內容縮短且簡單改寫.
但是會遇到如下問題:

1.  如果同時有開其他EXCEL檔時, 且沒有加上 "Worksheets("sheet1").Activate"的話Data無法Update且會有錯誤.
     但是如果加上了"Worksheets("sheet1").Activate", 開第二個或第三個以上的EXCEL檔時會依照時間一直跳到跑到Sheet1.
     Q: 請問在同時開兩個以上的EXCEL時, 有沒有可以讓資料自動update, 且不要一直跑道Sheet1的方法 ?

2. 因為參照時間的儲存格在09:00:00時所顯示的是90000, 一直到10:00:00時才顯示100000
    若使用 " t = Format(TimeValue(Format([C6], "00:00:00")), "hh:mm:ss")" 時, 90000 - 95900這段期間無法將data寫入.
    100000 - 125900正常. 130000 - 133100無法將data寫入.
    若使用 " t = Format(TimeValue(Format([C6], "00:00:00")), "h:mm:ss")" 時90000 - 125900可以正常寫入data.
    130000 - 133100無法正常寫入data, 必須在"G"行的儲存格使用文字方式才可以, 也就是子行輸入('13:00:00).
    Q: 以上請問是有甚麼衝突嗎, 是否有方法解決 ?

以上請各位先進不令賜教.

[attach]4498[/attach]
作者: JERRYHUANG123    時間: 2011-2-7 14:53

Private Sub Workbook_Open()

If Time >= TimeValue("09:45:00") And Time <= TimeValue("16:05:00") Then
Sheet2.[B7:J307] = ""
change
Else
Application.OnTime "09:45:00", "ThisWorkbook.change"
End If
End Sub


Private Sub change()
    Dim TimeRange As Range, Rng As Range, R As Range
    With Sheet2
        Set TimeRange = .[A:A].Find(TimeSerial(Hour(Time), Minute(Time), 0), LookIn:=xlFormulas)
        Set Rng = TimeRange.Offset(, 1).Resize(1, 7)
    End With
    Rng.Value = Sheet1.[N3:T3].Value
    If Time > TimeValue("16:05:00") Then Exit Sub
    Application.OnTime Now + TimeValue("00:01"), "ThisWorkbook.change"
End Sub


請問 我想把這個dde設成港股的時間
前面都很正常可以抓
可是到了13:59分之後
資料都抓不過來了
Sheet1的資料 還有在變更
Sheet2就完全沒有動靜
不曉得是什麼原因呢
謝謝
作者: JERRYHUANG123    時間: 2011-2-9 09:39

請問一下
從券商軟體接收資料
dde有時侯會停住
就是資料接收不了
不會自已更新了
一開始的時侯都 正常 有時侯到中間才會這樣  時間不一定
請問我抓的資料量還滿多的  不知會是不是會影響
股票有200多檔
謝謝
作者: nakatafire    時間: 2011-4-2 23:25

如果用plot Relative Strength Index 可以嗎??
作者: minsoonchen    時間: 2011-11-18 20:58

這邊的東西實在太讚哩~~  是我要的!!!

研究~研究~
作者: a144280    時間: 2011-11-26 19:59

真是高深的學問.來這裡學了點.感謝大大分享
作者: bubu1019    時間: 2011-12-8 14:17

如果改成每秒紀錄要如何寫呢?
作者: fei6999    時間: 2011-12-12 11:27

我也很喜歡這裡!可惜還不夠資格下載檔案
只好再多努力一下!
作者: j1221    時間: 2011-12-28 23:13

回復 39# bubu1019

Hello~

改成每秒的話,用這個:
  1. Private Sub change()
  2.     Dim TimeRange As Range, Rng As Range, R As Range
  3.     With Sheet8
  4.         Set TimeRange = .[A:A].Find(TimeSerial(Hour(Time), Minute(Time), Second(Time)), LookIn:=xlFormulas)
  5.         Set Rng = TimeRange.Offset(, 1).Resize(1, 15)
  6.     End With
  7.     Rng.Value = Sheet1.[B8:P8].Value
  8.       
  9.     If Time > TimeValue("13:45:00") Then Exit Sub
  10.     Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.change"
複製代碼
但是記得也要把你的時間從hh:mm改成hh:mm:ss喔!

請試試看吧!
作者: sjy039    時間: 2012-2-27 00:05

小弟初來乍到,也因為想開始透過dde,利用vba的程式將想記錄的固定時間資料存取下來做一些運算
很高興有這麼多高手在此熱心分享
作者: veign911    時間: 2012-3-14 10:15

我也想學耶.真想來試試.可是看不太懂!!!!
作者: minghg    時間: 2012-8-21 21:51

太感謝.找了好久vba的寫法 但權限不足 無法下載 繼續學習
作者: heavenweaver    時間: 2012-9-18 20:24

我也是權限不足無法下載,只能看看在旁邊羨慕與觀摩。
作者: redeemer    時間: 2012-12-4 03:47

可惜附件無法下載,先進的修改無法參照,實在是有看沒有懂。
作者: barrykuo    時間: 2013-2-24 12:04

這裡實在太精采了,我想學習學習,準備利用來使用卷商的RTD 數據記錄在excel裡,不知道可以這樣使用嘛?
作者: j1221    時間: 2014-2-5 13:59

回復 10# GBKEE

GBKEE大,不好意思,又來麻煩你。

之前請叫過您關於每分鐘記錄DDE的數據,現在我想要將它改成每5分鐘記錄一次,所以更動了一下程式碼。

但是出現「沒有設定物件變數或 With 區塊變數 (錯誤 91)」的訊息.....
偵錯後,顯示有問題的部份為『Set Rng = TimeRange.Offset(, 1).Resize(1, 11)』的地方,我檢查過之前出問題的地方,但是似乎跟之前的問題不一樣(已經又您之前提供的方式改過了)。

可否再請您幫我看一下呢?請詳見附檔。(資料源已經改為元大Yeswin RTD)感謝您

[attach]17421[/attach]
作者: GBKEE    時間: 2014-2-5 16:56

本帖最後由 GBKEE 於 2014-2-5 16:58 編輯

回復 48# j1221
因程式的 FIND 的時間 不一定落在00,05,10,15....分鐘的時間上
導致工作表A欄FIND不到而造成錯誤
  1. Dim xTime As String  '宣告為字串型態 僅ThisWorkbook模組的程序可用
  2. Private Sub Workbook_Open()
  3.     Sheets("TXF1").[B7:P19000] = ""
  4.     Sheets("MXF1").[B7:P19000] = ""
  5.     Sheets("EXF").[B7:P19000] = ""
  6.     Sheets("FXF").[B7:P19000] = ""
  7.     Sheets("TWT").[B7:P19000] = ""
  8.     Sheets("TWO").[B7:P19000] = ""
  9.     If Time >= TimeValue("08:45:00") And Time <= TimeValue("13:45:00") Then
  10.         '*** 營業時間內 不一定在 00,05,10,15....的分鐘上  ******
  11.         xTime = Minute(Time) - Minute(Time) Mod 5       '落在上一個 5分鐘 ,Mod:兩數相除的餘數
  12.         xTime = Format(TimeSerial(Hour(Time), xTime, 0), "h:mm:ss")
  13.         change
  14.     Else
  15.         xTime = "08:45:00"
  16.         Application.OnTime TimeValue(xTime), "ThisWorkbook.change"
  17.     End If
  18. End Sub
  19. Private Sub change()
  20.     Dim TimeRange As Range, Rng As Range, R As Range
  21.     ' ***  Time 時間點不一定落在5分鐘上 ********
  22.     'xTime為落在 00,05,10,15....的分鐘上的時間,可確定一定找得到
  23.     Set TimeRange = Sheets("TXF1").[A:A].Find(xTime, LookIn:=xlValues)  '改為 搜尋內容
  24.     Set Rng = TimeRange.Offset(, 1).Resize(, 11)
  25.     Rng.Value = Sheets("Main").Range("C9:M9").Value
  26.    
  27.     Set TimeRange = Sheets("MXF1").[A:A].Find(xTime) '接下的Find會依據上一次Find的選項來搜尋
  28.     Set Rng = TimeRange.Offset(, 1).Resize(, 11)
  29.     Rng.Value = Sheets("Main").Range("C11:M11").Value
  30.    
  31.     Set TimeRange = Sheets("EXF").[A:A].Find(xTime)
  32.     Set Rng = TimeRange.Offset(, 1).Resize(, 11)
  33.     Rng.Value = Sheets("Main").Range("C12:M12").Value
  34.    
  35.     Set TimeRange = Sheets("FXF").[A:A].Find(xTime)
  36.     Set Rng = TimeRange.Offset(, 1).Resize(, 11)
  37.     Rng.Value = Sheets("Main").Range("C13:M13").Value
  38.    
  39.     Set TimeRange = Sheets("TWT").[A:A].Find(xTime)
  40.     Set Rng = TimeRange.Offset(, 1).Resize(, 17)
  41.     Rng.Value = Sheets("Main").Range("C2:U2").Value
  42.    
  43.     Set TimeRange = Sheets("TWO").[A:A].Find(xTime)
  44.     Set Rng = TimeRange.Offset(, 1).Resize(, 20)
  45.     Rng.Value = Sheets("Main").Range("C3:U3").Value
  46.    
  47.     If Time > TimeValue("13:45:00") Then Exit Sub
  48.    
  49.     xTime = Minute(Time) + 5 - Minute(Time) Mod 5               '落在下一個5分鐘
  50.     xTime = Format(TimeSerial(Hour(Time), xTime, 0), "h:mm:ss") '落在 00,05,10,15....的分鐘的時間上
  51.     ' Now + TimeValue("00:05:00") ->不一定是落在 00,05,10,15....的分鐘上
  52.     Application.OnTime TimeValue(xTime), "ThisWorkbook.change"  '確實在下一個5分鐘點上執行
  53. End Sub
複製代碼

作者: c_c_lai    時間: 2014-2-5 17:26

回復 48# j1221
以 "TXF1" 為例:
  1.     With Sheets("TXF1")
  2.         Set TimeRange = .[A:A].Find(TimeSerial(Hour(Time), Minute(Time), Second(Time)), LookIn:=xlFormulas)
  3.         Set Rng = TimeRange.Offset(, 1).Resize(, 11)
  4.     End With
  5.     Rng.Value = Sheets("Main").Range("C9:M9").Value
複製代碼
建議修改為:
  1.     With Sheets("TXF1")
  2.         Set TimeRange = .[A:A].Find(TimeSerial(Hour(Time), Minute(Time), Second(Time)), LookIn:=xlFormulas)
  3.         If Not TimeRange Is Nothing Then
  4.             TimeRange.Offset(, 1).Resize(, 11) = Sheets("Main").Range("C9:M9").Value
  5.         End If
  6.     End With
複製代碼
Range.Find() 會試圖找到該項資訊的第一個儲存格,如果沒有找到符合的儲存格,
則此方法 "傳回値" 會傳回 Nothing。
當 TimeRange 值為 Nothing, 你原本的寫法則會出錯。
作者: j1221    時間: 2014-2-5 19:03

本帖最後由 j1221 於 2014-2-5 19:05 編輯

回復 49# GBKEE



感謝GBKEE大,可以用了!!:D

只是有一個問題,excel在填入資料時,一次會填入當前儲存格和下一格(比如說目前是18:45,它會同時填入18:50和18:45),請問為什麼會這樣呢?(煩請見下圖)


作者: GBKEE    時間: 2014-2-5 19:44

回復 51# j1221
沒有這問題 上傳你的檔案看看
作者: j1221    時間: 2014-2-5 19:59

本帖最後由 j1221 於 2014-2-5 20:08 編輯

回復 52# GBKEE


真的耶,我重新開啟之後就一切正常了....感謝GBKEE大∼∼:D
作者: j1221    時間: 2014-2-5 20:00

回復 50# c_c_lai

謝謝c_c_lai 大!又多學了一招!
作者: j1221    時間: 2014-3-16 13:04

回復 52# GBKEE

GBKEE 大,抱歉又來麻煩你。之前向你請教的「每五分鐘紀錄一次數據」的檔案,我使用上一直沒有問題。

但是我之前都是在開盤後,才有時間把excel打開,使用上沒有問題。

但這兩天,我都在盤前(約8:30)的時候打excel打開,但每到了8:40(我有改變了紀錄的時間,希望從8:40開始),就會跳出「沒有設定物件變數或 With 區塊變數」的訊息。

我找了半天,都沒有發現問題(因為我基本上沒有更動之前的範例,只是多增加了幾個其他資料格,時間序列也沒有問題),可否請你幫忙看看?

煩請參閱附檔,謝謝你!

[attach]17777[/attach]
作者: winwin    時間: 2017-12-6 15:51

Sheets("TXF").[AC7:AL100] = ""
'    Sheets("Stock").[I7:AG100] = ""
'   'Sheets("TWO").[B7:S19000] = ""
程式碼中, 你砍了Stock 及TWO 的活頁簿; 清空資料會出現問題
作者: winwin    時間: 2017-12-8 08:01

回復 55# j1221


    這個檔案的程式, 只有第一根(8:50) 的最高、最低是正確的;

8:55分開始, 最高、最低都是當日的最高、最低, 不會再改變....................

目前只有紀錄下第5分K時的狀態。

請問有正確完整狀版,可以參照嗎?  感謝!




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