Board logo

標題: [發問] 如何將DEE連結到Excel的資料,依照想要的時間記錄下來. [打印本頁]

作者: aries    時間: 2010-11-12 00:37     標題: 如何將DEE連結到Excel的資料,依照想要的時間記錄下來.

版主大大,各位前輩,大家好~

有個問題想請教一下大大們:
1.我把一個看盤軟體的三個數值用DDE導出到Excel裡了,現在想要將這三個數值,依照時間(例如:每1分鐘)
從Sheet1的(A2,B2,C2)要記錄到Shee2的(A2,B2,C2),然後依序往下紀錄(A3,B3,C3)(A4,B4,C4)....~.

2.另外,這個問題不知道方不方便做到,如果想要每100筆就跳回到第二列開始,譬如:
記錄到(A101,B101,C101)之後,下一筆就記錄到(D2,E2,F2),然後在依序往下紀錄(D3,E3,F3)..~

我是新手,有很多地方不懂,請見諒.
麻煩各位大大~~

附上簡單表格
[attach]3584[/attach]
作者: GBKEE    時間: 2010-11-14 18:59

本帖最後由 GBKEE 於 2010-11-14 19:01 編輯

回復 1# aries
成交價的變動一分鐘以內, 可能就有變化,或幾分鐘都沒變化.所以應設計為成交價有變動,時紀錄下來.
看盤軟體,傳回成交價的變動時,會引發工作表的重算Calculate   
請依照下列步驟試試看
1指令- 工具-選項-計算 - 計算方式   勾選  [自動] 如圖

[attach]3605[/attach]

2請將程式碼複製到VBA視窗 的 Sheet1物件裡
  1. Private Sub Worksheet_Calculate() '這是Sheet1預設的重算觸動事件程式
  2.     Static i%
  3.     'Static 陳述式  在程序層次中用來宣告變數並配置儲存空間。以 Static 陳述式宣告的變數,在程式執行期間,會一直保留內容。
  4.      With Sheet2.Cells(Rows.Count, i + 1).End(xlUp).Offset(1).Resize(1, 3)
  5.         If .Cells(1, 3).Offset(-1) <> [C2] Then   '成交價有異動時的條件成立時
  6.             .Value = [A2:C2].Value                '將Shse1的日期,時間,成交價記錄到Sheet2
  7.         End If
  8.         If .Row = 100 Then i = i + 3     '到第100列時右移3欄
  9.     End With
  10. End Sub
複製代碼
3於開盤前開啟檔案 試試看
作者: aries    時間: 2010-11-15 08:45

回復 2# GBKEE


    謝謝 GBKEE 板主大大的解答,我試試看.
作者: aries    時間: 2010-11-16 13:09

本帖最後由 aries 於 2010-11-16 13:12 編輯

回復 2# GBKEE


   版主大大,我開啟檔案執行巨集之後,出現執行階段錯誤'13': 型態不符合,
   偵錯之後,跳出程式碼 顯示這段
   If .Cells(1, 3).Offset(-1) <> [C2] Then   '成交價有異動時的條件成立時   
   然後我在程式碼要點擊偵錯,或執行的時候,發現程式有開始在跑了.Excel檔案有開始在記錄了.
   我就關閉檔案再重新開始,還是一樣出現執行階段錯誤的訊息.
   這是哪裡的問題呢?  
   再麻煩大大了
作者: oobird    時間: 2010-11-16 13:18

If .Cells(1, 3) 把中間那個"."刪了!
作者: GBKEE    時間: 2010-11-16 15:56

回復 4# aries
給你的程式碼 執行沒有錯誤啊 請附上你的檔案看看
回復 5# oobird
If .Cells(1, 3) 把中間那個"."刪了!
你所要刪的"." 是 With Sheet2.Cells(Rows.Count, i + 1).End(xlUp).Offset(1).Resize(1, 3)範圍的.Cells(1, 3).Offset(-1)
刪掉後的程式碼 If Cells(1, 3).Offset(-1) <> [C2] Then   依然會產生應用程式或物件定義上的錯誤
作者: aries    時間: 2010-11-16 20:03

本帖最後由 aries 於 2010-11-16 20:09 編輯

回復 5# oobird
      刪掉之後,在程式碼底下執行,就直接出現 GBKEE大大 說的錯誤訊息了.

回復 6# GBKEE

      附上執行之後的檔案.
      另外,其中有些記錄到第99列就跳行,有些又可以到第100列,不知是什麼問題.
      再麻煩大大了.
      謝謝各位大大的幫忙.

      [attach]3621[/attach]
