VBA的排程應用心得

(本文純粹討論架構, 技術與語法部分只有提部分關鍵字)

VBA是微軟提供給Office系列內的程式, 語法與VB相同, 只是功能上採用直譯式.

VBA本身有提供OnTime的指令, 可以指定時間執行特定副程式(Sub), 而進入點就可能透過開啟Excel檔案(Workbook.Open)後, 啟動一個"時鐘(自行命名為Clock, 避開Timer保留字)"的副程式, 而這個副程式結尾加上OnTime再設定"下一秒"啟動一次自己(Clock), 就可以形成每秒執行一次Clock的循環.

由VBA OnTime啟動的副程式, 也可以指定停止執行, 但是停止的語法必須指定原本排的時間, 如果啟動的語法是用Now()+TimeValue("00:00:01"), 因為啟動或停止執行時間不同, 加上TimeValue("00:00;01")後也會不同, 所以會造成VBA找不到要停止的排程的情況.

所以如果要有停止的措施, 就需要將啟動與停止的時間, 記錄於一個變數(個人命名為NextSecond)內, 最好是public屬性, 預約下次執行時, 先將預定執行時間記錄在變數內, 這樣如果要停止排程, 就可以使用變數內記錄的時間, 也才可以正常停止.

同一個Excel內, 有一致的啟動時間的重要性, 在於很多資料的整理, 可能有時間前後的關係, 如果分成很多個副程式各自執行, 可能會因為時間差而造成資料抓不到; 如果時間軸一致, 就可以改用這樣的架構:

  1. 只有一個主要的時間軸, 每秒執行一次.
  2. 主要的時間軸內, 再呼叫其他的"副程式", 這邊就可以用Call或OnTime Now()+TimeValue("00:00:01"), 啟動另一個副程式, 直接檢查資料撈取的條件是否完成, 若完成再進行分析等動作.
  3. 如果要停止副程式, 就在副程式內設定停止的條件.
  4. 如果要停止時間軸, 就可以用OnTime NextSecond, "Clock", Schedule:=False停止