- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
10#
發表於 2013-1-30 08:24
| 只看該作者
回復 9# 8BQGIGIGAGA
配合你的 DDE 資料稍稍修改了一些,試試看吧!- ' DDE 資料紀錄問題
- Option Explicit
- Dim actEnabled As Boolean
- Dim i As Single
- Private Sub Workbook_Open()
- ' 以下四列資料之設定,可配合實作、或測試之目的,直接在 "sheet1" 指定之設定欄,得隨時予以異動。
- If (Sheets("sheet1").Range("BA1").Value = "") Then Sheets("sheet1").Range("BA1").Value = "08:45:00" ' 假設C6欄位為空白,則寫入開盤起始時間
- If (Sheets("sheet1").Range("BA2").Value = "") Then Sheets("sheet1").Range("BA2").Value = "13:45:59" ' D6欄位亦同。(此兩欄紀錄起始終止時間)
- If (Sheets("sheet1").Range("BB1").Value = "") Then Sheets("sheet1").Range("BB1").Value = "00:05:00" ' 紀錄資料匯入相隔時間,如每隔一分鐘寫入一次。
- If (Sheets("sheet1").Range("BB2").Value = "") Then Sheets("sheet1").Range("BB2").Value = 0 ' 紀錄已匯入資料列數。
-
- If (TimeValue(Now) > Sheets("sheet1").Range("BA2").Value) Then ' 如果目前時間業已超過 D6 的營業時段,則呼叫.......
- Call stopProcedure
- Else ' 反之在 D6 設定時間以前,則呼叫.......
- Call startProcedure
- End If
- End Sub
-
- Private Sub Workbook_BeforeClose(Cancel As Boolean)
- On Error Resume Next
- Call actStop
- End Sub
-
- Sub startProcedure() ' 保留作為控制項之應用程序,如按鈕之巨集應用等。
- Call actStart
- End Sub
-
- Sub stopProcedure() ' 保留作為控制項之應用程序,如按鈕之巨集應用等。
- Call actStop
- End Sub
-
- Sub newTitle()
- Sheets(2).[A1].Resize(, 7) = Sheets(1).[A1:G1].Value ' 套上你欲匯入資料的表頭名稱
- End Sub
-
- Sub Starter()
- Dim cIndex As Single
-
- If (actEnabled = True And TimeValue(Now) >= Sheets("sheet1").Range("BA1").Value And TimeValue(Now) <= Sheets("sheet1").Range("BA2").Value) Then
- cIndex = Sheets(2).[A65536].End(xlUp).Row
-
- If (cIndex = 1) Then Call newTitle ' newTitle 程序 (由使用者自行定義) 是將第一列的資料抬頭名稱寫入到sheet2;如日期、時間的對應欄位資料等。
-
- Sheets("sheet1").Range("BB2").Value = cIndex ' 紀錄列號。
- ' 複製從券商DDE匯入之相對應位置資料,如 A1、B1、C1、D1 對應的可能是內盤、外盤、成交、漲跌等等,以此類推。
- Sheets(2).[A65536].End(xlUp).Offset(1).Resize(, 7) = Sheets(1).[A2:G2].Value
- End If
- End Sub
-
- Sub onStarter()
- Dim nums As Integer
- Dim tmStr As String
-
- tmStr = Format(Sheets("sheet1").Range("BB1").Value, "hh:mm:ss")
- nums = (Left(tmStr, Len(tmStr) - 6) * 3600) + (Mid(tmStr, Len(tmStr) - 4, 2) * 60) + (Right(tmStr, 2) * 1)
- If (IIf(nums >= 60, Minute(TIME) * 60 + Second(TIME), Second(TIME)) Mod nums) = 0 Then ' 間隔 nums 分、秒
- If Not IsError(Sheets(1).[C2]) Then Call Starter ' 考慮每隔 ..五分鐘記錄一次
- If actEnabled Then Call actStart
- Else
- Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.onStarter"
- End If
- End Sub
- Sub actStart()
- If actEnabled Then
- ' 第二次(含)以後均以設定之 "間隔時段" 來處理執行序的作業。
- Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.onStarter"
- Else
- actEnabled = True
-
- ' 將第一次啟動時間更改為設定 "開盤時間"前,如果開啟 Excel 時,已經過了設定 "開盤時間",則一進入系統即直接去執行紀錄作業。
- If (TimeValue(Now) <= Sheets("sheet1").Range("BA1").Value) Then
- Application.OnTime (TimeValue("08:45:00")), "ThisWorkbook.onStarter"
- Else
- ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,
- ' 這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
- Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.onStarter"
- End If
- End If
- End Sub
-
- Sub actStop()
- actEnabled = False
-
- On Error Resume Next
- Application.OnTime Now, "ThisWorkBook.onStarter", , False
- End Sub
複製代碼 |
|