這篇文章是延續前幾天 股市資料庫出錯 - Excel VBA 程式除錯經驗 的文章

台股資料庫再度出錯

本來認為證交所的資料出錯是偶然發生一次性的問題,但為了避免再度發生,所以把程式的流程由一格一格儲存格搬移資料改成範圍搬移的資料,但這二天發現檔案處理完,結果資料一直卡在6萬多筆就沒了,一開始還以為是宣告變數指定為 Integer 造成的溢位問題,所以資料無法全部整理好,但試了幾天才發現不是這個問題。
整理資料由每一欄改為範圍程式碼範例

相同的問題再度出現

有了之前的經驗,就再度比對資料,果然出現了相同的問題,而且有缺資料的日期還不只一天,今天就利用了一點時間把資料全部比對完,共有五天的資料有缺,代表這不是偶然發生一次性的問題。
資料錯誤的日期

增加比對功能

所以想一想,就在程式內加上了一個比對資料的功能,預防下次再度發生相同的問題而自已也不知道一直更新資料庫。
比對資料程式碼範例

比對功能原理說明

因為在資料欄位出現空格時,使用 .End(xDown) 選取範圍會停在空格的上一欄,本來想把這部份改成設定變數直接全部資料搬移到新工作表,但想一想,這樣子剛好可以達到比對整理好的資料及原始的資料的差別,所以就用 IF 判斷二邊的資料列是否相同,如果不同的話代表原始資料又出現缺資料的情型。
資料比對錯誤會出現訊息視窗

程式碼優化加快速度

上面提到由原本的一欄一欄搬移資料的方式,處理一天的資料大約1.5秒左右,如果資料庫一直保持在最新的情型下,一天只更新一日的資料,其實不會感覺到速度太慢,但如果重新做資料庫的話,一次要處理近1000個資料,那速度上就差滿多的,而且考慮到一次一欄的話,原本的語法是找出該欄資料的最後一列填資料,這樣會造成資料出錯,所以才改為範圍搬移資料,一方面速度加快許多,另一方面如果資料有缺資料產生空格,搬移過去的資料會保留空格,這時比對的功能就發揮它的作用了,以下測試各處理100個檔案的速度來看看差別。
此為一欄一欄搬移資料的速度(秒)

此為範圍搬移資料的速度(秒)
二種方法的速度相差了10幾倍,在處理大數據時真的會相差滿多的。

增加自動對應資料源改版不同格式的功能

因為這次的問題,基本上原本的程式改完也差不多接近重做一個程式了,所以乾脆連證交所及櫃買中心三次資料欄位改版的部份一起處理,所以就寫了一個比對改版日期去對應不同資料格式的程式來處理這個部份。








6 留言

  1. 作者已經移除這則留言。

    回覆刪除
  2. 這個資料以每一格對儲存格的方式歷遍個欄位 直至整個rng 的列號結束,若改以先入陣列後再一次貼進的方式 是否會比較再快一些?

    回覆刪除
  3. 原本的方法是每一格去跑,之後改成用範圍去貼上,上面測試了100個檔案跑了11秒多,平均1個檔案跑0.11秒就完成了,真的想再快可能也感覺不到吧,因為資料庫是每天更新的,不會每次都跑幾百個檔案,我是認為不用為了每天能再擠出幾毫秒的速度再花太多時間去改程式了

    回覆刪除
  4. 也沒錯 那應該效能比還不至於相差大 除了多到上萬筆的資料與複雜程序 是可不用大費周張再改。

    回覆刪除
    回覆
    1. 從你的回答來看,你應該也是個程式高手哦~~!!

      刪除
  5. 沒這事,還差您很多,只懂一些較粗淺的語法,也不算是正科班程式設計師,以前資工學過c 與java 但因為頭腦不太靈光 所以就沒再深究。 vba 是工作上會經常用到,就慢慢自學,還是很多語法與技巧需要加強。

    回覆刪除

張貼留言

較新的 較舊