返回列表 上一主題 發帖

[分享] 盤中 DDE 存檔與 VBA 的實際應用範例

本帖最後由 ajagow 於 2012-4-14 20:51 編輯

DDE-4-14.rar (9.1 KB) 回復 10# c_c_lai
請幫忙,謝謝。
EXCEL 已經很難了,想不到VBA更難
益謝兒

TOP

本帖最後由 GBKEE 於 2012-4-15 06:39 編輯

回復 11# ajagow
你附檔的 ThisWorkBook. 物件模組 中並沒有 onStarter 這程式
當然程式會找不到   onStarter 程序是在 Module1 模組的中
改成  Application.OnTime (Now + Sheets("工作表2").Range("A4").Value), "onStarter"   
還有  Private Sub Workbook_Open() 如圖

TOP

回復 11# ajagow
欄位的確認非常重要,你的語法我稍加修改了一下,大體上也都不錯,只是時間欄位的認定模糊而已,
我將修改之處用  ' ******** 加以標示出來,方便你瞭解無法執行的原因,下回你就會實際應用了。
附上已執行的範例,以及你的修改後之程式碼 (因你尚無法下載,所以將它貼示出來),你將程式碼複製到 ThisWorkbook 內,而將模組移除掉。
  1. ' 盤中 DDE 存檔的實際應用範例
  2. Option Explicit
  3. Dim actEnabled As Boolean
  4. Dim CIndex As Single

  5. Private Sub Workbook_Open()
  6.     If (Sheets("工作表1").Range("A1").Value = "") Then Sheets("工作表1").Range("A1").Value = "01:11:00"   ' 假設A1欄位為空白,則寫入開盤起始時間
  7.     If (Sheets("工作表1").Range("A2").Value = "") Then Sheets("工作表1").Range("A2").Value = "13:45:59"   ' A2欄位亦同。(此兩欄紀錄起始終止時間)
  8.     If (Sheets("工作表1").Range("A3").Value = "") Then Sheets("工作表1").Range("A3").Value = 0            ' 紀錄最後資料匯入之列號 (Rows)。
  9.     If (Sheets("工作表1").Range("A4").Value = "") Then Sheets("工作表1").Range("A4").Value = "00:00:10"   ' 紀錄資料匯入相隔時間,如每隔十秒寫入一次。

  10.     ' If (TimeValue(Now) > Sheets("工作表1").Range("A2").Value) Then     ' ********  你打算何時開始運作?13:45:59 以後?
  11.     If (TimeValue(Now) > Sheets("工作表1").Range("A1").Value) Then       ' 如果目前時間業已超過A2的時段,則呼叫.......
  12.         ' Call stopProcedure         ' ***** 時間到了,難道你不要執行?
  13.         Call startProcedure
  14.     Else                                                                  ' 反之,則呼叫.......
  15.         Call stopProcedure
  16.         ' Call startProcedure        ' ***** 請問你是要它在 14:00 ~ 01:09 間執行?
  17.     End If
  18. End Sub

  19. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  20.     On Error Resume Next
  21.     Call actStop
  22. End Sub

  23. Sub startProcedure()       ' 保留作為控制項之應用程序,如按鈕之巨集應用等。
  24.     Call actStart
  25. End Sub

  26. Sub stopProcedure()        ' 保留作為控制項之應用程序,如按鈕之巨集應用等。
  27.    Call actStop
  28. End Sub

  29. Sub newTitle()
  30.    ' 套上你欲匯入資料的表頭名稱
  31. End Sub

  32. Sub Starter()
  33.     If (actEnabled = True And TimeValue(Now) >= Sheets("工作表1").Range("A1").Value And TimeValue(Now) <= Sheets("工作表1").Range("A2").Value) Then
  34.         CIndex = Sheets("工作表1").Range("A3").Value

  35.         If (CIndex = 0) Then Call newTitle  '假設newTitle程序(由使用者自行定義)是將第一列的資料抬頭名稱寫入到工作表2。 如:日期、時間、R1C5的對應欄位資料等。

  36.         Sheets("工作表1").Range("A3").Value = CIndex + 1       ' 紀錄列號加一。
  37.         Sheets("工作表2").Cells(CIndex + 2, 1).Value = Date
  38.         Sheets("工作表2").Cells(CIndex + 2, 2).Value = TimeValue(Now)
  39.         ' Sheets("工作表2").Cells(CIndex + 2, 3).Value = Sheets("工作表1").Cells(1, 5).Value
  40.         Sheets("工作表2").Cells(CIndex + 2, 3).Value = Sheets("工作表1").Cells(6, 1).Value         ' 測試, 因今天不賣魚, 你的指定欄位有點..........

  41.         '

  42.         ' 複製從券商DDE匯入之相對應位置資料,如 R1C5 對應的可能是收盤價等等。

  43.         '
  44.         CIndex = Sheets("工作表1").Range("A3").Value      ' ********* 增加部分  (Counter 要加一,否則永遠為零)
  45.     End If
  46. End Sub

  47. Sub onStarter()
  48.     Call Starter
  49.     If actEnabled Then Call actStart
  50. End Sub

  51. Sub actStart()
  52.     actEnabled = True
  53.     ' Application.OnTime (Now + Sheets("工作表2").Range("A4").Value), "ThisWorkBook.onStarter"   ' ***** 工作表 2 的 A4 哪來個時間設定?
  54.     Application.OnTime (Now + Sheets("工作表1").Range("A4").Value), "ThisWorkBook.onStarter"     ' 寫入資料的排程 (目前是每隔十秒寫入一次)
  55. End Sub

  56. Sub actStop()
  57.     actEnabled = False

  58.     On Error Resume Next
  59.     Application.OnTime Now, "ThisWorkBook.onStarter", , False
  60. End Sub