作者: Hsieh    時間: 2010-11-16 22:59

可能重新佈署一下會好一點
新增一般模組
輸入程式碼
  1. Public i%
  2. Sub auto_open()
  3. With Sheet2
  4. k = .[IV1].End(xlToLeft).Column
  5. i = IIf(k = 1, 0, k - 3)
  6. If i = 0 Then .[A1:C1].Value = Sheet1.[A1:C1].Value
  7. End With
  8. End Sub
複製代碼
Sheet1模組
  1. Private Sub Worksheet_Calculate() '這是Sheet1預設的重算觸動事件程式
  2.     Dim A As Range
  3.     'Static 陳述式  在程序層次中用來宣告變數並配置儲存空間。以 Static 陳述式宣告的變數,在程式執行期間,會一直保留內容。
  4.      With Sheet2
  5.      Set A = .Cells(65536, i + 1).End(xlUp).Offset(1).Resize(, 3)
  6.      If A.Row > 100 Then i = i + 3: .Cells(1, i + 1).Resize(, 3) = [A1:C1].Value '到第100列時右移3欄
  7.      Set A = .Cells(65536, i + 1).End(xlUp).Offset(1).Resize(, 3)
  8.        If A.Cells(1, 3).Offset(-1) <> [C2] Then   '成交價有異動時的條件成立時
  9.             A.Value = [A2:C2].Value                '將Shse1的日期,時間,成交價記錄到Sheet2
  10.        End If
  11.     End With
  12. End Sub
複製代碼
[attach]3623[/attach]
作者: aries    時間: 2010-11-17 18:01

回復 8# Hsieh

感謝Hsieh版主大大,重新用過的程式碼,就都會固定到100列就換行,還有自己會增加標題列,很方便.

不過,在開啟檔案執行巨集之後,還是會出現執行階段錯誤'13': 型態不符合的視窗,我按偵錯之後,進入程式碼,
顯示 If A.Cells(1, 3).Offset(-1) <> [C2] Then   '成交價有異動時的條件成立時 這段碼底色會反黃.
而我如果不按偵錯,直接按結束,程式還是有開始執行,是可以使用的.

另外,如果這個錯誤訊息不容易解決,各位大大就不用在麻煩了.我猜測會不會是電腦或軟體的問題,而跟程式碼沒有關係.
反正原來的問題,已經有解決了.

再次感謝各位大大的幫忙指教.
作者: Hsieh    時間: 2010-11-17 18:03

本帖最後由 Hsieh 於 2010-11-17 18:13 編輯

此時的DDE是否還未傳入數據造成A2:C2出現錯誤值所致
  1. Private Sub Worksheet_Calculate() '這是Sheet1預設的重算觸動事件程式
  2.     Dim A As Range
  3.     'Static 陳述式  在程序層次中用來宣告變數並配置儲存空間。以 Static 陳述式宣告的變數,在程式執行期間,會一直保留內容。
  4.      With Sheet2
  5.      Set A = .Cells(65536, i + 1).End(xlUp).Offset(1).Resize(, 3)
  6.      If A.Row > 100 Then i = i + 3: .Cells(1, i + 1).Resize(, 3) = [A1:C1].Value '到第100列時右移3欄
  7.      Set A = .Cells(65536, i + 1).End(xlUp).Offset(1).Resize(, 3)
  8.      If IsError([C2].Value) Then Exit Sub
  9.        If A.Cells(1, 3).Offset(-1) <> [C2] Then   '成交價有異動時的條件成立時
  10.             A.Value = [A2:C2].Value                '將Shse1的日期,時間,成交價記錄到Sheet2
  11.        End If
  12.     End With
  13. End Sub
複製代碼

作者: aries    時間: 2010-11-18 10:06

回復 10# Hsieh


  感謝Hsieh版主大大,真的是這個問題,更新程式碼後已經解決了.
  真是非常感謝大大的幫忙.
作者: aries    時間: 2010-11-20 22:35

回復 10# Hsieh


    版主大大你好,我想請教一下,同樣的表跟記錄樣式,如果我想要資料相反過來紀錄,變成歷史資料一直往後推,在(A2,B2,C2)永遠的是保持最新的,
    不知道有沒有辦法?
    因為我可能會抓最新的50筆或100筆之類的數據來做一些計算(類似內容),所以想要抓取固定欄位來計算.(現在最新的數據都是一直往後推)
    再麻煩大大解惑一下. ^^


[attach]3665[/attach]
作者: Hsieh    時間: 2010-11-20 22:44

你試著錄製A2:C2插入儲存格
再填入就行了
作者: aries    時間: 2010-11-22 16:32

回復 13# Hsieh


    版主大大,請教一下,我錄製好之後,應該加入在原來程式碼中哪一個位置呢?
    我自己有試著加入執行,但是,都不是正確的結果.
    以下是錄製出來的程式碼:
    Sub Macro1()
'
' Macro1 Macro
    Range("A2:C2").Select
    Selection.Insert Shift:=xlDown
End Sub

我是新手很多不懂,真是抱歉,再麻煩大大解惑了.
作者: Hsieh    時間: 2010-11-22 21:03

回復 14# aries
  1. Private Sub Worksheet_Calculate() '這是Sheet1預設的重算觸動事件程式
  2.     Dim A As Range
  3.      With Sheet2
  4.      .[A2:C2].Insert xlShiftDown
  5.      Set A = .Cells(2, 1).Resize(, 3)
  6.      If A.Row > 100 Then i = i + 3: .Cells(1, i + 1).Resize(, 3) = [A1:C1].Value '到第100列時右移3欄
  7.      Set A = .Cells(2, i + 1).Resize(, 3)
  8.      If IsError([C2].Value) Then Exit Sub
  9.        If .[C3] <> [C2] Then   '成交價有異動時的條件成立時
  10.             A.Value = [A2:C2].Value '將Shse1的日期,時間,成交價記錄到Sheet2
  11.             Else
  12.             .[A2:C2].Delete xlShiftUp '未異動價格就刪除插入的
  13.        End If
  14.     End With
  15. End Sub
複製代碼

作者: aries    時間: 2010-11-23 09:20

回復 15# Hsieh


    謝謝版主大大,已經可以在A2~C2保持是最新資料,但是現在無法到100列之後換行,變成一直在A~C往下紀錄而已.
    抱歉,再麻煩大大了,謝謝!!
作者: Hsieh    時間: 2010-11-23 11:21

回復 16# aries
  1. Private Sub Worksheet_Calculate() '這是Sheet1預設的重算觸動事件程式
  2.     Dim A As Range
  3.      If IsError([C2].Value) Then Exit Sub
  4.      With Sheet2
  5.      i = .[IV1].End(xlToLeft).Column - 2
  6.        'If .[C3] <> [C2] Then   '成交價有異動時的條件成立時
  7.           If .Cells(65536, i).End(xlUp).Row = 100 Then i = i + 3: .Cells(1, i).Resize(, 3).Value = [A1:C1].Value
  8.           .Cells(2, i).Resize(, 3).Insert xlShiftDown
  9.           .Cells(2, i).Resize(, 3) = [A2:C2].Value '將Shse1的日期,時間,成交價記錄到Sheet2
  10.        'End If
  11.     End With
  12. End Sub
複製代碼

作者: aries    時間: 2010-11-24 09:25

本帖最後由 aries 於 2010-11-26 10:25 編輯

回復 17# Hsieh

謝謝版主大大,再打擾你了.現在可以換行了,只是換行之後最新資料也跟著換行了.
A~C變成舊資料,有辦法讓A~C都是最新的資料,而舊資料一直往A~C之後移動嗎?

另外,我執行中有出現錯誤訊息,後來發現是因為欄位不足,已經跑到IV,我就改到3000列在換行,就正常了.
抱歉,再次麻煩大大.
作者: aries    時間: 2010-11-27 14:19

本帖最後由 aries 於 2010-11-29 09:34 編輯

回復 17# Hsieh

(因為前一封一開始忘了點回復,後來才編輯加入回復碼,不確定版主大大有沒有收到訊息,在寄一次)

謝謝版主大大,再打擾你了.現在可以換行了,只是換行之後最新資料也跟著換行了.
A~C變成舊資料,有辦法讓A~C都是最新的資料,而舊資料一直往A~C之後移動嗎?

另外,我執行中有出現錯誤訊息,後來發現是因為欄位不足,已經跑到IV,我就改到3000列在換行,就正常了.
抱歉,再次麻煩大大.

(我有想過,如果在滿3000列就換行,改成滿3000列就在ABC做插入動作,是不是就可以,再麻煩大大指教.)

版主大大,我有再仔細看過,發現成交價不管有沒有異動,都會一直紀錄,不知道是哪裡的問題?
作者: aries    時間: 2010-12-7 03:45

回復 17# Hsieh


  版主大大,我想說直接用之前的不能跳行的好了,比較正常,您不用再麻煩了.
  謝謝版主大大的指教.:)




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