複製代碼
DDE-4-14 盤中 DDE 存檔與 VBA 的實際應用範例.rar (14.01 KB)

TOP

本帖最後由 ajagow 於 2012-4-15 17:24 編輯

回復 14# c_c_lai
感謝  版主的說明及c c lai 修改的程式
真的會自己跑
太神了
膜拜中
益謝兒

TOP

本帖最後由 et2002 於 2012-4-16 00:35 編輯

不好意思.小弟不太明白 EXCEL
如果我的 DDE 位置是 'MT4'|ASK!XAUUSD
那麼 應該加入到那?
問題已解決

TOP

回復 13# c_c_lai


    C  C  LAI   大大
我現在有一個問題?就是EXCEL 在跑的有時候會自動停,時間還是繼續流逝。有些資料沒有記錄到
那如果把想把時間切成五個小時來個別記錄不知道有沒有辦法
08:45:00~09:44:59
09:45:00~10:44:59
10:45:00~11:44:59
11:45:00~12:44:59
12:45:00~13:44:59
來抓取小時的成交價
這個很難,我去分兩段,只看到EXCEL的滑鼠一直畫圓圈.電腦就當著。
益謝兒

TOP

回復 16# ajagow
請您留意看看,在您程式執行的階段是否同時會去執行別支 Excel 程式?
如果有的話,請勿操作別支 Excel,因為它們的執行序可能被干擾到了。

TOP

回復 17# c_c_lai


    那請較一下,若同時取用不同訊號來源時,要如何規避您所說的錯誤風險呢?

TOP

回復  c_c_lai


    那請較一下,若同時取用不同訊號來源時,要如何規避您所說的錯誤風險呢?
ribbits 發表於 2012-9-9 11:07

非 "不同訊號來源",我指的是盡可能不要在同一時段去
同時執行一支以上帶有VBA程式執行碼的 Excel 檔案。
附上圖片希望能幫助你了解:

你可以在一表單內同時匯入一支以上不同 DDE 訊號來源,這絕對是 OK 的,
但是如果你在同一時段同時執行一支以上類似如此之VBA
執行程式,VBA 程式極有可能會隨時莫名其妙地被中斷 (Interrupt)。
(我個人體驗,屢試不爽)    因此才會如此建議的。

TOP

回復 23# c_c_lai


        所以在執行時段上若每15分記錄資料之EXCL VBA程式須集中在單一EXCEL內,而不同時段的VBA程式則不受影響了嗎?
比如國外期貨的時段就與國內不同,因此記錄的EXCEL VBA可個別開啟嗎?
因為時間差不同,只要取用當地時間來錯開就不會出錯了吧?

TOP

        靜思自在 : 多做多得。少做多失。
返回列表 上一主題